JWT(JSON Web Tokens)
https://jwt.io/
JWT结构
JWT是一串加密后的字符串,通过.将字符串依次分割成三个部分
- Header
- Payload
- Signature
下面用一个案例来解释每个部分所代表的意义
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Header
通过Base64加密,用来描述JWT的元信息
解密后的内容
{
"alg": "HS256", // 签名的算法,默认算法为HS256
"typ": "JWT" // 令牌的类型
}
Payload
也是通过Base64加密,用来描述要传递的数据和信息
解密后的内容
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
官方为Payload提供了一些字段供使用,同时用户也可以添加自定义字段
- iss(issuer):签发人
- sub(subject):主题
- aud(audience):受众
- exp(expiration time):过期时间
- nbf(not before):生效时间
- iat(issued at):签发时间
- jti(jwt id):编号
Signature
由于前两部分的内容都是通过Base64加密的,这样在传输的过程中就很容易解密拿到里面的内容,为了防止篡改,所以添加一段数字签名用来校验内容是否被篡改过
加密时需要提供一个秘钥
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
your-256-bit-secret
)
JWT工作方式

JWT优点
- 因为token存在客户端,服务器只需要解码,所以不占用服务器空间
- 服务器容易扩展
- 具有签名验证,防止篡改
JWT缺陷
- 无法主动让token失效
- 数据延迟:用户信息更新后,如果用户使用之前的token,那么服务器获取到的仍是用户信息
- 内容透明,不适合放敏感数据
- token包含的内容多,比sessionid占用更多网络带宽
本文使用 mdnice 排版