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 是否存在性能限制因素?
我见过一些人只使用 _id 和 username 属性,但我希望有一个我坚持的标准,以保持一切美观和统一。
谢谢! :)
【问题讨论】:
【参考方案1】:您应该在您的 JWT 令牌中放入足够的信息来验证您的用户,而无需发出额外的数据库请求。这就是有效载荷的全部意义——这样就可以分发身份验证。如果您需要发出数据库请求来对每个 API 调用进行身份验证,那么您还没有实现分发,因为您仍将在数据库中集中您的身份验证过程。
但是,请注意,您放入 JWT 令牌的所有内容都是公开的。任何人都可以对令牌进行 base64 解码以提取有效负载。因此,如果您不经常使用它(对于每个 API 调用),我建议不要在有效负载中包含您的用户的电子邮件地址。恶意脚本可能会以某种方式访问令牌并获取电子邮件地址(这确实有价值并且可以出售给“电子邮件营销人员”)。用户的 ID 应该足以识别用户。
如果您的 UI 需要显示用户名,那么您也可以包含该名称,但我个人会将其委托给配置文件 API 调用(我通常为此实现 /myself
端点)。
我还将用户的角色包含在有效负载中,以避免需要查询数据库以检查用户是否有权进行 API 调用。
【讨论】:
谢谢!你提出了一些非常好的建议。您对跨端脚本的看法也是正确的!我绝对不想暴露任何不必要的东西。但这听起来不错。我将包括用户 ID 和角色,仅此而已。感谢您的建议!以上是关于JWT 令牌中应该包含多少配置文件数据?的主要内容,如果未能解决你的问题,请参考以下文章
WSO2IS 5.10 自定义 JWT 令牌颁发者未在服务提供者配置中列出