在 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 的值。
目前,RemoteJWKSet
在 lifespan 或 refreshTime 已过时触发远程下载JWKSet
(请参阅this line。)因此,没有太大区别从今天开始设置其中任何一个。我猜想可以通过将这两个值分开来实现一些更复杂的逻辑。
【讨论】:
再次欢迎并感谢 ++1。我也想和你一样。我看到默认设置寿命为 15 分钟,刷新时间为 5 分钟。并且 jwks 更新请求仅在生命周期到期后发出,而不是在刷新到期后发出。这与你所说的和我自己的假设相反。任何进一步的想法。 Here's small test of theJWKSetCache
class 这表明它完全按照我的描述工作。此外,this source line 是 RemoteJWKSet
执行的检查以确定是否需要触发对 JWKS 资源 URL 的请求。尝试使用 HttpURLConnection
日志记录来查看何时触发了请求。这应该说清楚。
我完全同意你的看法,并感谢你所做的测试。我会重新审视我的观察。以上是关于在 nimbus-jose-jwt 中,lifespan 和 refreshTime 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
使用 nimbus-jose-jwt 时,当请求远程 url 进行缓存更新等时,我可以使用 RemoteJWKSet 找到(参见日志)
编码实战2022年还在用jjwt操作jwt?,推荐你使用nimbus-jose-jwt,爽到飞起~