前后端分离, JWT 还是 Oauth2?

2018-03-20 10:19:30 +08:00
 bayker

自己内部的一套系统,不存在提供第三方调用。

采用前后端分离, 使用 JWT 还是 oauth2?

第一次使用,不是太明白,JWT 怎么实现 token 刷新,token 过期,后端禁用?

27081 次点击
所在节点    前端开发
25 条回复
phpcxy
2018-03-20 15:01:25 +08:00
@bayker #19
设置一个刷新有效期,在有效期内的访问都刷新一下 token 返回新 token 给客户端;
后台作废 token 的话就利用缓存记录一个本 ID 的 token 作废时间,在作废时间以前颁发的 token 失效(前提是你的 token 有记录颁发时间~)
bolide2005
2018-03-20 15:26:01 +08:00
@nl101531 #12 可以,是一种解决的思路,但我倾向于不使用这种方法,至少不作为设计阶段的方案使用,很大程度上 token 的作用就是为了在请求量比较大且多终端复用的情况下,减少登录和用户数据查询操作产生的数据库压力,如果每次还需要检查 token 版本,不如直接用最基本的 session 来实现;修改密码需要多终端下线的操作,可以通过向终端发送重新登录的通知来实现,如果担心之前的 token 没作废产生的安全风险,应该把在敏感场景中排除 token 的效力。比如,正常的查询操作都可以使用 token,是不会触发重新登录的操作的,但如果涉及到财产、敏感信息的查询和操作,都应该进行重新登录并用 session 维护登录信息。token 永远不是安全性高的解决方案。token 也不是为了这种场景存在的。


@bayker #15 我上面举的例子应该能回答这个问题:token 用于频繁且不敏感的操作。
timonwong
2018-03-20 15:34:08 +08:00
先打消一下误解,比如 JWT 的 revocation
1. JWT 有 jti claim,用作唯一 id 时候,可以做 blacklist 来 revocation,当然按照传统的方式 whitelist 也是可行的;
2. group revocation: 同理,加入一个自定义的 claim,比如 audit_ids,可以按照 blacklist 的方式作分级 revocation ;
为了让 blacklist 大小可控,一般不允许不 expire 的 JWT token。

但是,请不要将 JWT 作为 session 来使用。

如果你需要一个全功能的,请看基于 OAuth2 和 JWT 的 openid connect
banks0913
2018-03-20 15:40:57 +08:00
如果不用 session,用 jwt 又没法在后端禁用或者失效,有什么简单通用的解决方案吗?
nl101531
2018-03-20 16:07:40 +08:00
@bolide2005 嗯,想要实现吊销的话就必须要存。其实版本这个东西可以存在 redis,内存占用很小的。具体还要看公司的业务来定。

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

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

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

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

© 2021 V2EX