前同事把 jwt token 存在 sql 里,做法是不是有问题?

2019-08-09 08:03:56 +08:00
 yamedie

在一个公众号外包项目里,与前同事不期而遇,他后端我前端。jwt 竟然被这样应用,想问:

1、这种使用姿势好处在哪里?感觉如果不验证 token 只读库比对的话,也许自己生成个 uuid 与 userId 做关联就可以了,为什么要用 jwt ?

2、验证 jwt 有这么耗时吗?之前用 nodejs 写过 jwt 的 demo,没有察觉到解码 jwt 的开销。

3、是否 secret 写的简短一些,token 就会短一些,解码耗时就少一些?

14444 次点击
所在节点    程序员
103 条回复
liyihang
2019-08-09 09:11:34 +08:00
真的讨厌你们这种有啥问题不当面沟通解决,去网上发帖的
yejinmo
2019-08-09 09:12:03 +08:00
问下

如果使用 jwt 而不存储的话,当此用户权限更改后,如何确保之前的 jwt 失效?
lemonEssence
2019-08-09 09:12:34 +08:00
公司一 Java 用自增 ID 做订单号你敢信
abcbuzhiming
2019-08-09 09:13:06 +08:00
jwt 是为了让服务器没有状态,才采用的一种安全性较低,成本也较低的方案,如果一定要用服务器校验,那 jwt 就毫无意义,不如不用
yamedie
2019-08-09 09:15:29 +08:00
@lemonEssence 用户 id 和订单 id 是自增的, 流水号是年月日时分秒+随机数
ksco
2019-08-09 09:15:55 +08:00
@yejinmo #22 把该用户的该 Token 加入到一个黑名单(例如 Redis )里,过期时间就写 Token 的过期时间,验证 Token 是,需要先到这个黑名单里查一下

挺恶心的
yamedie
2019-08-09 09:18:30 +08:00
@liyihang 说出有水平权限漏洞以后, 就不再理我了, 所以想上来求证一下是不是这样存 SQL 真的有好处呢
ksco
2019-08-09 09:19:19 +08:00
@yejinmo #22 或者你应该直接把用户的权限存到数据库中,Token 只负责校验登录。
jinliming2
2019-08-09 09:20:09 +08:00
JWT 用来做短时间的认证没问题,比如超时时间 5 秒认证一次就作废,防止泄漏……
JWT 做 session 本身就有问题,一旦泄漏没办法直接吊销……
要做吊销,只能存黑名单,但是既然都存黑名单了,又何必用 JWT 这么庞大的东西呢,一个密码安全随机数或是 UUID 就好啊,又短,还省去了 JWT 的合法性验证过程……

所以,JWT 真的不适合做 session,只适合做临时的令牌……
meepo3927
2019-08-09 09:20:16 +08:00
干他 + 1
yejinmo
2019-08-09 09:20:31 +08:00
@ksco #26

在不事先存储 Token 的情况下,服务端也不知道该用户有哪些 Token 啊

再比如如果不允许多地点登录,不存储 Token 也做不到吧
Bramblex2
2019-08-09 09:23:16 +08:00
@yejinmo 所以 jwt token 有时效,比如两个小时,超时了去找账户服务重新核发(不是重新登陆),虽然会有两个小时延迟,但问题还是能解决的。一些核心服务可以在业务层建权限系统,而不是靠账户服务发权限。
ksco
2019-08-09 09:25:51 +08:00
@yejinmo #31

1. 如果不知道要屏蔽哪些 Token,只知道用户 ID,那你黑名单里面就存用户 ID 和一个时间戳。所有该用户 ID,且 Token 里的时间戳在此之前的,全部拒绝掉。

2. 不允许多地登录这个之前没遇到过。临时想了一下,或许你可以在 Token 里面记录一下对应的地区,如果 Token 的地区和用户的实际地区不一样,就拒绝掉。
AlvaIM
2019-08-09 09:29:10 +08:00
哈哈哈, 这个问题就跟著名的空档滑行省油还是带档滑行省油问题一个样子, 新技术遇到了不思进取的老司机。用起来大致上是没有差了, 但是失去了 stateless 的意义, 把 Webserver 校验的压力转嫁给了数据库。

@abcbuzhiming jwt 的安全性并不是低, 签名能够防止篡改了,也就无法跨域脚本攻击了

@xuanbg 你对安全的理解有误, 直接存数据库然后对比 jwt 的 token 并没有安全上的问题, 因为你如果改了任何一个部分字符串就变了, 数据库判断就通不过了,如何篡改?这么做安全上没问题, 只是失去了 jwt 的意义而已
yejinmo
2019-08-09 09:29:42 +08:00
@ksco #33

所以我说的业务场景是不是压根就不适合用 jwt 这种东西。。
coang
2019-08-09 09:34:40 +08:00
@jinliming2 jwt 丢 redis 里边当 session.. 超时清除清除就好 而且 jwt 本身可以设置超时时间.. 具体怎么用都是 filter 都能做到
AlvaIM
2019-08-09 09:34:50 +08:00
楼主那位前同事应该只是复用了原来写好的鉴权部分的代码而已, 估计整个项目的代码框架都是直接用了之前的项目模板, 甚至直接老项目删删就直接拿来用了, 外包嘛, 最求成本效益最大化,谁管你代码质量, 安全性效率什么的
des
2019-08-09 09:35:18 +08:00
前端传 userId,笑死了
ksco
2019-08-09 09:37:08 +08:00
@yejinmo #35 哈哈确实是,有这些需求的话,JWT 确实就是脱裤子放屁了
Bramblex2
2019-08-09 09:37:26 +08:00
@yejinmo

账户服务发 token,具体的业务服务根据 token 建 session 就行了啊。

如果你们就一台服务器,一个服务一把梭,当我没说过。当你有 40 台服务器,20 多个服务,还需要在不同的云不同区上有灾备的时候,你就知道 jwt 有多香了。

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

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

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

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

© 2021 V2EX