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

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

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

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

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

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

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

15846 次点击
所在节点    HTTP
99 条回复
gamexg
2017-08-10 19:28:49 +08:00
尺寸,session 保存一个 id 即可,jwt 要求所有 session 都存放在 cookie,保存太多的东西小心炸。
baiyi
2017-08-10 19:31:56 +08:00
@gamexg 嗯,这是个问题,cookie 据我检索到的资料是 4kb 的存储大小,所以,我只放入了少量权限方面无法替代的内容,例如用户 id,权限 id
baiyi
2017-08-10 19:41:11 +08:00
我觉得这里是问题的关键,我想再提出个问题,如果 jwt 不能包含所有内容,需要通过 id 等标示查找资源,那和 session 的区别呢……
kiddult
2017-08-10 19:41:25 +08:00
刚查了一下,JWT 本身就是 session 吧,只是蛋疼的用 JSON 来表示
baiyi
2017-08-10 19:44:00 +08:00
@kiddult 额,我认为是有区别的,jwt 本体含有所存储的会话状态
tairan2006
2017-08-10 20:35:59 +08:00
session 只是一个概念。。
erobot
2017-08-10 20:40:48 +08:00
不是做 web 的,查了一下说一下理解。

http 协议设计是无状态的,业务如果要求会话的概念,那么需要用某种技术实现,通常都是基于 cookie 的。session_id 和 jwt 都是某种实现会话技术存储在客户端的数据而已,主要区别应该是在于格式和标准化程度,他们完全可以存储一样多的信息,如果空间没有限制的话。

按照我的理解,正常 jwt 里面也应该是有类似 session_id 一样的信息的,不然就是密码本身而不是 token 了,尤其是类似登录状态,服务端应该有能力回收客户端的授权。

关于客户端是否应该存储所有会话状态信息,rfc6265 里面有这样的说法:
8.4. Session Identifiers
Instead of storing session information directly in a cookie (where it might be exposed to or replayed by an attacker), servers commonly store a nonce (or "session identifier") in a cookie.
...
Using session identifier cookies limits the damage an attacker can cause if the attacker learns the contents of a cookie because the nonce is useful only for interacting with the server (unlike non-nonce cookie content, which might itself be sensitive).
bazingaterry
2017-08-10 20:50:35 +08:00
JWT 好像就是把 session 签名后存在了 Cookies 里面?
loveCoding
2017-08-10 20:54:26 +08:00
@littleylv #14 一般的项目 ,随着需求越来越复杂 ,比如登录设备限制 , 自动踢下线 . 不是 session 最后慢慢都会变成 session 样子的.
yangff
2017-08-10 21:06:47 +08:00
……群魔乱舞
Infernalzero
2017-08-10 22:23:14 +08:00
session 的应用要广得多,存服务端通过 session 属性可以做很多事
huijiewei
2017-08-10 22:32:09 +08:00
session 是有锁的
sujin190
2017-08-10 22:44:12 +08:00
其实两者其实并没有什么区别
session 现在如果存在服务器大多也会使用 redis 这样分布式存储方式,不存在不能横向扩展的问题,再者 session 也并不是一定要保存在服务器,完全可以加密放到 cookie 里
jwt 也并不是没有问题,比如正常情况下要比 session_id 更大,需要消耗更多流量,挤占更多带宽,已经无法在服务端注销,那么久很难解决劫持问题
此外 jwt 一般只会直接保存用户 id 这样信息,那么正常情况下还是需要用户更多信息,那么同样需要 redis 这样高效率缓存系统配合,那么效率上也并不能比 session 更高效
sujin190
2017-08-10 22:45:11 +08:00
@huijiewei #52 真正使用其实并不需要,其实有点类似乐观锁之类的,就算短时不一致,问题也不大
jy01264313
2017-08-10 23:53:07 +08:00
session 不一定需要存在服务器端,cookie 里面存 session 一样可以非常简单
msg7086
2017-08-11 00:00:42 +08:00
Session 是一个更宽泛的概念。
JWT 原则上也是一种 Session。
Rails 里用 Cookie based session 已经很久了,也是把 Session data 序列化加密以后存储 Cookie。
主要缺点还是 Session data 比 Session ID 更耗费流量,每次请求(甚至当前域的静态文件也是)都要带上完整的 Session,非常耗费流量。另外 Cookie 本身还有长度限制问题。
cnnblike
2017-08-11 02:38:23 +08:00
我感觉 jwt 有一个不好实现,就是怎么保证服务器可以把用户踢下去呢?
如果要能实现踢下线这个操作的化,你得在服务器端保存一个"latest effective timestamp"之类的,这又和一般的 session 又有什么区别呢?
rason
2017-08-11 07:51:52 +08:00
感觉有人说的 session 非楼主所指的 session,具体与含义。
rason
2017-08-11 08:01:05 +08:00
使用 jwt 就不需要用集中式 session 管理来解决分布式的问题,我只能说,jwt 是一种比 session 更优的会话方案。
simaguo
2017-08-11 08:57:59 +08:00
最近用 jwt 正开发一个项目,体验中

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

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

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

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

© 2021 V2EX