JWT(JSON Web Token)的整个算法流程主要基于其签名算法。以最常见的签名算法HS256(HMAC SHA256)为例,以下是详细的算法流程,涵盖编码、签名和验证过程:
-
编码
- 构造头部(Header):头部通常是一个包含令牌类型和签名算法的 JSON 对象,例如:
{
"alg": "HS256",
"typ": "JWT"
}
将其转换为 UTF-8 字符串,然后进行 Base64Url 编码。
- 构造载荷(Payload):载荷包含用户信息和其他声明(如过期时间、签发者等),也是一个 JSON 对象,例如:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,
"exp": 1516239022 + 3600
}
同样转换为 UTF-8 字符串并进行 Base64Url 编码。
- 组合编码后的头部和载荷:将编码后的头部和载荷用 "." 连接起来,形成一个字符串。
-
签名
-
生成签名:使用 HMAC SHA256 算法,以密钥(secret key)和上述连接后的字符串为输入,生成一个签名。公式如下:
signature = HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
将生成的签名进行 Base64Url 编码。
-
组合完整令牌:将编码后的头部、载荷和签名用 "." 连接起来,形成完整的 JWT 令牌。
-
验证
-
提取头部和载荷:从令牌中提取编码后的头部和载荷部分。
-
生成新的签名:使用相同的密钥和算法,对提取的头部和载荷部分重新生成签名。
-
比对签名:将新生成的签名与令牌中的签名部分进行比对,若一致则验证成功。