有没有感觉现在的 JWT 都被滥用了。
- 0次
- 2021-06-02 16:24:25
- idczone
JWT 本身只适合于无状态的场景,结果现在越来越多的人要用 JWT,然后还要求能吊销 token,这样不是服务端国外服务器要保存相关信息吗?那还不如直接用 cookie+session,前端端分离项目没法用的话,完全可以自己造轮子,随机生成一个 UUID 作为 token,会话保存在 redis 中。
强行追新,半路掉头
验证 JWT 时间戳,如过期直接失败,可以减少一次查 session 的操作
是的,有这种感觉
有个好处是 JWT 想踢人的话做黑名单至少能比 session 的办法少存很多东西,只需要存着黑名单内的值就行
主要是现在互联网滥用组件的风气太盛。
仿佛只有自己写的轮子是屎山,引用一大坨第三方库、框架就不是屎山一样。
除了 “无状态” 更适合讲故事之外,把 “状态” 保存在 Token 里比保存在 Redis / Memory 里要简单很多,这属于实现上的考量。而且就本质来说 JWT 没有对 “状态” 这件事任何规定和限制,其本身只是一种数据格式而已,所以在实现上甚至可以把 Session ID 放在 JWT 里,把 JWT 当 Cookie 用,这都是很正常的场景,不能算是滥用。
不过要求 Revoke Token 的话显然就又完全地回到 “有状态” 的场景中了,相当于要把 “有状态” 的东西重新发明一遍,只能说折腾万岁了。
token+session 不可以吗
本来就不用 jwt 做 token,有缺陷的
jwt 的逻辑跟 session 一模一样的, session 是服务器返回一串身份标识符, 客户端保存到本地, 后续每次调用都带上这个标识符.
jwt 也是服务器返回一串身份标识符, 客户端保存到本地, 后续每次调用都带上这个标识符.
唯一区别就是后续每次调用, jwt 时放在 header 里带过去, session 是放在 cookie 里带过去.
明明是一模一样的东西, 偏偏还要吹牛逼弄个新概念出来.
说什么 jwt 服务端不用保存状态, session 你也可以不用保存状态啊. 不用容器自动生成的 uuid 作为身份标识符, 按照 jwt 方式将用户身份标识等等数据加密后发回到 cookie 就好了.
纯粹就是重复造轮子, 面向 KPI 编程
好奇问一下,前后端分离 cookie 不能用是什么场景?前后端走完全不一样的域名?…
前后端分离项目会涉及跨域问题,不能用 cookie
JWT 最大的优点是无状态,只要密钥一致就能认证。同时,最大的弱点也是无状态。所以,需要 token 有状态的场景,使用 JWT 就是滥用。那些用户信息、授权信息放在服务端不香吗?放 token 里面除了增加体积,还能有什么好处?认证的时候反正都能获取到,获取后另外放在请求头里面不好吗?至少不需要担心数据被篡改,token 也不需要加密,加解密什么的,不需要额外的运算和时间的吗?
JWT 只是个 “刀”,用得好坏取决于用它的人,不取决于它。被滥人用、被滥用,这俩应该还是有区别的吧。
建议用 JWT 之前,先上 https://jwt. io 去看一眼。JWT 的全称是 JSON Web Tokens,它只是个 Tokens,是“安全”的“认证”的“环节”的一种实现手段。把 JWT 等同于安全控制的人,非蠢即坏。
以前找开源系统看源码都挺正常的,现在基本上很多搜到的,动不动就是 JWT 。 刚刚回答的另外一个 问 JWT 的,反正我是不建议 业务系统走 JWT 。 正常的 类似于 session 的 token 不香嘛,还有 分布式 session 。
有兴趣可以去看看,我就不 copy 了。
我去,这个快捷键老是按成 发送。
https://www.v2ex.com/t/774028#r_10487840
去看了,觉得你说的挺有道理,jwt 确实应用场景挺狭窄的,我其实也不是说不要用这个,而是要找到合适的场景。
是的,我记得还有个场景也挺适合的 淘宝(网页版,或者阿里云网页版,当然仅仅是猜测) 在登陆后,过一段时间,来浏览网页的时候,右上角是登陆状态,并且有昵称的。 可以进行正常的 非敏感 操作的浏览,一旦涉及到 稍微敏感点的操作的时候,就会要求重新登陆。
目测(在线猜测)这个是类似于 双 token 模式,即 jwt token + session token 的模式。session token 的生命周期可能浏览器关掉就结束了,或者 无操作 2 小时之类的就结束了。 jwt token 的生命周期可能为 2 天之类的,其中内部保存着 比如 用户昵称之类的信息。 由此才产生了类似的效果。
既然用了 token 验证的方式,那使用 jwt 作为 token 的使用广泛标准,怎么叫滥用?难道要自己自己实现个 token,想你说的生成个 uuid 才叫不滥用?
如果你是多个子域名下的项目呢,你是不是要做 cookie 跨域;那如果又是不相关的域名呢,你是不是又要 JSONP 。折腾这么多,还不如 jwt 来的方便,各自项目使用相同 key 做下校验合法性就可以互通了,不香吗?
至于黑名单,踢下线这些骚操作确实是破坏了 jwt 设计之初的无状态性质,但是 总该是要理想迁就于现实嘛,慢慢演进就好了。
注意看我最后面那句话,不是非 cookie+session 不可的,也可以自己造轮子,随机生成一个 UUID 作为 token,会话保存在 redis 中。
自己生成一个 UUID 也能用,但是大部分人都习惯用现成的,自己折腾怕有考虑不周的地方。
公司撸码, 能跑起来不就行了(狗头)
现在所谓的 JWT 都只是用 JWT 工具生成了一套 token 而已,实际上还是有状态的。。