请教各位一个问题, 为什么 session 机制没有被 JWT 所取代?

2017-08-10 17:57:43 +08:00
 baiyi

最近在细读 REST 那篇论文, HTTP 的设计应该就是来自于这里

看到了 无状态 这里, 有一点小疑问: 为什么 session 机制没有被 JWT 所取代?

session 毫无疑问是不符合无状态的, 它使得会话状态(session state)保存在了服务器中. 产生的问题也很清晰: 由于会话状态保存在了服务器, 所以需要多个服务器间同步会话状态

JWT 就是将会话状态存在了客户端(cookie), 服务器端需要的时候自然会解析验证. 也没有多服务器间的同步麻烦.

但是, 现状却是大多网站都是 session 的机制, JWT 只有小部分的 WEB API 使用.

15828 次点击
所在节点    HTTP
99 条回复
baiyi
2017-08-10 19:05:16 +08:00
@carlclone 抱歉,那我可能对 cookie 和 session 的理解有错误。不过,如果说是为了解决无状态出的方案,那就是说明无状态是有缺陷的。能给点提点吗
carlclone
2017-08-10 19:06:53 +08:00
客户端与服务器进行动态交互的 Web 应用程序出现之后,HTTP 无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是需要承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。于是,两种用于保持 HTTP 连接状态的技术就应运而生了,一个是 Cookie,而另一个则是 Session。HTTP 本身是一个无状态的连接协议,为了支持客户端与服务器之间的交互,我们就需要通过不同的技术为交互存储状态,而这些不同的技术就是 Cookie 和 Session 了。
baiyi
2017-08-10 19:08:16 +08:00
@Mutoo 对呀,所以 jwt 比 session 好,这是我的理解
yuanfnadi
2017-08-10 19:10:07 +08:00
@Mutoo 不需要 key 也可以获得关键数据,
Mutoo
2017-08-10 19:11:20 +08:00
@baiyi 这不代表 session 就会被取代呀。用 cookie 维护 session 是在 web 应用中非常直接的用法,没必要用大炮打蚊子。不过慢慢的越来越多的新框架会支持 jwt,而且在很多非 web 场景,也可以使用 jwt。
WildCat
2017-08-10 19:12:16 +08:00
我现在用 django-rest-frameowork-jwt,感觉非常好 =。=
但是如果传统后端渲染项目我还是会选择 session,就是为了简单。

补充一句,貌似 Rails 的 session 默认 store 其实就是加密后的 cookies
wellsc
2017-08-10 19:12:49 +08:00
我司在部分项目中已经用 jwt 取代 session 了。
Mutoo
2017-08-10 19:13:20 +08:00
@baiyi 无状态不是缺陷,相反是优势,这样才更有机会做均衡负载。但面对的问题就是如何在多 server 端维护同一 client 的状态,也就是 session。
baiyi
2017-08-10 19:14:37 +08:00
@carlclone 原来是这段理解,这个我有看过,但并不认同,无状态不是不存在会话状态,而是不应该存储在服务器端。这是我对无状态的理解
baiyi
2017-08-10 19:18:16 +08:00
@Mutoo
@WildCat

是不是说我想的是对的,jwt 比 session 好,只是因为历史遗留问题
baiyi
2017-08-10 19:19:29 +08:00
@Mutoo jwt 就是解决了多个服务器同步会话状态的问题,因为它符合无状态
baiyi
2017-08-10 19:20:37 +08:00
@所有人 感谢回复,手机浏览器不知道怎么感谢,回家后再点
cxh116
2017-08-10 19:20:45 +08:00
http 协议有 session 吗? 没有.

session 不过是基于 cookies 的服务端会话保存方案而已.

jwt 的 token ,相当于 cookies 的 session id.两种方案无本质区别.


比如 rails 的 session,就是把信息加密存到 cookies,每次请求都把 cookies 传过去,这样实现了你想要的无状态?
carlclone
2017-08-10 19:20:54 +08:00
那你还是去看 RFC 吧 醉醉的
Event
2017-08-10 19:21:17 +08:00
见 YII2 框架 有 Cookie 验证机制
saberscarlet
2017-08-10 19:22:10 +08:00
我们这现在 web 项目用 redis 存 session,app 项目用 jwt
andyangyu
2017-08-10 19:23:46 +08:00
搭车问一个登录刷新活动状态的问题,我现在是每次请求通过 session 更新数据库,有其他更好的办法么?
baiyi
2017-08-10 19:24:42 +08:00
@cxh116 对,会话状态存在客户端就是我认为的无状态,rails 的做法符合,但是我认为缺点是客户端无法获得会话状态,因为客户端是不能有加密的能力
baiyi
2017-08-10 19:25:13 +08:00
@carlclone 好的,接受批评,谢谢指点
baiyi
2017-08-10 19:28:46 +08:00
我见到的大部分框架都是通过加密存储,解密读取的方式利用 cookie,而 jwt 则是验证,客户端也可以查看会话状态,使用方向不同,我认为在鉴权方面 jwt 更好用

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

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

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

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

© 2021 V2EX