协议概述
什么是 JSON Web Token?
JSON Web Token(JWT)是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准。该 token 被设计为紧凑且安全的,适用于分布式站点的单点登录(SSO)场景。
JWT 的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该 token 也可直接被用于认证,也可被加密。
JSON Web Token 结构是什么?
JWT 是由三段信息构成的,将这三段信息文本用.
链接一起就构成了 JWT 字符串
这三部分分别是:
- Header
- Payload
- Signature
输出是三个由.分隔的 Base64-URL 字符串编码值,如下:
Header
由 token 的类型(“JWT”)和算法名(例如 HMAC、SHA256 等)两部分组成 JSON 字符串(如下),并对该 JSON 字符传进行 Base64 编码,最终到 Header 信息。
{
"typ": "JWT",
"alg": "RS256"
}
Payload
即存放有效信息的地方,由多个声明字段组成的 JSON 字符串(如下),并对该 JSON 字符传进行 Base64 编码,最终到 Payload 信息。 这些有效信息包括:标准中注册的声明、自定义声明。其中,自定义声明,不应包括个人身份等敏感信息。标准中注册的声明为建议使用,但不强制使用,包括:
- iss:JWT 签发者
- sub:JWT 所面向的用户
- aud:接收 JWT 的一方
- exp:JWT 的过期时间,这个过期时间必须要大于签发时间
- nbf:定义在什么时间之前,该 JWT 都是不可用的
- iat:JWT 的签发时间
- jti:JWT 的唯一身份标识,主要用来作为一次性 token,从而回避重放攻击
{
"sub": "12345678",
"name": "Allen",
"admin": true
}
Signature
即签名信息,采用 Header 中指定的签名算法(alg),对(Base64 编码的 Header + "." + Base64 编码的 payload)计算签名信息(如下)。签名过程如需使用密钥,应提前生成指定算法的密钥,并存储于认证服务器。
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
var signature = HMACSHA256(encodedString, 'secret');
可以使用调试器 jwt.io 来进行解码、验证和生成 JWT。