我需要为每个用户单独管理 jwt 密钥吗?

Posted

技术标签:

【中文标题】我需要为每个用户单独管理 jwt 密钥吗?【英文标题】:I need to manage jwt secret keys individually for each user? 【发布时间】:2018-02-17 02:47:59 【问题描述】:

我使用 jsonwebtoken 模块实现了 jwt 身份验证。但是在生成和验证 jwt 令牌时,我是否需要为每个用户创建和管理任意密钥?为每个用户单独管理密钥与使用一个密钥生成和验证 jwt 令牌之间有区别吗?

【问题讨论】:

【参考方案1】:

不,您使用单个密钥来签署您的令牌。这是因为当令牌在请求中返回给您时,您需要能够解码令牌,此时您不知道是否是真正的用户发送您的令牌,因为您还没有验证它.

使用单一密钥来签署和验证您的令牌,并记得妥善保管。

【讨论】:

从技术上讲,没有什么能阻止您在检查签名之前解析 JWT 令牌的标头和/或负载。然而,在这个阶段不能信任令牌。 非常感谢!!罗斯柴尔德,卡西奥·马佐奇·莫林【参考方案2】:

为每个用户单独管理密钥与使用一个密钥生成和验证 jwt 令牌之间有区别吗?

简短的回答是否定的,就 JWT 而言,密钥就是密钥。

长答案是视情况而定。 JWT secret 的目的是确保消息的完整性,通常这是您在颁发者(服务器)级别执行的操作,作为验证消息来源的一种方式。通俗地说,如果服务器可以验证签名,那么它就可以信任内容。

用户级别的机密将信任降低了一个级别,因为您不关心哪个服务器生成了消息,而是关心哪个 用户 生成了消息。在典型的身份验证令牌场景中,您确实需要更多的服务器信任。

【讨论】:

【参考方案3】:

不,您绝对不需要每个用户都有一个密钥。在大多数情况下,一个密钥对所有用户来说就足够了。

如果您愿意,您可以拥有一组不同的密钥并定期轮换它们以签署令牌。在这种情况下,使用kid 标头声明来保存密钥标识符,然后使用它查找正确的密钥以验证令牌。在answer 中查看更多详细信息。

【讨论】:

非常感谢!!卡西奥·马佐奇·莫林

以上是关于我需要为每个用户单独管理 jwt 密钥吗?的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 jwt 在微服务中进行身份验证

验证 API 密钥和 JWT 令牌是微服务的责任吗?

各种微服务中 JWT 的共享签名密钥

如果使用 JWT,我需要 CSRF 吗?

JWT 如何消除对每个请求进行数据库查找的需要?