JWT(Json Web Token)是一个经过加密的,包含用户信息的且具有时效性的固定格式字符串
JWT优点:
- 可以不用在服务端存储认证信息(比如:Token)
- 完全由客户端提供,服务端只要根据 JWT 自身提供的解密算法就可以验证用户合法性,而且这个过程是安全的
数据结构
JWT 是个字符串,由头部、载荷与签名这三部分组成,中间以
.
分隔

头部:
头部以 JSON 格式表示,用于指明令牌类型和加密算法
- 如下:表示使用 JWT 格式,加密算法采用 HS256
{
"alg": "HS256",
"typ": "JWT"
}
载荷:
用来存储服务器需要的数据,比如用户信息,例如姓名、性别、年龄等
- 重要的机密信息不要放到这里,比如密码等
{
"name": "周星驰",
"introduce": "英俊潇洒"
}
签名:
使用
HMACSHA256
算法计算得出,有两个参数,前一个参数是 (base64 编码的头部 + base64 编码的载荷)用点号相连后一个参数是自定义的字符串密钥,密钥不要暴露在客户端
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
Secret
)
使用方式
用户登录网站,输入用户名、密码登录,登录请求到达服务端,服务端对账号、密码进行验证
- 然后计算出 JWT 字符串,返回给客户端
客户端拿到这个 JWT 字符串后,存储到
Cookie
或者 浏览器的LocalStorage
中再次发送请求,比如请求用户设置页面的时候,在 HTTP 请求头中加入 JWT 字符串,或者直接放到请求主体中
服务端拿到这串 JWT 字符串后,使用
base64
的头部和base64
的载荷部分
- 通过
HMACSHA256
算法计算签名部分,比较计算结果和传来的签名部分是否一致
- 如果一致,说明此次请求没有问题,如果不一致,说明请求过期或者是非法请求


怎么保证安全性
保证安全性的关键是
HMACSHA256
或者与它同类型的加密算法
- 因为加密过程是不可逆的,所以不能根据传到前端的 JWT 传反解到密钥信息
不同的头部和载荷加密之后得到的签名都是不同的
- 如果有人改了载荷部分的信息,那最后加密出的结果肯定就和改之前的不一样的,最后验证的结果就是不合法的请求
JWT认证架构
方案一:网关统一校验:
方案二:应用认证方案: