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

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

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

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

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

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

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

15811 次点击
所在节点    HTTP
99 条回复
k9982874
2017-08-10 18:07:42 +08:00
jwt 本质也是 session
baiyi
2017-08-10 18:12:31 +08:00
@k9982874

本质指的是什么呢?
会话状态吗?这个是不可避免的,无状态的本质也不是没有会话状态,而是会话状态不能保存在服务器端
bazingaterry
2017-08-10 18:14:11 +08:00
session 可以在服务端注销,而一般的 JWT 不可以。
baiyi
2017-08-10 18:19:10 +08:00
@bazingaterry

这个我有想过,jwt 想要实现这个功能也是可以的,既然不能改变会话状态,可以改变会话中的资源状态,比如一般来说的用户,注销后可以修改资源状态,每次效验会话状态时,可以先查看资源状态

比如一般情况下的用户会话状态,注销后可以在服务器端同步一条用户资源的注销情况,验证会话时查看是否已注销

想的也没有太仔细,注销时间应该可以判断吧
syncher
2017-08-10 18:21:28 +08:00
JWT 怎么做延时?比如用户操作 30 分钟 token 失效这个功能 JWT 实现不了
syncher
2017-08-10 18:22:52 +08:00
#5 用户无操作 30 分钟 token 失效(手欠)
baiyi
2017-08-10 18:24:36 +08:00
@syncher 会话状态的时效性吗,JWT 中也有对时间戳存储,也是具有时效性的
baiyi
2017-08-10 18:25:26 +08:00
@syncher 可以用户每次请求后更新 jwt 的过期时间
syncher
2017-08-10 18:28:51 +08:00
@baiyi jwt 不是靠算法吗,怎么更新。除非产生新 token
baiyi
2017-08-10 18:30:55 +08:00
@syncher 对,更新其中的时间戳,然后重新生成,并返回
syncher
2017-08-10 18:31:42 +08:00
@baiyi 每次请求返回新 token,前端不干了
baiyi
2017-08-10 18:33:29 +08:00
@syncher 为什么呢?很麻烦吗,如果是存储在 cookie 中,甚至前端完全不需要处理的。app 一般不需要时效性,app 用的都是刷新机制
syncher
2017-08-10 18:44:16 +08:00
@baiyi 可能吧,我现在做的项目就是 JWT 认证。延时功能用 session 实现。
littleylv
2017-08-10 18:44:49 +08:00
JWT 用在 API 中挺好的,但用在正常的客户操作上感觉会多出好多麻烦的事(我没用过),为啥不直接 seesion 解决呢
baiyi
2017-08-10 18:46:51 +08:00
@syncher

嗯,目前我的项目也是在用 jwt,对于这方面的需求只是我不成熟的理解,可能不能适应所有场景
baiyi
2017-08-10 18:50:18 +08:00
@littleylv

session 的缺点我在上面的问题内容中提到了,我认为 jwt 解决了这个问题,而 session 能实现的功能 jwt 也可以

重要的是 session 不符合无状态风格……
carlclone
2017-08-10 18:53:14 +08:00
session 和 cookie 不是为了解决 Http 无状态才产生的吗。。。怎么会符合无状态?
baiyi
2017-08-10 18:55:37 +08:00
@carlclone 哎? cookie 也是解决无状态的吗?我认为将数据存在客户端是符合无状态的
carlclone
2017-08-10 19:01:21 +08:00
@baiyi 哎我感觉你要补充一下 HTTP 的基础吧,session 就是 cookie 的升级版
Mutoo
2017-08-10 19:04:22 +08:00
cookie 的问题在于不能跨域,session 存在 cookie 里符合早期的 c/s 一对多的服务方式,而如果业务需求增长的话,servers 需要横向扩展,这要求 session 必须能在多台 server 之间同步共享。jwt 简化了这个共享的过程,只要任一 server 持有 private key 能解密 jwt 就能获得关键的用户数据,而不必把 session 在多台 server 间存放。

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

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

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

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

© 2021 V2EX