Json Web Token (JWT) 是一个开放标准(RFC 7519),它符合设计 Restful API 时的无状态原则,每一次从客户端向服务器发出的请求都是独立的。

JWT 由三个部分组成:Header、Payload 和 Signature,它是一个长字符串,每个子串之间不存在换行符,一般的格式是[Header].[Payload].[Signature]

Header 承载了两部分信息:类型和所使用的密码算法,例如

1
2
3
4
{
"alg": "HS256",
"typ": "JWT
}

Payload 存放了实际需要传递的数据,JWT 中所规定的 7 个可选用的常规字段如下,负载默认是不会进行加密的,所以不可以用来存放秘密信息

Field Name Desc
iss Issuer 签发人
exp Expiration Time 过期时间
sub Subject 主题
aud Audience 受众
nbf Not Before 生效时间
iat Issued At 签发时间
jti JWT ID 编号

Signature 是对前面两部分消息的签名,以避免数据被篡改,签名的密钥只有服务器知道,使用 Header 指定的签名算法来产生签名

1
HAMAC-SHA256(base64(header) + "." + base64(payload), secret)

客户端在通过认证后接收服务器返回的 JWT,将其存放在 cookie 或 localStorage 中,此后客户端会在与服务器的交互中都携带 JWT 以表明自身身份