


Analyse approfondie des principes et de l'utilisation de JWT (JSON Web Token)
Cet article vous apporte des connaissances pertinentes sur JWT. Il présente principalement qu'est-ce que JWT ? Quel est le principe et l’utilisation de JWT ? Pour ceux que cela intéresse, jetons un coup d’œil ci-dessous, j’espère que cela sera utile à tout le monde.
JSON Web Token
(en abrégé JWT) est actuellement la solution d'authentification inter-domaines la plus populaire. Cet article présente ses principes et son utilisation.
1. Les problèmes d'authentification inter-domaines
Les services Internet sont indissociables de l'authentification des utilisateurs. Le processus général est le suivant.
1. L'utilisateur envoie le nom d'utilisateur et le mot de passe au serveur.
2. Une fois la vérification du serveur réussie, les données pertinentes, telles que le rôle de l'utilisateur, l'heure de connexion, etc., seront enregistrées dans la session en cours.
3. Le serveur renvoie un session_id à l'utilisateur et l'écrit dans le cookie de l'utilisateur.
4. Chaque demande ultérieure de l'utilisateur transmettra le session_id au serveur via Cookie.
5. Le serveur reçoit le session_id, retrouve les données précédemment enregistrées et apprend ainsi l'identité de l'utilisateur.
Le problème avec ce modèle est que l'évolutivité n'est pas bonne. Bien entendu, il n'y a aucun problème avec une seule machine. S'il s'agit d'un cluster de serveurs ou d'une architecture orientée services inter-domaines, le partage des données de session est requis et chaque serveur peut lire la session.
Par exemple, le site Web A et le site Web B sont des services liés de la même entreprise. Il est désormais obligatoire que tant que l'utilisateur se connecte à l'un des sites Web, il se connecte automatiquement lorsqu'il visite un autre site Web. Comment y parvenir ?
Une solution consiste à conserver les données de session et à les écrire dans la base de données ou dans une autre couche de persistance. Après avoir reçu la demande, divers services demandent des données à la couche de persistance. L’avantage de cette solution est que la structure est claire, mais l’inconvénient est que la quantité de travail est relativement importante. De plus, si la couche de persistance échoue, ce sera un point de défaillance unique.
Une autre solution est que le serveur ne sauvegarde tout simplement pas les données de session. Toutes les données sont enregistrées sur le client et renvoyées au serveur pour chaque requête. JWT est un représentant de cette solution.
2. Le principe de JWT
Le principe de JWT est qu'une fois authentifié, le serveur génère un objet JSON et le renvoie à l'utilisateur, comme indiqué ci-dessous.
{ "姓名": "张三", "角色": "管理员", "到期时间": "2018年7月1日0点0分" }
À l'avenir, lorsque l'utilisateur communiquera avec le serveur, cet objet JSON sera renvoyé. Le serveur s'appuie uniquement sur cet objet pour identifier l'utilisateur. Afin d'empêcher les utilisateurs de falsifier les données, le serveur ajoutera une signature lors de la génération de cet objet (voir ci-dessous pour plus de détails).
Le serveur n'enregistre aucune donnée de session. En d'autres termes, le serveur devient apatride, ce qui facilite son extension.
3. La structure des données de JWT
Le JWT actuel est probablement comme celui-ci.
C'est une longue ficelle séparée en trois parties par un point (.) au milieu. Notez qu'il n'y a pas de saut de ligne à l'intérieur du JWT. Il est écrit sur plusieurs lignes juste pour faciliter l'affichage.
Les trois parties de JWT sont les suivantes.
En-tête (head)
Payload (payload)
Signature (signature)
Écrivez-le sur une seule ligne, comme indiqué ci-dessous.
Header.Payload.Signature
Ce qui suit présentera tour à tour ces trois parties.
3.1 Header
La partie Header est un objet JSON décrivant les métadonnées du JWT, généralement comme suit.
{ "alg": "HS256", "typ": "JWT" }
Dans le code ci-dessus, l'attribut alg représente l'algorithme de signature (algorithme), et la valeur par défaut est HMAC SHA256 (écrit HS256) ; l'attribut typ représente le type du jeton (jeton), et le jeton JWT est uniformément écrit comme JWT.
Enfin, convertissez l'objet JSON ci-dessus en une chaîne à l'aide de l'algorithme Base64URL (voir ci-dessous pour plus de détails).
3.2 Payload
La partie Payload est également un objet JSON, utilisé pour stocker les données réelles qui doivent être transférées. JWT spécifie 7 champs officiels pour la sélection.
iss (émetteur) : émetteur
exp (heure d'expiration) : heure d'expiration
sub (sujet) : sujet
aud (audience) : audience
nbf (Pas avant ) : Heure effective
iat (émis à) : heure d'émission
jti (ID JWT) : numéro
En plus des champs officiels, vous pouvez également définir des champs privés dans cette section. exemple .
{ "sub": "1234567890", "name": "John Doe", "admin": true }
Notez que JWT n'est pas crypté par défaut et peut être lu par n'importe qui, alors ne mettez pas d'informations secrètes dans cette section.
Cet objet JSON doit également être converti en chaîne à l'aide de l'algorithme Base64URL.
3.3 Signature
La partie Signature est la signature des deux premières parties pour éviter la falsification des données.
Tout d'abord, vous devez spécifier un secret. Cette clé est connue uniquement du serveur et ne peut pas être divulguée aux utilisateurs. Ensuite, utilisez l'algorithme de signature spécifié dans l'en-tête (la valeur par défaut est HMAC SHA256) pour générer une signature selon la formule suivante.
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。
3.4 Base64URL
前面提到,Header 和 Payload 串型化的算法是 Base64URL。这个算法跟 Base64 算法基本类似,但有一些小的不同。
JWT 作为一个令牌(token),有些场合可能会放到 URL(比如 api.example.com/?token=xxx)。Base64 有三个字符+、/和=,在 URL 里面有特殊含义,所以要被替换掉:=被省略、+替换成-,/替换成_ 。这就是 Base64URL 算法。
四、JWT 的使用方式
客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。
此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息Authorization字段里面。
Authorization: Bearer <token>
另一种做法是,跨域的时候,JWT 就放在 POST 请求的数据体里面。
五、JWT 的几个特点
(1)JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
(2)JWT 不加密的情况下,不能将秘密数据写入 JWT。
(3)JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
(4)JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
(5)JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
(6)为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。
推荐学习:《JavaScript视频教程》
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

La combinaison de golangWebSocket et JSON : réaliser la transmission et l'analyse des données Dans le développement Web moderne, la transmission de données en temps réel devient de plus en plus importante. WebSocket est un protocole utilisé pour établir une communication bidirectionnelle. Contrairement au modèle de requête-réponse HTTP traditionnel, WebSocket permet au serveur de transmettre activement des données au client. JSON (JavaScriptObjectNotation) est un format léger d'échange de données, concis et facile à lire.

MySQL5.7 et MySQL8.0 sont deux versions différentes de la base de données MySQL. Il existe quelques différences principales entre elles : Améliorations des performances : MySQL8.0 présente quelques améliorations de performances par rapport à MySQL5.7. Ceux-ci incluent de meilleurs optimiseurs de requêtes, une génération de plans d'exécution de requêtes plus efficaces, de meilleurs algorithmes d'indexation et des requêtes parallèles, etc. Ces améliorations peuvent améliorer les performances des requêtes et les performances globales du système. Prise en charge JSON : MySQL 8.0 introduit la prise en charge native du type de données JSON, y compris le stockage, la requête et l'indexation des données JSON. Cela rend le traitement et la manipulation des données JSON dans MySQL plus pratiques et efficaces. Fonctionnalités de transaction : MySQL8.0 introduit de nouvelles fonctionnalités de transaction, telles que l'atome

Les méthodes d'optimisation des performances pour la conversion des tableaux PHP en JSON incluent : l'utilisation d'extensions JSON et de la fonction json_encode() ; l'ajout de l'option JSON_UNESCAPED_UNICODE pour éviter l'échappement de caractères ; l'utilisation de tampons pour améliorer les performances d'encodage de boucle et l'utilisation d'un tiers ; Bibliothèque d'encodage JSON.

La gestion des formats de données XML et JSON dans le développement C# nécessite des exemples de code spécifiques. Dans le développement de logiciels modernes, XML et JSON sont deux formats de données largement utilisés. XML (Extensible Markup Language) est un langage de balisage permettant de stocker et de transmettre des données, tandis que JSON (JavaScript Object Notation) est un format d'échange de données léger. Dans le développement C#, nous devons souvent traiter et exploiter des données XML et JSON. Cet article se concentrera sur la façon d'utiliser C# pour traiter ces deux formats de données et les attacher.

Utilisez la fonction json.MarshalIndent dans Golang pour convertir la structure en une chaîne JSON formatée. Lors de l'écriture de programmes dans Golang, nous avons souvent besoin de convertir la structure en chaîne JSON. Dans ce processus, la fonction json.MarshalIndent peut nous aider à implémenter. sortie formatée. Ci-dessous, nous expliquerons en détail comment utiliser cette fonction et fournirons des exemples de code spécifiques. Commençons par créer une structure contenant des données. Ce qui suit est une indication

Démarrage rapide : méthode Pandas de lecture des fichiers JSON, des exemples de code spécifiques sont requis Introduction : Dans le domaine de l'analyse des données et de la science des données, Pandas est l'une des bibliothèques Python importantes. Il fournit des fonctions riches et des structures de données flexibles, et peut facilement traiter et analyser diverses données. Dans les applications pratiques, nous rencontrons souvent des situations où nous devons lire des fichiers JSON. Cet article expliquera comment utiliser Pandas pour lire des fichiers JSON et joindra des exemples de code spécifiques. 1. Installation de Pandas

Les annotations dans la bibliothèque Jackson contrôlent la sérialisation et la désérialisation JSON : Sérialisation : @JsonIgnore : Ignorer la propriété @JsonProperty : Spécifiez le nom @JsonGetter : Utilisez la méthode get @JsonSetter : Utilisez la méthode set Désérialisation : @JsonIgnoreProperties : Ignorez la propriété @ JsonProperty : Spécifiez le nom @JsonCreator : utilisez le constructeur @JsonDeserialize : logique personnalisée

L'utilisation de la fonction json_encode() de PHP pour convertir un tableau ou un objet en chaîne JSON et formater la sortie peut faciliter le transfert et l'échange de données entre différentes plates-formes et langages. Cet article présentera l'utilisation de base de la fonction json_encode() et comment formater et générer une chaîne JSON. 1. Utilisation de base de la fonction json_encode() La syntaxe de base de la fonction json_encode() est la suivante : stringjson_encod
