是否建议将更改的数据存储在 JWT 中

Posted

技术标签:

【中文标题】是否建议将更改的数据存储在 JWT 中【英文标题】:Is it recommended to store changing data in JWT 【发布时间】:2020-10-25 05:15:42 【问题描述】:

据我所知,JWT 的主要用途是我们可以将用户相关数据存储在 JWT 令牌本身中,并在资源服务器进行令牌验证期间节省不必要的 DB 命中。问题是如果我将数据存储在 JWT 中随着时间的推移而变化,例如角色或用户菜单列表或用户状态,它如何处理这些变化。

考虑这种情况。

    具有 admin 角色的用户已登录 Web 应用程序,在登录时用户状态为 ACTIVE,用户角色为 admin。 authserver 使用这些信息生成 JWT 令牌。 访问令牌有效期设置为 15 分钟,刷新令牌有效期设置为 8 小时。 另一方面,另一个具有“Superadmin”角色的用户挂起“Admin”用户或将“Admin”用户角色更改为“Supervisor”。现在由于“管理员”已经有一个未过期的访问令牌或刷新令牌,我是否应该在每次验证令牌时进行另一个数据库检查,或者我不应该将用户状态和角色存储在 JWT 令牌本身中?李>

【问题讨论】:

【参考方案1】:

不建议将此类数据存储在 jwt 中。在您的场景中,最好仅将用户 ID 与 jwt 附加并检查每个服务器命中的用户状态。如果您在客户端编写任何逻辑来解码令牌,则会危及令牌的安全性。

【讨论】:

目前我只在 jwt 令牌中附加用户 ID,但我觉得它违背了它的目的,因为 JWT 应该保存大量信息,而 JSESSION ID 只保存会话 ID tools.ietf.org/html/rfc7519 jwt.io/introduction 参考这些链接以获取更多信息......以及你的问题......正如 rfc 所说,jwt 是一种在各方之间转移索赔的手段......说一个客户和服务器。因此,根据 rfc,您可以在令牌的有效负载中包含任何内容,但由于用例需要处理动态数据,建议访问服务器以更新用户对象的更改。

以上是关于是否建议将更改的数据存储在 JWT 中的主要内容,如果未能解决你的问题,请参考以下文章

Jwt 令牌如何在登录系统中真正起作用? [关闭]

是否在服务器端存储未解码的 jwt 令牌?

在 ruby​​ 中存储 JWT 的最佳方法

JWT,使用存储在 DB 中的动态密钥

在 Redis 中存储 JWT 令牌的标准做法是啥?

如何在 Angular 8 中存储 jwt 令牌之类的数据?是不是有另一种使用本地存储或会话存储安全存储的方法?