前同事把 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 就会短一些,解码耗时就少一些?

14989 次点击
所在节点    程序员
103 条回复
jzmws
2019-08-09 10:32:03 +08:00
@xuanbg 前端参数不可信 特别是敏感信息,什么当前登录用户用前端传递 不是找死吗 ?
inwar
2019-08-09 10:32:30 +08:00
@g8287694 到期过期这个操作还是要解码判断的,依靠前端过期不安全吧
passerbytiny
2019-08-09 10:35:42 +08:00
前面几位认为 JWT 没用的,你们基本不知道 JWT 是什么。JWT 全称是 JSON Web Tokens,是 Token Token Token,只参与认证阶段,从来不参与授权。你们硬把它拿来当 Session,自然没用。

安全控制首先要分为认证和授权两个阶段,JWT 是一种很流行的认证手段,而用户权限更改后禁止原 JWT 登录(因为授权配置变更而提前吊销认证 Token )、不允许多端登录(给后来者做授权同时取消先到者的授权,或者若已给先到者授权则禁止后来者的授权,等同于同一份认证同时最多只能被授权一次)是授权阶段的处理,JWT 原本就没打算涉及到这些。

你们甚至不知道 Session 是什么,Session 是会话,其主业是会话跟踪,安全控制只是顺便做了一下。Session 做安全控制时:sessionId (由生命周期为内存的 cookie,或者 URL 会写,作为存储介质)当 Token,Session 容器做认证,Session 附带的属性用来辅助授权。

JWT 和 Session 应该同时用,JWT 最多只能替代掉 sessionId。
g8287694
2019-08-09 10:36:17 +08:00
@inwar 是的啊,LZ 这贴的勇士想法有点奇怪,多大的量还在乎这点 CPU 开销,后端的基本原则不就是不能信任前端的数据吗?如果传过的数据还和数据库对比一下,那么这不是压力往 DB 放了吗
g8287694
2019-08-09 10:36:35 +08:00
@inwar 打错字了 同事
passerbytiny
2019-08-09 10:51:56 +08:00
@abcbuzhiming #46
@g8287694 #51
@Allianzcortex #55
@inwar #59
吊销,或者说提前终止,这玩意要想生效只靠认证方是实现不了的,必须要吊销方与认证方同步数据才行。比如吊销营业执照,要是工商(吊销方)只宣布吊销而不收回营业执照,则没看到吊销声明的人(认证方)仍然会相信这个营业执照。又比如身份证丢失后的重办,如果银行系统没跟身份证系统联网,则旧证(已被吊销的 Token )仍然会被银行当成有效的身份证。(所以银行一般不会把身份证当成唯一的认证依据。)
passerbytiny
2019-08-09 10:53:25 +08:00
接上,JWT 只参与认证,所以“吊销”这种操作光靠它自身,是永远解决不了的。
danmu17
2019-08-09 11:13:41 +08:00
@passerbytiny 把 JWT 拿来当 session id 用就已经是安全漏洞的范畴了。 @yamedie secret 写的简短一些,也是安全漏洞的一种,因为 HMAC 就是 MD5/SHA,所以一样可以弄个彩虹表来光速爆破。
arthas2234
2019-08-09 11:22:29 +08:00
JWT 都没理解是啥意思真水,订单列表还传 userId 也是骚操作
我们都想尽办法降低数据库的压力,能放服务器的绝不放数据库,这小老弟牛逼
zichen
2019-08-09 11:23:47 +08:00
数据库比对,jwt 的防重放功能是不是也废了?
orqzsf1
2019-08-09 11:24:16 +08:00
@passerbytiny 比如我在发廊开了一张卡,发廊消了我的卡,我的卡就失效了。这算不算只靠认证方实现注销功能?
yinjy
2019-08-09 11:34:41 +08:00
没准他以后会在简历里加一条“熟悉 JWT ”
twohappy
2019-08-09 11:43:20 +08:00
@orqzsf1 jwt 如果是 server 是发廊的话,你开的只能是不记名的储值卡,它是销不了的。logout 最简单的就是你自己把卡剪了。也就是你卡丢了,只要里面还有钱,我拣上一样可以去大宝剑。
lizhenda
2019-08-09 11:51:09 +08:00
jwt 存 redis 啊,顺便做了超时验证
phpcxy
2019-08-09 11:51:54 +08:00
他验证 token 时候不用查询数据库么,这数据库压力也被增加了啊
343382140
2019-08-09 11:53:46 +08:00
@abcbuzhiming 可以主动失效的,手动将 token 加入黑名单就可以了
Vegetable
2019-08-09 11:55:07 +08:00
真·彩笔
wingyiu
2019-08-09 11:58:28 +08:00
sql 不是一种语言吗?楼主真菜
augustpluscn
2019-08-09 12:03:43 +08:00
外包不应该实现就行,质保期内不出问题???
考虑太多了。随他怎么用呗
xuanbg
2019-08-09 12:16:55 +08:00
@AlvaIM 我没说篡改 token,是篡改接口参数里面的 ueseId。。。

token 是我的,但要的是你的数据。这就是楼主说的水平权限漏洞

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

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

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

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

© 2021 V2EX