JWT

月伴飞鱼 2024-08-12 19:03:26
框架相关
支付宝打赏 微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者!

JWT(Json Web Token)是一个经过加密的包含用户信息的且具有时效性的固定格式字符串

JWT优点:

  • 可以不用在服务端存储认证信息(比如:Token)
  • 完全由客户端提供,服务端只要根据 JWT 自身提供的解密算法就可以验证用户合法性,而且这个过程是安全的

数据结构

JWT 是个字符串,由头部载荷签名这三部分组成,中间以.分隔

997EDE1C-5689-4C3F-98E8-25C25BBEC3FC

头部:

头部以 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算法计算签名部分,比较计算结果和传来的签名部分是否一致
    • 如果一致,说明此次请求没有问题,如果不一致,说明请求过期或者是非法请求
img img

怎么保证安全性

保证安全性的关键是 HMACSHA256 或者与它同类型的加密算法

  • 因为加密过程是不可逆的,所以不能根据传到前端的 JWT 传反解到密钥信息

不同的头部和载荷加密之后得到的签名都是不同的

  • 如果有人改了载荷部分的信息,那最后加密出的结果肯定就和改之前的不一样的,最后验证的结果就是不合法的请求

JWT认证架构

方案一:网关统一校验:

image-20221114215326634

方案二:应用认证方案:

image-20221114221411497

支付宝打赏 微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者!