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

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

我目前的理解是.

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

user_id token

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

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

8795 次点击
所在节点    程序员
53 条回复
jswh
2018-10-10 14:26:14 +08:00
session 是存在服务器端的,是服务器端对客户端的访问状态的存储,因为 HTTP 本身是无状态的,但有时候有需要保存状态(比如登录状态),就用这种方式,一般配合 cookie 来使用。token 是访问令牌,就是一种权限的校验机制,JWT 是 token 的一种规范。这里面的概念都不一样,不能这么比。
rainonline
2018-10-10 14:29:42 +08:00
JWT 是不需要数据库的。当服务器授权生成 Token 之后,用户存储在浏览器中,服务器本身不储存用户的状态。访问服务器时服务器直接算法校验用户传过来的 Token 是否有效。不过这样有一些缺点比如不能服务端设置 Token 无效,只能等他过期。

Session 则是用一个全局变量来存储用户的状态。长期保存需要存储在数据库中,多个服务共享登陆状态时还要做 Session 数据共享等操作,可扩展性差一些但比较容易做控制
zsh1995
2018-10-10 14:30:58 +08:00
理论上 JWT 的 token 也不需要存数据库吧,验证是基于密码学的签名算法的
tachikomachann
2018-10-10 14:36:32 +08:00
jwt 也是 session 的一种
传统的 session 验证方式是服务端有存储介质保存用户 session,客户端请求时带上票据来服务端验证。
jwt 基于一套标准的加密方式,加密票据和 session 信息(比如登录用户的数据),并且不需要存储介质就能验证票据合法性,可以做到 session 产生后不需要服务端参与验证。

当然,缺点也很明显,只依赖客户端的话,jwt 无法集中控制用户会话过期,比如后台踢出用户这种操作。
qq976739120
2018-10-10 14:44:50 +08:00
我现在是登录的时候生成一个 uuid 放到缓存,前端放到 cookie,redis 里 uuid: 用户信息,然后每次访问的时候前端带这个 uuid 过来,缓存里判断是否存在这个 uuid,存在这个 uuid 表示登录. 感觉也蛮方便的
precisi0nux
2018-10-10 14:46:54 +08:00
@tachikomachann 这也是我一直疑惑的,如果用户改密码了,如何去 invalidate 那个 jwt token。
mgcnrx11
2018-10-10 14:50:19 +08:00
这个写得挺好的,http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/ 。不过不是楼主要的简短的
sunnysen
2018-10-10 15:19:19 +08:00
明显两个概念 维基一下就知道了 前排别误人子弟
imn1
2018-10-10 15:26:19 +08:00
session 是一个环境、变量容器,不能把它其中一个用途 /属性抽出来代替它
crab
2018-10-10 15:30:02 +08:00
@precisi0nux jwt 带上过期时间,过期要重新请求了。
571726193
2018-10-10 15:40:26 +08:00
@rainonline 你好 之前使用过 jwt,但是 道理不是太懂,以下几点能否指点以下:
1,JWT 生成的 token 存放在哪里啊?
2,移动端登录到服务器返回一个 token, 以后每次访问都带着这个 token 来请求接口 ,服务端是通过什么知道 带上来的 token 和 第一次生成的 token 一样的?

菜鸟一枚,真心求教 谢谢大佬
qwx
2018-10-10 15:51:58 +08:00
@571726193
1、生成的 token 应该传递给客户端存放在客户端
2、我的操作是整个 token 放到 redis,提交上来先验证,当然有大佬告诉我最好不要这么做。
(虽然 token 的验证是通过签名来保证不可伪造就是了)
leafin
2018-10-10 16:02:00 +08:00
@571726193 简单理解一下:在 session 机制下,当用户登录时,服务器从数据库读出用户信息
leafin
2018-10-10 16:08:14 +08:00
@571726193 简单理解一下:
在 session 机制下,当用户登录时,服务器从数据库读出用户信息,把用户信息保存在 session 容器里,然后创建一个 sessionId 指向这个用户信息。然后把 sessionId 返回给客户端保存。下次客户端请求时带上 sessionId,服务器查找 sessionId 对应的 session,即可得到用已认证的户信息。
可以理解成服务器创建并保存会员卡,然后把卡号告诉你。你要消费的时候提供卡号就行。

在 JWT 机制下,当用户登录时,服务器从数据库读出用户信息,把用户信息加密生成一个 token。然后把 token 返回给客户端保存。下次客户的请求时带上 token,服务器解密 token,从中得到已认证的用户信息。
可以理解成服务器创建会员卡,然后把卡给你。你要消费的时候要提供会员卡。
571726193
2018-10-10 16:08:32 +08:00
@leafin 1,JWT 生成的 token 存放在哪里啊?
2,移动端登录到服务器返回一个 token, 以后每次访问都带着这个 token 来请求接口 ,服务端是通过什么知道 带上来的 token 和 第一次生成的 token 一样的?

我想了解的是这两个 , 谢谢
algery
2018-10-10 16:14:28 +08:00
JWT 无状态; Session 有状态维护
leafin
2018-10-10 16:31:46 +08:00
@571726193 我觉得我已经讲清楚了。
1.token 返回给客户端了,服务器不保存。
2.没有什么第一个第二个的,服务器收到 token 的时候,能成功解密,就说明用户身份没问题。
heimeil
2018-10-10 16:40:14 +08:00
一个 jwt 是由 3 部分组成,用 . 连接起来 Header.Payload.Signature,主要是最后的签名起到认证的作用,服务端先用 Header 里面的算法对 Payload 进行带密码的签名,别人没密码就签不出来同样的结果,生成后发给客户端,客户端再发给的服务端时,服务端再重复一下之前的签名操作,比对签名是否一致,相同就代表 token 没有被篡改。

就像比较两个 md5 一样,只不过 jwt 是带了密码的,不然谁都可以伪造,签名正确的话 Payload 的内容就是可信的了。

改密码之类强制清理用户 token 问题还需要一个黑名单系统,block 用户一个时间点之前的 token。
chaleaochexist
2018-10-10 16:47:03 +08:00
@heimeil 大神,数你说的最简单,而且说得通.

> 改密码之类强制清理用户 token 问题还需要一个黑名单系统,block 用户一个时间点之前的 token。
这个部分就需要用到数据库了对吧?
譬如把过期的或无效的 token 放到数据库里面.
lichao
2018-10-10 16:48:45 +08:00
JWT 不能针对单个用户进行重置?

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

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

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

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

© 2021 V2EX