JWT 令牌中应该包含多少配置文件数据?

Posted

技术标签:

【中文标题】JWT 令牌中应该包含多少配置文件数据?【英文标题】:How much profile data should go in a JWT token? 【发布时间】:2020-11-08 12:44:08 【问题描述】:

我将 JWT 用于我的 Node+Express API 的路由保护;我通常将用户的个人资料信息存储在 jwt 令牌中,除非是粒度 PII。但我想知道这方面的最佳做法是什么。

我有以下用户架构(猫鼬):

USER 
 _id: ObjectID,
 userName: string,
 img: string,
 email: string,
 role: string

我可能不想将 img 放入 JWT 负载中以避免不必要的哈希成本,但我可以在 JWT 负载中放入哪些其他信息/属性?

-- 大型 JWT 是否存在性能限制因素?

我见过一些人只使用 _idusername 属性,但我希望有一个我坚持的标准,以保持一切美观和统一。

谢谢! :)

【问题讨论】:

【参考方案1】:

您应该在您的 JWT 令牌中放入足够的信息来验证您的用户,而无需发出额外的数据库请求。这就是有效载荷的全部意义——这样就可以分发身份验证。如果您需要发出数据库请求来对每个 API 调用进行身份验证,那么您还没有实现分发,因为您仍将在数据库中集中您的身份验证过程。

但是,请注意,您放入 JWT 令牌的所有内容都是公开的。任何人都可以对令牌进行 base64 解码以提取有效负载。因此,如果您不经常使用它(对于每个 API 调用),我建议不要在有效负载中包含您的用户的电子邮件地址。恶意脚本可能会以某种方式访问​​令牌并获取电子邮件地址(这确实有价值并且可以出售给“电子邮件营销人员”)。用户的 ID 应该足以识别用户。

如果您的 UI 需要显示用户名,那么您也可以包含该名称,但我个人会将其委托给配置文件 API 调用(我通常为此实现 /myself 端点)。

我还将用户的角色包含在有效负载中,以避免需要查询数据库以检查用户是否有权进行 API 调用。

【讨论】:

谢谢!你提出了一些非常好的建议。您对跨端脚本的看法也是正确的!我绝对不想暴露任何不必要的东西。但这听起来不错。我将包括用户 ID 和角色,仅此而已。感谢您的建议!

以上是关于JWT 令牌中应该包含多少配置文件数据?的主要内容,如果未能解决你的问题,请参考以下文章

WSO2IS 5.10 自定义 JWT 令牌颁发者未在服务提供者配置中列出

如何在.net6webapi中配置Jwt实现鉴权验证

更新 Azure IDP 配置,使刷新令牌采用 JWT 格式

如何配置多模块spring应用

如何在 JWT 令牌中包含声明?

Angular 2 和 JWT 身份验证 (Auth0)