Maison > Article > interface Web > 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!