JWT结构
- header:就包含了两部分,一个是你使用什么算法加密的,另一个是Token的类型,会使用Base64的算法进行编码。
// 通过Base64算法编译后的header:
// eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
{
"typ": "JWT",
"alg": "HS256"
}
我们会对头部进行base64编码,得到第一部分数据
- payload:载荷,就是一些有效数据,登录之后可以存放用户id之类的信息,因为采用Base64编码,可以被解码,所以不要放敏感信息。
payload也采用进行base64编码,我们会得到第二部分数据
- 最后是Signature,生成Signature的算法如下:
var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload);
HMACSHA256(encodedString, '!Q@#$%^%&');
Signature由 header 和 payload 经过 base64 编码后加 “盐”得到的。上面的 “盐”值为: “!Q@#$%^%&” ;
完整JWT令牌的样子:
Token验证流程
- 客户端提交账号和密码到服务端。
- 通过登录验证后,服务端响应由 JWT 生成的 Token 令牌。
- 客户端要访问服务器中其他资源,会在请求中带着 Token 到服务端。
- 服务端接收到请求之后,从 Token 中拿出 header 和 payload ,然后通过HS256算法将 header 和 payload 和 “盐” 值 进行计算得出内容,让计算出的内容与Token中的第三部分,也就是Signature去比较,如果一致则验证通过,反之则失败。