1
relsoul 2023-11-15 11:40:37 +08:00
没人回答来简单答答....
jwt 多方便啊,不用中心态维护,直接做校签就行。(当然你也可以用 redis 来维护 jwt ) 只要微服务的配置中心的密钥一致,那么无论什么微服务都不用依赖 redis ,直接本地做校签,减少架构依赖性。不过某种意义上来说 jwt 也是一种 session ,去中心化的 session 。 |
2
wu00 2023-11-15 11:47:26 +08:00 1
即便是有中心化管理(踢人等)会话的需求,redis+jwt token 也比共享 session+cookie 简单好用;
如果不需要会话管理,无状态的 jwt token 就更好用了,而 session 还是必须做中心共享。 |
3
Chad0000 2023-11-15 11:53:43 +08:00
JWT 主要是为了本地就可以鉴权,否则这么多服务都请求中心的 Session ,性能是个问题。
|
4
sujin190 2023-11-15 12:04:41 +08:00
干掉 redis 可以省成本不好么。。虽然大型站要做风控并不能做到完全不在服务器保存数据,但是能省一点是一点吧
其实也就是服务器保存还是客户端保存的问题,客户端存储中小型站少个依赖简单便宜性能好又无需考虑风控,再加上各种框架库支持完善又跨语言跨平台跨集群使用广自然了,生态好也是优势啊而且是大优势,但也没说 JWT 就是完美无敌的吧,中大型站嘛自然是啥都要,区分也就不大了 |
5
Nazz 2023-11-15 12:14:08 +08:00 via Android
因为半桶水的人写了鉴权服务
|
6
dddd1919 2023-11-15 12:32:51 +08:00 2
不懂 JWT ,理解 JWT ,成为 Session
见过的很多用 JWT 并搞不清楚使用场景,还要像 Session 一样做缓存加校验,只把它当 Session id 一样使用 |
7
coderzhangsan 2023-11-15 12:42:49 +08:00 4
慢慢的你就会明白,大部分都会回到服务端鉴权,最终就是不伦不类的 JWT ,因为总有些需求,必须让你在服务端做鉴权服务,譬如单点登录,踢人等等。
|
8
yodhcn OP @wu00 #2
- JWT 怎么做会话管理? - 如果 JWT 会话管理需要依赖 Redis ,与直接用 Redis 做 token 校验有什么区别?优势体现在哪里? 能请老哥展开讲讲吗?不太了解 JWT |
9
murmur 2023-11-15 13:24:46 +08:00
jwt 本质上和 session 没区别,一种实现形式而已,就那么多复杂的权限和用户信息你 token 想写多长?更别说现在安全要求强制踢下线的功能
|
11
gitrebase 2023-11-15 13:27:50 +08:00
@dddd1919 老哥能讲讲吗,我现在用 JWT 就是在里面存一个 user id ,或者再存个 user role ,就不知道别的用法了
|
12
kkk9 2023-11-15 13:30:57 +08:00
@gitrebase #11 建议查阅 https://jwt.io/introduction
|
13
Niphor 2023-11-15 13:42:10 +08:00
想法是好的,JWT 随着需求变来变去,最终就变成了为了完成 KPI ,退化为一个 Id 而已(变成了 Session )
|
14
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 检查) |
15
cowcomic 2023-11-15 17:00:20 +08:00
登录侧基本不用 jwt ,登录踢人,顺延登录时间等等这些东西单用 jwt 都不好弄,还得后台记录,跟 session 没啥区别,反而还要自己维护,包括多 jwt 之间的冲突,分布式 session 现在也很成熟,直接使用就行
现在 jwt 基本就只用在开放 API 做认证以及开放页面组件会面临跨域的情况下,这些场景是能体现 jwt 简单方便的一面的 |
16
afeiche 2023-11-15 17:33:03 +08:00
没有会话的话就做成那种带时间戳的 token ,有会话感觉还是用 session 靠谱
|
17
Conantv2 2023-11-15 17:34:55 +08:00
在部分场景 jwt 跟布隆过滤器作用类似,通过的不一定真的能通过,但是不通过的就一定不通过。
比如回复评论,单一 token 模式每个请求你都得查后端,用 jwt 的话在边缘脚本就可以先验签,无效签名和 jwt 中没有权限的可以直接拒绝,剩下的请求才打到后端,虽然剩下的也不一定有效的,还是要查库,但是查库请求大量降低了。 |
18
lambdaq 2023-11-15 17:40:04 +08:00
如果你要问两者优劣,楼下老哥可以给你洋洋洒洒一大篇
如果你要问为什么,那么一句话就可以结题了:因为培训班只教 jwt |
19
nothingistrue 2023-11-15 17:42:39 +08:00
先想想 Session 是什么,微服务之间能不能有 Session 。
|
20
BeautifulSoap 2023-11-15 17:46:31 +08:00
jwt 等同于互联网古早时期直接在 cookie 里塞用户名/用户 id ,然后服务器获取 cookie 里的用户名/用户 id 后直接登录(当然用户名/id 相关字段是加密的)。它和 jwt 的区别也就 jwt 有效时间非常短,又有签名可以防篡改,除此之外缺点一模一样。比如因为非中心化,发出去的 cookie/jwt 你没法主动让其无效,只能干等着。生成 jwt 的密钥一旦泄露,攻击者就可以捏造任意的 jwt 登录任意账户而服务端没办法检验
|
21
fcfangcc 2023-11-15 17:50:31 +08:00
@nothingistrue 外部请求在网关层就已经吧 session/cookie 转化成用户信息存在后续 rpc 的 context 中了,内部的微服务之间只需要从 context 拿需要的用户信息就行,为啥要去访问 session ?
|
22
qW7bo2FbzbC0 2023-11-15 17:54:25 +08:00
楼上说的对,是这样的,内部信赖环境,服务之间互相用一用挺方便的。
|
23
aogg 2023-11-15 17:56:52 +08:00
jwt 也可以主动失效,根据 jwt 里的时间即可
|
24
IvanLi127 2023-11-15 18:20:55 +08:00 via Android
能减少调用啊,jwt 直接本地就能验证,session 不得在线验证?
|
25
mmdsun 2023-11-15 18:39:50 +08:00 via iPhone
session 也能不需要 cookie ,Header 传值就行。
比如:spring redis session 项目,而且集成也超级简单。 jwt+redis 只能管理会话可以用黑名单,不然和 session 没区别了 |
26
zoharSoul 2023-11-15 18:43:12 +08:00
你用 session app 咋办?
|
27
dddd1919 2023-11-15 22:29:44 +08:00
@gitrebase JWT 就是一个加解密的算法实现,可以不同服务使用同一套算法和配置完成去中心认证,另外按照约定可以带一节明文信息,这是优势。
优势在具体使用场景,甚至更多场景下看就是不足,比如改密码要让已发放的 JWT token 失效,或者强制将 token 踢下线,这种 JWT 算法无法控制,如果加上逻辑层的控制比如黑名单这种,在多机环境下,那就跟 session 机制没有任何区别了。业务系统一般对会话都有些限制要求,出于可控性考虑,session 会更为通用 |
28
aragakiyuii 2023-11-15 22:54:35 +08:00 via iPhone
把它当成字符串用就没区别
session 能干的 jwt 也能干,jwt 能干的 session 干不了,就看你想不想多写点生成 jwt 和解析 jwt 的代码了 |
30
kaneg 2023-11-16 12:09:32 +08:00
一般来说对于 web 网站,http session 用起来比较简单,但也存在几个问题:
1 )因为是基于 cookie 的,在浏览器里不能跨域,不适应完全没有隶属关系的多域名场景 2) 对业务数据有写操作的 API 要加 CSRF header 防攻击 |
31
PVXLL 2023-11-16 13:02:05 +08:00 via iPhone
很多菜鸡把 jwt 当 sessionkey 来使用脱裤子放屁
|
32
justdoit123 2023-11-16 15:08:01 +08:00
看到 2 楼喷 session+cookie 我就想笑。
Web 场景下,你 jwt 放哪里?不还是得放在 http-only + secure 的 cookie 里? 什么?你不放 cookie 里,你要放在 localStorage 里?注入的 js 攻击分分钟偷走你的宝贝 jwt 。 |
33
llwwbb7 2023-11-16 19:38:27 +08:00
jwt 是一个具体的实现
session 是个什么玩意,为什么好像人人都知道? |