文章目录加载中

身份认证-JWT:JSON Web Token

# JSON Web Token

# 定义

其实就是一个 token,由 3 部分组成:header.payload.sign

# header 部分

header 本身是一个 json 对象:

{
  "alg": "hs256", // 加密算法
  "typ": "JWT" // 签名类型:就是jwt
}

将这个 json 对象用 base64url 算法编码为字符串,放入 jwt 中。

# payload 部分

同样是 json 对象,可以用于保存不敏感的数据。例如:

{
  "userName": "dongyuanxin"
}

除此之外,这个 JSON 对象中还有其他 JWT 规定的字段。

和 header 部分一样,用 base64url 算法编码为字符串,放入 jwt 中。

# sign 部分

将 header 部分和 payload 部分进行加密所得。伪代码如下:

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 比较

# 参考链接

本文来自心谭博客:xin-tan.com,经常更新web和算法的文章笔记,前往github查看目录归纳:github.com/dongyuanxin/blog