JSON WEB Token,是一种基于JSON的、用于在网络上声明某种主张的令牌(token)。JWT通常由三部分组成: 头信息(header), 消息体(payload)和签名(signature),token通常放在Authorization header中
结构
JSON Web Token由三部分组成,它们之间用圆点(.)连接,三部分分别使用Base64URL算法加密。
- Header
- Payload
- Signature
Header
header由两部分组成:
-
token的类型(“JWT”)
-
算法名称(如:HMAC SHA256或者RSA等等)
{ "alg": "HS256", "typ": "JWT" }
Payload
Payload部分也是一个JSON对象,用于存放服务端与客户端需要传递的用户登录信息,JWT规定了7个官方字段供选用,也可自定义字段
官方定义字段
- iss (issuer):签发人
- exp (expiration time):过期时间
- sub (subject):主题
- aud (audience):受众
- nbf (Not Before):生效时间
- iat (Issued At):签发时间
- jti (JWT ID):编号
JWT默认是不加密的,所以不要存放敏感信息
Signature
Signature部分是对前两部分的加密签名,防止数据被篡改,服务器生成一个密钥并使用Header里指定的签名算法对前两部分加密生成签名,如果使用非对称加密还可以验证JWT的发送方是否为同一个客户端
优点
- 不仅可以认证,也可以交换信息,如果JWT中包含足够多的必需数据,就可以减少一部分权限相关的数据库查询
- 所有认证信息由客户端保存而非服务端,便于服务端横向拓展
缺点
- 除了等到过期时间到,无法作废已颁布的令牌(因为所有认证信息存在客户端)
- 将敏感的认证相关信息放在了客户端本地的cookie或者Local Storage中