jti 声明应该多久重新生成一次?

Posted

技术标签:

【中文标题】jti 声明应该多久重新生成一次?【英文标题】:How often should the jti claim be regenerated? 【发布时间】:2019-09-27 06:47:28 【问题描述】:

我正在我的 REST API 中实现基于 JWT 的身份验证系统,并希望在令牌中使用 JWT_ID 声明。根据Auth0,JWT ID 允许一个令牌使用一次:

jti(JWT ID):唯一标识;可用于防止 JWT 正在重放(允许一个令牌只使用一次)

我想知道 JWT ID 应该多久重新生成一次?

在每个请求中 仅在登录时 令牌刷新时(如果使用刷新令牌系统)

注意:我没有使用 Auth0 进行身份验证。

【问题讨论】:

【参考方案1】:

请记住,jti 声明用法是可选,因此您根本不需要使用它。但是,当您需要在白名单或黑名单中跟踪令牌时,它非常有用。

我想知道 JWT ID 应该多久重新生成一次?

我不知道你说的 regenerate 是什么意思。

应在生成令牌时分配jti 声明的值。一旦令牌是signed,就没有办法在不使签名失效的情况下修改它。因此,如果您在每个请求中为令牌分配一个新 id,则必须再次签署该令牌,因此您最终会为每个请求获得一个新令牌。

以下是jti 声明在RFC 7519 中的定义方式:

4.1.7. jti (JWT ID) Claim

jti(JWT ID)声明为 JWT 提供了唯一标识符。标识符值的分配方式必须确保相同的值被意外分配给不同的数据对象的概率可以忽略不计;如果应用程序使用多个发行者,则必须防止不同发行者产生的值之间的冲突。 jti 声明可用于防止 JWT 被重放。 jti 值是区分大小写的字符串。使用此声明是可选的。


底线

根据我对您的用例的了解,在客户端进行身份验证和客户端刷新令牌时发出新令牌(具有唯一 ID,例如 UUID)是有意义的。

值得一提的是,jti 声明本身对令牌重放没有任何作用。但是,它为您提供了识别令牌并在白名单或黑名单中跟踪它们的方法。

【讨论】:

是的,这绝对是一个可选声明,但我需要将它用于与您提到的相同目的。因此,在这种情况下,我应该仅在 JTI 发布时分配一个 JTI,这可能是在登录期间或刷新令牌时,但不是在每个请求时。我猜对了吗? @Ayan 服务器发出签名令牌后,如果不使签名无效,就无法修改它。因此,如果您在每个请求中为令牌分配一个新 id,则必须再次签署该令牌,因此您最终会在每个请求中获得一个新令牌。 感谢您的提醒,因为我的想法不正确。是的,这最终会在每个请求上刷新我的令牌,这可能会给 CPU 带来负担。 @Ayan 根据我对您的用例的了解,在客户端进行身份验证和客户端刷新令牌时发出新令牌(具有唯一 ID)是有意义的。 是的,您在识别我的用例方面是正确的。但是 JTI 如何缓解重放攻击呢?【参考方案2】:

jwt_id 只能在登录令牌刷新时生成。最好使用 expireInma​​xAge 来量化令牌的有效期。

【讨论】:

以上是关于jti 声明应该多久重新生成一次?的主要内容,如果未能解决你的问题,请参考以下文章

JWT jti 唯一性

使用 JWT 令牌的 jti 声明作为不透明令牌

ESLint prefer-const 规则声明变量应该是 Const,即使它被重新分配

以 Clover XML 格式生成代码覆盖率报告...致命错误:无法重新声明 preprocessGrammar()

MySQL 数据多久刷一次盘?

Joomla:一次为所有文章重新生成别名?