定义
其实就是一个 token,由 3 部分组成:header.payload.sign
。
header 部分
header 本身是一个 json 对象:
1 | { |
将这个 json 对象用 base64url 算法编码为字符串,放入 jwt 中。
payload 部分
同样是 json 对象,可以用于保存不敏感的数据。例如:
1 | { |
除此之外,这个 JSON 对象中还有其他 JWT 规定的字段。
和 header 部分一样,用 base64url 算法编码为字符串,放入 jwt 中。
sign 部分
将 header 部分和 payload 部分进行加密所得。伪代码如下:
1 | const data = base64url.encode(header) + "." + base64url.encode(payload); |
代码中出现的 secret 是加密所需的密钥,存放在服务端,不能泄漏。工程上一般通过配置中心下发。
场景
JWT 用于分布式用户身份认证。因为服务器是无状态的,所以非常方便扩展。
上图是交互流程:
- 用户携带 user 和 pwd 登录
- 登录成功后,服务端签发 JWT
- 之后用户每次请求都携带 JWT(通过
headers
字段) - 服务端对前端传来的 JWT 进行校验
校验逻辑:
- 解出 header、payload 和 sign
- 将 header 和 payload 加密,将加密结果与 sign 比较