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

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

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

11589 次点击
所在节点    信息安全
95 条回复
zoharSoul
2021-04-29 16:16:31 +08:00
因为 cookie 不好用啊, 所以要用 token,
既然要生成 token, 与其自己想一套规则, 不如直接用 jwt 的.
leafre
2021-04-29 16:42:57 +08:00
是公钥验签防篡改,refresh_token 可以实现无缝续签,redis 黑名单控制 jwt 失效,安全和有状态之间做取舍。至于 cookie + session,无法满足多端需求
emeab
2021-04-29 16:46:26 +08:00
@leafre session 为什么无法满足多端需求
wshcdr
2021-04-29 16:47:11 +08:00
移动端又没有 session 的
airplayxcom
2021-04-29 16:48:39 +08:00
那只能说明 你的项目还没有前后分离
chendy
2021-04-29 16:49:44 +08:00
公司的产品 web 端还是用 cookie 的(其实也可以说是把 token 放在了 cookie 里),没啥问题
客户端和小程序之类的用的自定义的 token 也没用 jwt,因为有大量踢人需求 jwt 太麻烦
wangxiaoaer
2021-04-29 16:51:42 +08:00
@wshcdr #4 移动端为什么没有 session ?
hronro
2021-04-29 16:52:55 +08:00
JWT token 这个说法看着好难受。JWT 里面的 T 不就是 token 的意思吗,为什么还要在 JWT 后面再加个 token ?
wshcdr
2021-04-29 16:58:59 +08:00
@wangxiaoaer 手机上的 app,就是没有 session 的
est
2021-04-29 17:10:48 +08:00
因为一群猴子发现解析 cookie 太难了。格式没有太好的 spec 。就自己用 JSON 糊了一个替代品。
jorneyr
2021-04-29 17:10:53 +08:00
jwt + 客户端指纹 (IP+浏览器信息...等) 就可以防止滥用的成本
djs
2021-04-29 17:12:36 +08:00
@wshcdr #4 session 是放在服务端的吧
zoharSoul
2021-04-29 17:28:46 +08:00
@wangxiaoaer #7
先不说 ios, android 上的 cookie 存储你弄过吗? 多域名情况下 cookie 共享弄过吗?
按访问速度动态更换域名的时候 cookie 怎么跟着切? 更换用户登录的时候 cookie 怎么改变?

这时候用 token 不是更方便吗?
wunonglin
2021-04-29 17:44:20 +08:00
@zoharSoul #13

后端生成 token(此 token 为自定义的随机字符串,不是 jwt),token data 存 redis 。客户端(web 、ios 、andriod 等),自行存储。请求时带上 token,此时你想带到 header,body,query param 都行呀

这样不就满足服务端控制 token 咯?
keppelfei
2021-04-29 17:44:24 +08:00
存在即合理,市场决定的,移动端的兴起更需要 jwt 的出现。jwt 更多的是一种思想
zoharSoul
2021-04-29 17:45:34 +08:00
@wunonglin #14 这不就是我的意思吗?
aboat365
2021-04-29 18:06:37 +08:00
@leafre 感谢指出错误,私钥签发,公钥验证。refresh_token 、redis 黑名单确实能解决问题,但问题是需要前后端写代码去实现,而 cookie+session 方案,几乎不用写什么代码就具备这些功能。对于多端,cookie 存的只是一个 sessionID 字符串,请问支持 http 协议的端带上一个 sessionID 有啥困难,头里加 token 都没问题,带个 sessionID 就不能了?
aboat365
2021-04-29 18:12:39 +08:00
@wunonglin 这就相当于重新打造了一套 cookie+session 方案实现。
aboat365
2021-04-29 18:20:35 +08:00
@zoharSoul 这位兄台,其实所谓 cookie+seesion 方案,基本流程是后端生成一个 sessionID,发给前端,前端存起来,后续请求都带上这个 sessionID,实现了有状态的会话跟踪。但迫于种种安全问题,以及浏览器提供的便捷方式,如同域可带上这个 sessionID,跨域不允许; sessionID 返回后浏览器自动将其存储在 cookie 中;但是,以上是对于常规浏览器而言。既然你的是移动端 app 了,这个 sessionID 你想怎么玩就怎么玩,跟 token 使用毫无区别。
wunonglin
2021-04-29 18:20:55 +08:00
@aboat365 #18 不打造怎么对应不同的业务需求?

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

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

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

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

© 2021 V2EX