ASP.NET Core 标识(Identity)框架系列(四):闲聊 JWT 的缺点,和一些解决思路
1.看看 Asp.net core Webapi 项目如何优雅地使用分布式缓存2.Asp.net core Webapi 如何执行定时任务?3.试试这 6 个小技巧,提升 EF Core 性能4.C# 完美实现物联网 MQTT 数据通信5.Asp.net Webapi 的 Post 方法不能把参数加到 URL 中?试试这样写6.如何在 ASP.NET Core Web API 方法执行前后 “偷偷“ 作一些 “坏“ 事?初识 ActionFilterAttribute7.在 ASP.NET Core Web API 中使用异常筛选器捕获和统一处理异常8.操作筛选器的 1 个应用实例:自动启用事务9.并发请求太多,服务器崩溃了?试试使用 ASP.NET Core Web API 操作筛选器对请求进行限流10.一个简单的 ASP.NET Core 依赖注入例子,提高代码的可维护性和可扩展性11.由一个业务需求引发的对 ASP.NET 全局变量的调研及结果12.服务注册自治,降低 ASP.NET Core Web API 依赖注入的耦合度和复杂度13.ASP.NET Core 标识(Identity)框架系列(一):如何使用 ASP.NET Core 标识(Identity)框架创建用户和角色?14.ASP.NET Core 标识(Identity)框架系列(二):使用标识(Identity)框架生成 JWT Token15.ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
16.ASP.NET Core 标识(Identity)框架系列(四):闲聊 JWT 的缺点,和一些解决思路
前言
前面的几篇文章讲了很多 JWT 的优点,但作为技术人员都知道,没有一种技术是万能的 "银弹",所谓有矛就有盾,相比 Session、Cookie 等传统的身份验证方式,JWT 在拥有很多优点的同时,也有着不可忽视的缺点,比如:
JWT 的缺点
无法撤销
一旦 JWT 被发放给客户端,在有效期内这个 Token 就一直有效,无法被提前撤回
体积大,吃带宽
JWT 中包含了一些额外的信息,可能会使得 JWT 体积较大,增加网络传输开销
安全性比较差
JWT 中的信息是以明文形式存储的,容易被破解
一些解决的思路
1. 无法撤销 的解决思路
- 在用户表中增加一个整数类型的列 JWTVersion,它代表最后一次发放出去的令牌的版本号;
- 每次登录、发放令牌的时候,都让 JWTVersion 的值自增,同时将 JWTVersion 的值也放到 JWT 的负载中;
- 当执行禁用用户、撤回用户的令牌等操作的时候,让这个用户对应的 JWTVersion 的值自增;
- 当服务器端收到客户端提交的 JWT 后,先把 JWT 中的 JWTVersion 值和数据库中的 JWTVersion 值做比较,如果 JWT 中 JWTVersion 的值小于数据库中 JWTVersion 的值,就说明这个 JWT 过期了,这样就实现了 JWT 的撤回机制。
总结:
这个方案在用户表中保存了 JWTVersion 值,因此它本质上仍然是在服务器端保存状态,这是绕不过去的,它算是一种缺点比较少的妥协方案,相类似的方案还有比如维护一个 Token 黑名单的办法,相对步骤比较多
2. 体积大,吃带宽 的解决思路
-
精简 JWT 中的信息,只存储必要的信息。将一些非敏感且不经常变动的信息存储在服务端,而不是每次都包含在JWT中
-
设置较短的 JWT 过期时间,减少 JWT 的有效期,从减小 JWT 的体积
-
传输时对 JWT 进行压缩,减小 JWT 的大小,常见的压缩算法包括 GZIP 和 DEFLATE
-
在使用对称加密算法时,可以选择较小的密钥长度,减小 JWT 的大小
-
选择更高效的加密算法和签名算法,减小 JWT 的大小
-
定期清理过期的 JWT,避免过多无效 JWT 的存储占用带宽
3. 安全性比较差 的解决思路
- 不在 JWT 中存储敏感信息,如密码等,降低信息泄露的风险
- 将 JWT 中的信息放在 Redis 上,Token 只放相应的 key,服务端拿到 token 后,再到 Redis 取具体的信息并反序列化为对象
往期精彩
- C# 静态类,高手不想让你知道的 15 个真相
- 封装一个 C# 范围判断函数,从此告别重复编写范围判断代码的烦恼
- 用 C# Stopwatch 计时,让代码性能飞起来!
- 轻装上阵,Visual Studio LocalDB:.NET 程序员的本地数据库神器
- 封装一个C#万能基础数据类型转换器,一招解决所有基础类型转换烦恼
- 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
- 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
- C# AutoMapper 10个常用方法总结
- C# 7个方法比较两个对象是否相等
- C# 去掉字符串最后一个字符的 4 种方法
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
2023-12-27 不会使用 EF Core 的 Code First 模式?来看看这篇文章,手把手地教你