JWT 可以实现 stateless authentication,但是 refresh token 不是无状态的,那 JWT 的意义是什么?

2021-03-02 16:52:20 +08:00
 JasonLaw

相关资料:

我的疑问:

如果使用 JWT 实现 stateless authentication 的话,那么肯定会使用到 refresh token,也就是会存储 refresh token 和 user 的对应关系。那么为什么还要使用 JWT 呢?为什么不直接使用opaque token呢?

额外阅读:

Authentication as a Microservice - YouTube

5218 次点击
所在节点    程序员
49 条回复
rrfeng
2021-03-02 17:05:17 +08:00
refresh token 为啥要存 user 对应关系? user id 在 token 里,解出来用就行了。
JasonLaw
2021-03-02 17:06:41 +08:00
baiyi
2021-03-02 17:19:23 +08:00
因为 refresh token 不是 JWT 的内容,而是 OAuth 的格式,只是有些框架 or 包使用 JWT 来传递 OAuth 的内容罢了。

从 JWT 的格式来看,一旦授权发出令牌,那么就不能在过期之前对令牌的权限做些什么,一旦想做什么,比如说服务端注销,那么就一定会有状态。所以 JWT 只适合特定场景。

我以前也问过类似的问题,可以看下
dqzcwxb
2021-03-02 17:20:40 +08:00
吹捧新技术概念追赶潮流,然后发现还是需要对用户进行管理比如踢下线封号等等,然后强行又做回 session 那一套
Solace202
2021-03-02 17:24:39 +08:00
特定场景使用吧,可以维护个 token 黑名单来实现 token 过期,但是感觉不太美好
qwerthhusn
2021-03-02 17:26:51 +08:00
本来用的 JWT,后来有一处登录和登出的功能。
然后就填一个黑名单到 redis 里面去,但是这样每次认证都要去查一次 redis

那为啥不直接用 uuid 做 token,然后直接去查一次 redis 获取用户信息结束了?
JasonLaw
2021-03-02 17:31:02 +08:00
@baiyi #3 你的那个问题是 https://www.v2ex.com/t/381996 吧?我把它移过来,方便大家查看。
LeeReamond
2021-03-02 18:04:30 +08:00
@qwerthhusn 请问什么场景要实现登出功能,一般不是前端删了 cookie 就完事了。如果前端没有按预期删除,那是前端非法使用,感觉也不会造成什么问题吧
IvanLi127
2021-03-02 18:08:27 +08:00
jwt 在业务中,不用查库就能知道用户基本信息,只要占点 cpu 校验下。我觉得这个就是他的价值。
IvanLi127
2021-03-02 18:10:26 +08:00
@LeeReamond 前端其实算是用户侧的东西了,前端非法使用可以代表用户非法使用,这锅前端不背。
LeeReamond
2021-03-02 18:13:54 +08:00
@IvanLi127 当然是指用户非法。。前端这也能杠。。我的意思是什么业务场景要做登出黑名单?
siweipancc
2021-03-02 18:25:30 +08:00
实际上大部分场景就是当 session,为了实现前后分离 与客户端在线限制
DOLLOR
2021-03-02 18:26:04 +08:00
@LeeReamond

当 token 被盗取了,用户紧急下线,添加至黑名单(直到过期),防止被盗取的 token 继续生效。
LeeReamond
2021-03-02 18:28:48 +08:00
@DOLLOR 这个就比较魔幻了,jwt 本身是 httponly 的,除非用户开 f12 控制台,把 jwt 抄下来发给别人。。。我感觉这种场景并不多见
freakxx
2021-03-02 18:33:38 +08:00
@JasonLaw #2

重签的时候,直接打开 refresh token 判断是不是过期,然后拿着 key 再签出一个的 access token 。

某种程序上说,access token 和 refresh token 的最大区别在于时间长短,并且用短时间的 access token 来做请求。
freakxx
2021-03-02 18:36:42 +08:00
@LeeReamond #14

从 token 角度说,存在泄漏的问题,token 的信息存在于服务端的话,那么重新建一个就 ok 。
但 jwt 没办法做到,因为 auth 只是判断 jwt 有没过期, 解出的 auth key 是不是对的。

所以需要有一个机制来控制 token 的生命周期。
IvanLi127
2021-03-02 18:37:51 +08:00
@LeeReamond #11 没杠你,我想表达的是前端的行为无法控制,在删了之前 token 都可能泄露。登出是为了让用户能撤销这个授权。非法使用得后端程序知道了才行,不然在后端眼里,他不知道这 token 非法了。
freakxx
2021-03-02 18:41:31 +08:00
@LeeReamond #14

换句话说,jwt 是基于时间来控制 token 的有效,在签出的时候已经决定有效期。

另外 2 个可以的场景,sso 情况下,

1.
修改密码后,那么旧的签出 token 必须失效,这时候必须有一个地方来记录 某用户时间点以前的 token 全部不能使用;

2.
只允许一个设备( token )登录,那么每次拿到新的 access 后,必须禁用这个时间点前的 token ;
uptonking
2021-03-02 18:51:32 +08:00
@IvanLi127 相比 redis 查内存中的数据有优势吗
no1xsyzy
2021-03-02 19:16:50 +08:00
@LeeReamond 场景不多见问题是影响大
R 小 L 大的场景仍然是需要防御的。

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

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

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

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

© 2021 V2EX