Skip to content

JWT

Updated View as Markdown

Introduce JWT

JWT 是 JSON Web Token 的缩写,一种对于服务器完全无状态的身份认证方式。

这是一个开放标准1,用户登录后,每个后续请求都将包含 JWT,允许用户访问该令牌允许的路由、服务和资源。

单点登录是一项如今广泛使用 JWT 的功能,其开销小,并且能够在不同领域轻松使用。

在身份验证中,当用户成功使用其凭据登录时,将返回一个 JWT。

如何工作

通常用户名和加盐哈希运算后的密码会被 POST 到登录端点,服务器进行核对,如果正确,就会签发 JWT.

JWT 结构

JWT 由三个部分组成,并用点分隔.

xxxx.yyyy.zzzz

分别对应头部,载荷和签名。

头部

头部通常由两个部分组成:令牌的类型(即 JWT)和所使用的签名算法,例如 HMAC SHA256 或 RSA。

{
  "alg": "HS256",
  "typ": "JWT"
}

载荷

令牌的第二部分是有效载荷,其中包含所有用于标记的信息。通常包括但不限于:

  • 签发时间
  • 签发者
  • 过期时间
  • 权限

例如

{
  "name": "Linserin Yang",
  "admin": true,
  "iat": 1516239022
}

签名

要创建签名部分,需要取一下信息:

  • 头部
  • 载荷
  • 仅存储在服务器的密钥
  • 在头中指定的算法。

例如,如果要使用 HMAC SHA256 算法,将按照以下方式创建签名:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

计算结果就是 Token.

局限性

JWT 完全对服务器无状态,也就无法做到会话管理。唯一能够登出会话的方式是更换存储于服务器的密钥。而这也意味着是所有会话全部失效,不能登出特定的会话。

尽管有 Refresh Token 和 Access Token 配合等设计,但这也就引入状态了。

Footnotes

  1. RFC 7519 JSON Web Token (JWT) | jwt.io ↩


Navigation

Type to search…

↑↓ navigate↵ selectEsc close