ASP.NET Core 标识(Identity)框架系列(四):闲聊 JWT 的缺点,和一些解决思路

server/2024/11/9 18:53:57/

iamge

前言

前面的几篇文章讲了很多 JWT 的优点,但作为技术人员都知道,没有一种技术是万能的 “银弹”,所谓有矛就有盾,相比 Session、Cookie 等传统的身份验证方式,JWT 在拥有很多优点的同时,也有着不可忽视的缺点,比如:

JWT 的缺点

无法撤销

一旦 JWT 被发放给客户端,在有效期内这个 Token 就一直有效,无法被提前撤回

体积大,吃带宽

JWT 中包含了一些额外的信息,可能会使得 JWT 体积较大,增加网络传输开销

安全性比较差

JWT 中的信息是以明文形式存储的,容易被破解

一些解决的思路

1. 无法撤销 的解决思路

  1. 在用户表中增加一个整数类型的列 JWTVersion,它代表最后一次发放出去的令牌的版本号;
  2. 每次登录、发放令牌的时候,都让 JWTVersion 的值自增,同时将 JWTVersion 的值也放到 JWT 的负载中;
  3. 当执行禁用用户、撤回用户的令牌等操作的时候,让这个用户对应的 JWTVersion 的值自增;
  4. 当服务器端收到客户端提交的 JWT 后,先把 JWT 中的 JWTVersion 值和数据库中的 JWTVersion 值做比较,如果 JWT 中 JWTVersion 的值小于数据库中 JWTVersion 的值,就说明这个 JWT 过期了,这样就实现了 JWT 的撤回机制。

总结:
这个方案在用户表中保存了 JWTVersion 值,因此它本质上仍然是在服务器端保存状态,这是绕不过去的,它算是一种缺点比较少的妥协方案,相类似的方案还有比如维护一个 Token 黑名单的办法,相对步骤比较多

2. 体积大,吃带宽 的解决思路

  1. 精简 JWT 中的信息,只存储必要的信息。将一些非敏感且不经常变动的信息存储在服务端,而不是每次都包含在JWT中

  2. 设置较短的 JWT 过期时间,减少 JWT 的有效期,从减小 JWT 的体积

  3. 传输时对 JWT 进行压缩,减小 JWT 的大小,常见的压缩算法包括 GZIP 和 DEFLATE

  4. 在使用对称加密算法时,可以选择较小的密钥长度,减小 JWT 的大小

  5. 选择更高效的加密算法和签名算法,减小 JWT 的大小

  6. 定期清理过期的 JWT,避免过多无效 JWT 的存储占用带宽

3. 安全性比较差 的解决思路

  1. 不在 JWT 中存储敏感信息,如密码等,降低信息泄露的风险
  2. 将 JWT 中的信息放在 Redis 上,Token 只放相应的 key,服务端拿到 token 后,再到 Redis 取具体的信息并反序列化为对象

http://www.ppmy.cn/server/6501.html

相关文章

nginx访问路径映射服务器资源文件

当我们需要用直接通过url访问服务器上的静态资源(如HTML、CSS、JavaScript、图片、视频等文件),而服务器本身没有fastDFS等文件分布式系统时,我们可以通过nginx配置文件目录映射来达到该效果。这种映射通常通过配置location指令来…

mac安装nvm详细教程

0. 前提 清除电脑上原有的node (没有装过的可以忽略)1、首先查看电脑上是否安装的有node,查看node版本node -v2、如果有node就彻底删除nodesudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*}2、保证自己的电脑上有安装git,不然下载n…

又来!黄金主题LOF(161116)溢价40%开放申购,拖拉机都开冒烟了!

查看基金公告,黄金主题LOF(161116)下周一(4月22号)开放申购,限额100元,目前溢价40%,可以一拖七套利。 这熟悉的配方,这熟悉的套路!一个月前的今天,我好像在标普500LOF上见过。又是易方达这个狗基…

竞赛 基于LSTM的天气预测 - 时间序列预测

0 前言 🔥 优质竞赛项目系列,今天要分享的是 机器学习大数据分析项目 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/po…

liteide 找不到 go 路径错误修复

在配置文件:C:\Users\iwlb\AppData\Roaming\liteide\liteide.ini中修改 [liteenv] currentenvidwin64 改为 [liteenv] currentenvidsystem 启动脚本: set GO111MODULEoff set GOROOTM:\work\tool\go1.21.2.windows-amd64 set GOPATHM:\work\code\go set PATHM:\…

python用循环新建多个列表

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 当我们处理数据时,有时候需要创建多个列表以存储不同类型或不同条件下的数据。在…

Java web应用性能分析之客户端慢

客户端慢的原因包括: 终端设备老化(手机、PAD、电脑年限久远、运行期间产生了很多垃圾未清除)终端网络设备老化(路由器、交换机老化)跟我们使用的手机一样,路由器也需要及时更新换代,否则硬件跟…

新手理解Hugging Face:与Docker Hub对比,理解Hugging Face到底是啥东西

可以将Hugging Face类比为Docker Hub,但它们之间有一些关键区别。我们将分别解释它们的相似之处和不同之处。 相似之处: 集中存储:Hugging Face Hub和Docker Hub都是集中式存储库,提供了一个可供用户查找、分享和使用的模型或镜…