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