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 ...