谁能用简短的语言解释 JWT 和 session 的区别?

2018-10-10 14:15:42 +08:00
 chaleaochexist

我目前的理解是.

JWT 在服务器端只需要验证你的 token 是正确的就可以.也就是说数据库里面只需要保存类似这种.

user_id token

然后服务器接到 token 信息,就知道你是谁了.剩下的信息也都在 token 里面装着.不装在服务器端.

要不然我理解不了 JWT 方式和 session 的区别.

8921 次点击
所在节点    程序员
53 条回复
robinlovemaggie
2018-10-11 08:16:59 +08:00
一个追求效率,一个追求安全。一个面向算法安全,一个面向存储安全。各有优劣,合理取舍。
Rootrl
2018-10-11 08:53:39 +08:00
caotian
2018-10-11 09:30:11 +08:00
@precisi0nux 用每个用户的密码作为加密 key 给用户生成 token 如何? 这样用户改了密码之前的 token 全部失效, 会不会有性能问题?
zhaogaz
2018-10-11 10:39:27 +08:00
区别当然有

session 是会话。它指的是服务端保存的交互状态,就是记录哪些人正在访问我们的网站。java servlet 是通过 jsessionid 的这条 cookie 来追踪的,每次交互的时候,servlet 容器会通过这个 cookie 来识别是哪个 session

jwt 全名叫 json web token。一般是每次 http 请求的时候携带的票据,我记得是 oauth 2.0 协议里面的东西。每次 http 请求的时候携带在 header 中。

这两个东西根本就不是并列的,不知道怎么就误会到一起了。其实还挺奇怪的是还有很多人不清楚 cookie 和 session (顺便吐个槽
EchosKK
2018-10-11 10:57:40 +08:00
@caotian 我刚也想到这个,但是会有个问题,解密的时候,用户密码从哪儿来?
dallaslu
2018-10-11 11:14:27 +08:00
1. 假期出游,你开车经过检查站,交警拦住了你,检查的驾驶证,性别、年龄、过期时间、防伪标志都没问题,大手一挥,放行了。

2. 离服务站两公里的应急车道上,一个妹子气鼓鼓的踢了几脚她的车子。坐在你副驾上的基友还是单身,给了你一个眼色,你马上把他放下去搭讪。原来妹子的车总是熄火,基友提出帮忙开到服务站。面对妹子不确认的眼神,基友掏出了驾驶证,性别、年龄、过期时间、防伪标志都没问题,妹子果然不再怀疑:果真是个老司机呢!

3. 一路风尘仆仆,你和基友去绿色洗浴城放松。你觉得有点热,喊服务生拿两听可乐,服务生过来看了一眼你的手牌号:777。你基友觉得有点燥热,喊服务生叫两个技师,服务生过来看了一眼他的手牌号:888。结帐时候果然算得分毫不差。

4. 柜台前随手刷了一下朋友圈,一个发小在晒手牌号:绿色洗浴城 666。你跟收银说,666 号的单我买了。收银员说:今天没有 666 号的客人啊,你朋友可能是在其他连锁店里吧。

基友坐在车里发着呆,若有所思。你打趣道:想白天那个妹子呢,还是回味刚才呢?你不会是想着工作的事儿吧?

基友不紧不慢的说:我琢磨着,驾驶证有点像 JWT,过期之前哪都能用,信息都在证上明写着;手牌有点像 SESSION,只能在店里用,消费都记在收银系统里。

你皮笑肉不笑的斜了他一眼,心里骂道:神经病。
Ravenddd
2018-10-11 11:31:28 +08:00
我认为两个可以一起用, 各司其职
session 控制用户的各个状态都很好, 服务端控制很灵活;
JWT 的特点就是无状态偏向与安全认证授权之类的;

之前我也想用 jwt 代替 session, 可是最后发现状态控制如果加上黑名单之类的就变成 session 了, 不知道还有什么应用场景, 知道的大佬请说一下
wizardoz
2018-10-11 13:05:09 +08:00
jwt 是一个认证凭证,从某种意义上说它和 username+password 是对等的。
session_id 是一个会话标识,服务器记录了一次业务的中间状态,当然如果认证状态为“ authenticated ”的话,看起来作用好像和 jwt 一样,但其实不是一样。就算没有用户认证的需要,也可能需要 session 来完成业务。

另:jwt 可以不在服务器上保存任何东西,因为 jwt 是可以用 RSA 签名实现合法性验证。
caotian
2018-10-11 14:15:50 +08:00
@EchosKK jwt token 不是加密的,里面的 payload 都是明文的, 只是最后一段是 hash 值, 用来判断 token 是否有效。 所以 payload 内容是可以直接读取出来的, 比如如果有 uid 读取出来了, 程序里可以查出来用户密码 hash 什么的, 再进行 jwt hash 判断
yulitian888
2018-10-11 14:20:44 +08:00
这个问题直接去看 JWT 官网不就好了吗?

简单来说,两者不具备可比性,因为适用场合不同。传统 Web 应用更合适 Session,因为操作是连续的。而 App 等新型网络程序往往需要登录一次管半年,而且是“偶尔”连接,对吧!这就是 JWT 适用场合了呗!
zhzer
2018-10-11 14:28:46 +08:00
简单说 jwt 就是带有前端通信功能(能被前端抓)的 session

jwt 的需求是建立在前后端分离,前后端需要同步用户信息上创建的
由于各种后台框架很繁杂,也就没有特别的 jwt 标准,其实简单修改 session 就能达到 jwt 所需求的效果
ZhengJL
2018-10-11 14:32:33 +08:00
通俗一点的说 JWT 相当于一把加密后的锁,用户登录服务器把锁给到客户端,客户端每次请求都必须带上,请求到达服务器如果服务器端可以用钥匙解开,并且锁内容没有过期,就说明用户是登录的,如果打不开或者打开后发现过期了,证明登录失效
qile11
2018-10-12 00:34:43 +08:00
@ZhengJL
同意一些,jwt 应该是为了保证客户端与服务器通讯安全而产生的,过期时间和密码是保证安全的方式,可以不设置过期时间,解密后可以通过用户名验证用户的合法性,也可以将一些数据加密传输(有些接口会使用 jwt 加密传输接口数据)。
session 应该是一种服务器应用,保持回话并存储一些数据,一般保存与服务器,cookie 保存与客户端。

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

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

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

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

© 2021 V2EX