JWT 组成结构
JWT 的 token 由三段小数点分隔组成的字符串:header.payload.signature。
1. JWT header
头部包含两部分:声明类型和使用的哈希算法,通常直接使用HMAC SHA256,就是HS256。
{ "typ": "JWT", "alg": "HS256" }
将头部进行 Base64 编码构成第一部分。Base64 是一种用 64 个字符来表示任意二进制数据的方法,常用于在 URL、Cookie、网页中传输少量二进制数据。
2. JWT payload
也称为JWT claims,放置需要传输的信息,有三类:
- 保留claims,主要包括iss发行者、exp过期时间、sub主题、aud用户等。
- 公共claims,定义新创的信息,比如用户信息和其他重要信息。
- 私有claims,用于发布者和消费者都同意以私有的方式使用的信息。
JWT规定7个官方字段,供选用:
- iss (issuer):签发人。
- exp (expiration time):过期时间。
- sub (subject):主题。
- aud (audience):受众。
- nbf (Not Before):生效时间。
- iat (Issued At):签发时间。
- jti (JWT ID):编号。
支持定义私有字段,示例:
{ "iss": "jwt.io", "exp": 1496199995458, "name": "sinwaj", "role": "admin"," }
JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。
3. JWT signature
生成签名部分,需要准备:编码的 header、编码的 payload 和一个秘钥,签名算法是 header 指定的算法,然对这些数据进行签名。
签名公式如下:
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
其中:secret 为加密使用的盐,也可以认为是私钥,千万不能泄露。
4. 完整的 JWT
将 header、payload 和 signature 三部分用 . 连接成一个完整的字符串,构成了最终的 JWT:
例如:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
其中:
- eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 是 Base64 编码的 header。
- eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9 是 Base64 编码的 payload。
- TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ 是对 header、payload 的签名。
注意:secret 保存在服务器端,JWT 的生成也在服务器端,secret 用来进行 jwt 的签发和 jwt 的验证,它就是服务端的私钥。
所以,在任何场景下都不应该泄露出去。一旦客户端得知这个 secret,那就意味着客户端是可以自我签发 jwt。
下一章:JWT 工作流程
基于 Token 的身份认证是无状态的,服务器不会存储任何用户信息。没有会话信息意味着应用程序可以根据需要扩展和添加更多的机器,而不必担心用户登录在哪一台服务器上。 1. JWT 工作流程图 2. JW ...