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

Tags
webauth
Created
Jun 14, 2016 1:46 AM

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

JSON Web Key (JWK) ???

与 JWT 完全不一样, JWK 大概是这样:

{

"alg": "RS256",

"d": "FXwF77M1JjABdv9nPkGdLBGyV67JKSlzostESvjmfwenY809r3Cqmx6Zb3IDPPqe9O8uKwmcNPqenT1a9WUYQQ",

"e": "AQAB",

"n": "rZLKV6RBbr4YdSvfnE2ddyDFOBU71SnO5zlH5aeu9NbvgbdupVyZgkahPOTvICicJjRrMPOi6EV3yr5-5weslQ",

"kty": "RSA",

"use": "sig",

"kid": "123" // keyid

}

https://github.com/auth0/node-jsonwebtoken

http://blog.leapoahead.com/2015/09/06/understanding-jwt/

一个 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 中得到用户的状态

字段:https://www.iana.org/assignments/jwt/jwt.xhtml

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

SuperMade with Super