Spring Security中JWT Decoder是否会被每个请求调用?
Spring Security中JWT解码器的JWKS端点调用疑问
我的实现代码
JWT解码器配置
@Configuration internal class JwtConfig( private val serverProperties: ServerProperties, ) { @Bean // for decoding JWT tokens fun jwtDecoder() : ReactiveJwtDecoder { return NimbusReactiveJwtDecoder .withJwkSetUri(serverProperties.auth0JwKeySetUri) .build() } }
其中jwkseturi是提供用于验证签名的JWT公钥的外部端点。
认证管理器使用方式
val jwtAuthManager = JwtReactiveAuthenticationManager(jwtDecoder) jwtAuthManager.setJwtAuthenticationConverter(jwtTokenConverter)
随后将其接入Spring Security主链路中。
疑问
该外部端点是否会被每个请求调用?如果是,是否会像不透明令牌的令牌introspection那样消耗大量资源?
回答
不会每个请求都调用外部JWKS端点,NimbusReactiveJwtDecoder默认会对JWK集进行缓存,以此避免重复请求带来的资源消耗。
具体细节:
- 首次处理带JWT的请求时,解码器会调用JWKS端点获取公钥集,并将其缓存
- 后续所有请求都会直接使用缓存中的公钥验证JWT签名,无需再调用外部端点
- 缓存具备自动刷新机制:当遇到的JWT签名密钥不在缓存内,或者缓存的JWK集已过期时,才会重新请求外部端点
和不透明令牌的令牌introspection机制不同:introspection通常需要每个请求都调用授权服务器验证令牌有效性,而JWT是基于缓存公钥的本地验证,资源消耗要低很多。
内容的提问来源于stack exchange,提问作者Sachin
相关产品推荐
相关产品推荐

