在 nimbus-jose-jwt 中,lifespan 和 refreshTime 有啥区别?

Posted

技术标签:

【中文标题】在 nimbus-jose-jwt 中,lifespan 和 refreshTime 有啥区别?【英文标题】:In nimbus-jose-jwt, what is difference between lifespan and refreshTime?在 nimbus-jose-jwt 中,lifespan 和 refreshTime 有什么区别? 【发布时间】:2021-12-31 01:50:04 【问题描述】:

nimbus-jose-jwt 的 DefaultJWKSetCache 类有两个字段,lifespan 和 refreshTime。 来自 Java 文档 -

lifespan - 缓存的 JWK 设置在过期之前的寿命, 负数表示没有过期。refreshTime - 之后的时间 缓存的 JWK 集被标记为刷新,如果未指定则为负。 应该短于或等于寿命。

这两者有什么区别。 是不是这个意思,寿命到期后,缓存的 JWK 集将被逐出并再次从 jwks 远程 url 加载(说远程 url,因为我正在使用 RemoteJWKSet)。刷新到期后,现有的 JWK 集将使用从远程 url 检索到的密钥进行更新。

但我不明白两者之间的实际区别。两者似乎都在做同样的事情。有人可以更详细地解释细节和任何例子吗?

编辑 - 如果我的生命周期没有到期,而 refreshTime 的到期时间为 1 小时,我是否保证我的密钥将每隔一小时更新一次。

【问题讨论】:

【参考方案1】:

生命周期是DefaultJWKSetCache将驱逐缓存的JWKSet的时间。即,在缓存填充后生命周期时间单位之后,对JWKSetCache.get() 的调用将始终返回null,直到新的JWKSet 存储到缓存中。

refreshTime 是影响JWKSetCache.requiresRefresh() 方法返回值的时间。在填充缓存后经过refreshTime 时间单位,此方法将返回true,否则,它将返回false。此设置不会以任何方式影响缓存行为。

RemoteJWKSet 使用JWKSetCache.requiresRefresh() 返回的值在缓存实际过期之前从远程 URL 重新下载JWKSet。这就是为什么文档建议将 refreshTime 设置为小于 lifespan 的值。

目前,RemoteJWKSetlifespanrefreshTime 已过时触发远程下载JWKSet(请参阅this line。)因此,没有太大区别从今天开始设置其中任何一个。我猜想可以通过将这两个值分开来实现一些更复杂的逻辑。

【讨论】:

再次欢迎并感谢 ++1。我也想和你一样。我看到默认设置寿命为 15 分钟,刷新时间为 5 分钟。并且 jwks 更新请求仅在生命周期到期后发出,而不是在刷新到期后发出。这与你所说的和我自己的假设相反。任何进一步的想法。 Here's small test of the JWKSetCache class 这表明它完全按照我的描述工作。此外,this source line 是 RemoteJWKSet 执行的检查以确定是否需要触发对 JWKS 资源 URL 的请求。尝试使用 HttpURLConnection 日志记录来查看何时触发了请求。这应该说清楚。 我完全同意你的看法,并感谢你所做的测试。我会重新审视我的观察。

以上是关于在 nimbus-jose-jwt 中,lifespan 和 refreshTime 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

使用 nimbus-jose-jwt 时,当请求远程 url 进行缓存更新等时,我可以使用 RemoteJWKSet 找到(参见日志)

编码实战2022年还在用jjwt操作jwt?,推荐你使用nimbus-jose-jwt,爽到飞起~

如何使用 RSA 加密 JWT

springboot 集成jwt

论文阅读:Bringing Old Photos Back to Life

life in the future英语作文