JSON Web Token (JWT) && JSON Web Key (JWK)

// JWT, JWS, JWE, JWK, and JWA

JWT 完全不一样, JWK 大概是这样:
{
"alg": "RS256",
"d": "FXwF77M1JjABdv9nPkGdLBGyV67JKSlzostESvjmfwenY809r3Cqmx6Zb3IDPPqe9O8uKwmcNPqenT1a9WUYQQ",
"e": "AQAB",
"n": "rZLKV6RBbr4YdSvfnE2ddyDFOBU71SnO5zlH5aeu9NbvgbdupVyZgkahPOTvICicJjRrMPOi6EV3yr5-5weslQ",
"kty": "RSA",
"use": "sig",
"kid": "123" // keyid
}



一个 JWT 实际上就是一个字符串,它由三部分组成,头部载荷签名

载荷(Payload),base64 编码下面的 JSON 对象:

  • iss: 该 JWT 的签发者 如: "mt"
  • sub: 该 JWT 所面向的用户,如:"[email protected]"
  • aud: 接收该 JWT 的一方,如:"www.example.com",
  • exp(expires): 什么时候过期,这里是一个Unix时间戳
  • iat(issued at): 在什么时候签发的
头部(Header)

JWT 还需要一个头部,头部用于描述关于该 JWT 的最基本的信息,例如其类型以及签名所用的算法等。这也可以被表示成一个 JSON 对象,也要进行 Base64 编码。

签名(签名)
将上面的两个编码后的字符串都用句号 . 连接在一起(头部在前),(服务器)再用 私有字符串 加密。
最后将这一部分签名也拼接在被签名的字符串后面,我们就得到了完整的 JWT

接收 jwt
服务器应用在接受到 JWT 再次以同样方法签名之后发现,自己计算出来的签名和接受到的签名不一样,那么就说明这个 Token 无效。token 有效则读取 jwt 中的负载,如 ID,过期时间
// 签名无法反运算成负载。

荷载可读,所以,在 JWT 中,不应该在载荷里面加入任何敏感的数据。

优点: 不需要在服务器存储每个用户的 token, 也不需要在服务器进行 token 的 io 操作,但是要进行转换格式、加密操作, 将session 信息全部放在 jwt 中。

// cookie/session 方案是服务器储存用户登陆的信息(服务器加密过的), 只要对客户端的cookie 解密就能验证用户, 并从 session 中得到用户的状态

jwt 不适合撤销需求:https://code-examples.net/zh-TW/q/1e70bdb