前同事把 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 条回复
oneisall8955
2019-08-09 12:25:22 +08:00
@yamedie 这么恐怖还要啥 jwt🙃
gam2046
2019-08-09 12:33:04 +08:00
业务系统上没用过,自己的私下项目有用过 JWT。

对于多点登录,我简单的做法是 payload 中有签发时的客户端 IP,请求时 IP 与签发时 IP 不一致就觉得,一定程度上避免了多点登录与 JWT 泄露的风险

至于凭证吊销,我当时的做法是签发时,JWT 具有较短的有效期,当时设计为 5 分钟。也就是说权限变更或吊销,最长有 5 分钟的延迟。这种设计就需要看具体的业务系统是否能够承受这样的延迟带来的潜在风险。

换而言之,我之前的私下项目,并不支持主动吊销凭证,只能被动的等待到期,然后重新核发。
clf
2019-08-09 12:33:23 +08:00
emmm,我这边使用 jwt 是这样的:
1.userid 作为内容存储在 token 里。
2.服务器使用 redis 对 token 进行存储与管理,token 入数据库。
3.验证时先检验是否存在于 redis 中,再检验 token 是否合法,合法者通过,过期的清理 redis,将要过期的考虑是否再签发。(顺序可换)
cigarzh
2019-08-09 12:43:05 +08:00
传说中的马拉火车
vkhsyj
2019-08-09 13:02:07 +08:00
把 jwt 当 session 用本来就很傻逼,但是现在很多人就是这么用的
reus
2019-08-09 13:19:25 +08:00
jwt 本质就是服务器放在客户端的一些数据,这个数据,只要可以正确解码,就可以信任。
因为只有服务器才能从原始数据构造出可以正确解码的数据,客户端不能篡改,不能伪造。
所以不是说用了 jwt 就不能有状态,例如有一些计算,开销比较大,我计算一次,放在 jwt 里,这样就不用每个请求又计算一次,直接用 jwt 里的。这种场景,也适合用 jwt。
不用那么死板的。
clf
2019-08-09 13:20:00 +08:00
@lychs1998 发现刚刚写漏字了:token 不入数据库。
alian
2019-08-09 13:38:52 +08:00
jwt 网上很多资料存在误导。
需要拉黑啥的还是要存,而且如果是用到移动端的话会相对友好。
两年前折腾过一段时间,感觉如果是 web 应用不考虑扩展性,完全不需要 jwt,session 简单直接。
yulgang
2019-08-09 13:45:04 +08:00
说点不相关的,我这还有在 A 数据库里存 B 数据库的连接信息的呢!!!!迁移换环境坑死爹了。
koebehshian
2019-08-09 14:13:59 +08:00
这种项目基本没几个用户,所以漏洞敞开着也没人来。
szandy6
2019-08-09 16:25:49 +08:00
jwt 本来是 stateless 的,用来做 session 是观念还没转过来。
blackccc
2019-08-09 16:38:48 +08:00
@lizhenda 存 redis ?可以顺便存用户信息吗
abcbuzhiming
2019-08-09 17:53:41 +08:00
@343382140 你的黑名单保存在哪里?服务器上吧,你这不等于服务器有了状态?你再去把 jwt 的设计思路仔细读一遍,人家用 jwt 就是为了在客户端保存数据,让服务器无状态,如果要服务器保存状态我干嘛要用 jwt,用 session,cookie 不是更好?
所有用了 jwt 还要在服务器保存状态的设计都是有问题的,jwt 的使用场合就是无状态服务器
way2create
2019-08-09 18:24:24 +08:00
@abcbuzhiming 估计很多人用框架没留意具体实现细节 现在有些框架的确给 jwt 加了白名单黑名单的功能 这玩意不用看源码也知道 要主动过期肯定要存的
chinvo
2019-08-09 18:39:10 +08:00
jti 存数据库里,需要验证有效性的时候核对 jti

至于 user id 原则上应该从 sub 取

因为 jwt 生成过程在后端,签名、加密的过程不对外暴露,所以不用担心篡改
chinvo
2019-08-09 18:40:35 +08:00
@abcbuzhiming #89 虽然初衷是无状态,但是无状态的应用场景下泄漏不能及时封堵,只能被动等待过期,这是不符合安全原则的
chinvo
2019-08-09 18:41:28 +08:00
而 session、cookie 是可以篡改的,所以折衷一下使用 jwt + jti 黑白名单,这样的设计可以提升系统的安全性
tyrealgray
2019-08-09 19:29:22 +08:00
JWT 的 renew token 的确是存 DB 的啊。 其他的不做评论
abcbuzhiming
2019-08-09 21:03:32 +08:00
@way2create 如果你要存,那就别用 jwt,既然服务器要保存状态,那就不如让客户端轻松点,而且 jwt 每次那么长一串在 http header 对带宽是个压力,本来这就是让客户端保存状态的代价。付出这个代价,没得到点好处,岂不是为了用 jwt,而用 jwt。


@chinvo session 和 cookie 能不能篡改只取决于你往它里面放什么,你要放明码的 id 肯定很容易篡改。但是我放个 uuid,来吧,篡改吧。狠一点的我照样给数据加个签名再放进去。篡改?呵呵
在数据防篡改上 jwt 并不比 session 和 cookie 更安全,至少从设计级别上 jwt 并不更安全,jwt 的全部意义就在于让客户端保存状态以让服务器无状态,这就是 jwt 设计意义
way2create
2019-08-09 21:23:03 +08:00
@abcbuzhiming 你搞错了。。。我不是对你说我要存 我是在说有些人可能框架用多了以为不用存就能主动过期了

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

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

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

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

© 2021 V2EX