为什么那么多 web 系统使用 jwt token 来做身份认证

2021-04-29 15:56:52 +08:00
 aboat365

我个人觉得大量的 web 系统在滥用 jwt token 技术。jwt token 签发后可使用私钥来验证其是否过期和篡改,这个技术用来做下载链接、邮箱验证、或短时间内的一次性验证业务是非常好的。但如果用来做 web 系统的身份认证,那简直糟糕透顶。在真正无状态下,很难平衡签发时间和安全之间的矛盾,还有无法续期导致的用户体验问题。当然,可以打补丁,甚至变得有状态,最后解决以上问题。但是,为什么一开始不用 cookie + session 呢?想听听大家的看法。

12360 次点击
所在节点    信息安全
97 条回复
lanlanye
2021-04-30 14:25:58 +08:00
我个人看好 JWT 的原因是它无状态,不需要后端维护 Session,想一下当并发量极高的时候你的 Session 要怎么处理?
zzl22100048
2021-04-30 14:26:10 +08:00
@kahlkn oidc 是认证协议( authentication protocol ),OAuth2 是授权协议( authorization protocol )
karloku
2021-04-30 14:28:26 +08:00
jwt 是一套信息传递机制. 并不是一套认证方案. 和 cookie 也不冲突你可以把 jwt 存在 cookie 里用.
不用 cookie 做认证的原因很简单. 后端是 api 的时候用 header 而不是 cookie 对 xsrf 防御更好. 如果用 cookie 还得协调前后端做一套 xsrf-token 来进行防御. 而 header 只需要在 ugc 内容的过滤和呈现上防止 xss 出现就好.
baiyi
2021-04-30 14:39:45 +08:00
@aboat365 #79 是的,现在 JWT 使用场景更多了,但也不能说 JWT 替代了 session,哪怕是 OIDC 中也不是用 JWT 格式作为 accesstoken 。服务端在有相应的场景下,该存的状态还是没少,其实是等同于 session 机制,只不过是原来 session + cookie 被现在的流行的认证格式取代了。
otakustay
2021-04-30 14:40:45 +08:00
JWT 正是平衡签发和安全后的产物,你所谓的“很难平衡”其实是把安全当作一个无底限的高要求在看吧
alexkkaa
2021-04-30 14:46:17 +08:00
这种适合无浏览器环境的场景, 浏览器环境下 cookie 绝对够用
pkoukk
2021-04-30 15:08:59 +08:00
有 sql 了为啥要有 nosql,有 redis 为啥还有那么多 mq,不是不能实现,而是有的时候用起来更顺手更合适而已。
在“能否达成相同效果”这点上纠结就进入误区了
kahlkn
2021-04-30 15:13:19 +08:00
@zzl22100048 本质上都是用来做 三方登陆 的,都可以说是属于 认证 把(应该把)?。 OAuth2 第一步是 授权,第二部 根据 access_token 获取用户信息,不就算是 认证 嘛。 oidc 第一步 就返回了 id_token,而 id token 又包含有用户信息,所以称为认证。
sonxzjw
2021-04-30 15:16:16 +08:00
jwt 确实存在楼主所说的弊端,但不如换个想法来解决如何
随意说一个吧,身份认证应该不是 jwt 的弊端,身份认证是审查有没有你这个人,之后才有鉴权。
所以即使 jwt 过期时间 1 万年也没有影响哒
woostundy
2021-04-30 15:40:19 +08:00
为了解决 session 到底咋存的问题。
jwt 的答案:客户端自己存,服务端只校验有效性。
OldCarMan
2021-04-30 15:43:43 +08:00
@chendy 其实可以搞一个黑名单之类(想要踢的人,ip 等等之类的)的有状态缓存(或者持久化),然后每次解析 jwt 时,做一次黑名单的过滤,PS:不知道我有没有理解错你说的踢人。
trlove
2021-04-30 16:08:28 +08:00
@hronro 哈哈哈 这就是词性问题。jwt 的 T 是 token 不假 但是合起来 jwt 它就代表一个约定,jwt 整体就是一个名词。token 这个机制本身也是一个独立名词。所以合起来也没问题。用生活现象来举例就是公交站牌 假设有 A B站 C三个站点  ,你可以说我到A下了 也可以加个字说我到 A 站下了 同时 你也可以说我到 B 站下 亦或是 B 站站下 …… 只要自己觉得不别扭就行 哈哈哈哈。这个问题的源头在于定义 jwt 的人吧 token 这个常用词 集成到它的约定的命名方式里面去了。
dorentus
2021-04-30 17:50:25 +08:00
@kahlkn 拿微信和阿里说事没有任何说服力。微信开放平台的 API 里面现在还有 JSON 和 XML 混用的呢,能学吗?
Owenjia
2021-05-01 09:56:35 +08:00
aboat365
2021-05-06 10:22:10 +08:00
@Owenjia 阅读了一下 paseto 官方介绍
https://paragonie.com/blog/2017/03/jwt-json-web-tokens-is-bad-standard-that-everyone-should-avoid

其中罗列了 jwt 、jwe 、jws 的各种安全漏洞,paseto 的设计更为安全,有望替代 jwt 。最后在总结部分说明:
Don't use JWT for session management, as discussed in other articles.
请勿使用 JWT 进行会话管理,如其他文章所述。

For secure sessions: Just use cookies over HTTPS. Cookies should only store a random identifier which is paired with a server-side persistent storage mechanism.
对于安全会话:只需通过 HTTPS 使用 cookie 。Cookies 仅应存储与服务器端持久性存储机制配对的随机标识符。
0xD800
48 天前
个人觉得 jwt 思想适用于后端微服务间的通信使用,这种情况下网关先鉴权然后用 jwtToken 在服务间使用 0.0 这样是不是好一点?
aboat365
47 天前
@0xD800 看情况吧,一般服务间通信不需要再鉴权

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

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

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

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

© 2021 V2EX