为什么微服务架构里网关都是用 JWT 鉴权,而不是用 Session 鉴权?不是也有基于 Redis 实现的分布式 Session 吗?

2023-11-15 11:29:08 +08:00
 yodhcn
5000 次点击
所在节点    程序员
33 条回复
relsoul
2023-11-15 11:40:37 +08:00
没人回答来简单答答....

jwt 多方便啊,不用中心态维护,直接做校签就行。(当然你也可以用 redis 来维护 jwt )

只要微服务的配置中心的密钥一致,那么无论什么微服务都不用依赖 redis ,直接本地做校签,减少架构依赖性。不过某种意义上来说 jwt 也是一种 session ,去中心化的 session 。
wu00
2023-11-15 11:47:26 +08:00
即便是有中心化管理(踢人等)会话的需求,redis+jwt token 也比共享 session+cookie 简单好用;
如果不需要会话管理,无状态的 jwt token 就更好用了,而 session 还是必须做中心共享。
Chad0000
2023-11-15 11:53:43 +08:00
JWT 主要是为了本地就可以鉴权,否则这么多服务都请求中心的 Session ,性能是个问题。
sujin190
2023-11-15 12:04:41 +08:00
干掉 redis 可以省成本不好么。。虽然大型站要做风控并不能做到完全不在服务器保存数据,但是能省一点是一点吧

其实也就是服务器保存还是客户端保存的问题,客户端存储中小型站少个依赖简单便宜性能好又无需考虑风控,再加上各种框架库支持完善又跨语言跨平台跨集群使用广自然了,生态好也是优势啊而且是大优势,但也没说 JWT 就是完美无敌的吧,中大型站嘛自然是啥都要,区分也就不大了
Nazz
2023-11-15 12:14:08 +08:00
因为半桶水的人写了鉴权服务
dddd1919
2023-11-15 12:32:51 +08:00
不懂 JWT ,理解 JWT ,成为 Session
见过的很多用 JWT 并搞不清楚使用场景,还要像 Session 一样做缓存加校验,只把它当 Session id 一样使用
coderzhangsan
2023-11-15 12:42:49 +08:00
慢慢的你就会明白,大部分都会回到服务端鉴权,最终就是不伦不类的 JWT ,因为总有些需求,必须让你在服务端做鉴权服务,譬如单点登录,踢人等等。
yodhcn
2023-11-15 13:19:00 +08:00
@wu00 #2
- JWT 怎么做会话管理?
- 如果 JWT 会话管理需要依赖 Redis ,与直接用 Redis 做 token 校验有什么区别?优势体现在哪里?

能请老哥展开讲讲吗?不太了解 JWT
murmur
2023-11-15 13:24:46 +08:00
jwt 本质上和 session 没区别,一种实现形式而已,就那么多复杂的权限和用户信息你 token 想写多长?更别说现在安全要求强制踢下线的功能
murmur
2023-11-15 13:25:50 +08:00
@wu00 除非你不做数据权限,或者简单到行数据直接对应有权限的人,稍微复杂的权限都是得查表的,这权限可能还是实时变化
gitrebase
2023-11-15 13:27:50 +08:00
@dddd1919 老哥能讲讲吗,我现在用 JWT 就是在里面存一个 user id ,或者再存个 user role ,就不知道别的用法了
kkk9
2023-11-15 13:30:57 +08:00
Niphor
2023-11-15 13:42:10 +08:00
想法是好的,JWT 随着需求变来变去,最终就变成了为了完成 KPI ,退化为一个 Id 而已(变成了 Session )
Qjues
2023-11-15 13:43:06 +08:00
@yodhcn #8 楼 需要会话管理的,就不要用 jwt ,直接 token 就好了,之前公司就有团队新写的鉴权服务,又 jwt ,然后每次都再走一遍 redis token ,检查,不伦不类的。
1. session+cookie
2. jwt
3. redis
jwt+redis 个人认为真没啥意义。(当然在不同产品线上,可以有部分只用 jwt ,有部分加一层 redis 检查)
cowcomic
2023-11-15 17:00:20 +08:00
登录侧基本不用 jwt ,登录踢人,顺延登录时间等等这些东西单用 jwt 都不好弄,还得后台记录,跟 session 没啥区别,反而还要自己维护,包括多 jwt 之间的冲突,分布式 session 现在也很成熟,直接使用就行
现在 jwt 基本就只用在开放 API 做认证以及开放页面组件会面临跨域的情况下,这些场景是能体现 jwt 简单方便的一面的
afeiche
2023-11-15 17:33:03 +08:00
没有会话的话就做成那种带时间戳的 token ,有会话感觉还是用 session 靠谱
Conantv2
2023-11-15 17:34:55 +08:00
在部分场景 jwt 跟布隆过滤器作用类似,通过的不一定真的能通过,但是不通过的就一定不通过。

比如回复评论,单一 token 模式每个请求你都得查后端,用 jwt 的话在边缘脚本就可以先验签,无效签名和 jwt 中没有权限的可以直接拒绝,剩下的请求才打到后端,虽然剩下的也不一定有效的,还是要查库,但是查库请求大量降低了。
lambdaq
2023-11-15 17:40:04 +08:00
如果你要问两者优劣,楼下老哥可以给你洋洋洒洒一大篇

如果你要问为什么,那么一句话就可以结题了:因为培训班只教 jwt
nothingistrue
2023-11-15 17:42:39 +08:00
先想想 Session 是什么,微服务之间能不能有 Session 。
BeautifulSoap
2023-11-15 17:46:31 +08:00
jwt 等同于互联网古早时期直接在 cookie 里塞用户名/用户 id ,然后服务器获取 cookie 里的用户名/用户 id 后直接登录(当然用户名/id 相关字段是加密的)。它和 jwt 的区别也就 jwt 有效时间非常短,又有签名可以防篡改,除此之外缺点一模一样。比如因为非中心化,发出去的 cookie/jwt 你没法主动让其无效,只能干等着。生成 jwt 的密钥一旦泄露,攻击者就可以捏造任意的 jwt 登录任意账户而服务端没办法检验

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/992055

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX