--------------------------------------------------------------------------
 resource server profiles: stub
--------------------------------------------------------------------------
One token is decoded first, because the decoder for an issuer-uri is built lazily.
{
    "decoderClass": "org.springframework.security.oauth2.jwt.SupplierJwtDecoder",
    "note": "SupplierJwtDecoder: built lazily on first decode, then cached",
    "resolvedDecoderClass": "org.springframework.security.oauth2.jwt.NimbusJwtDecoder",
    "processor": "com.nimbusds.jwt.proc.DefaultJWTProcessor",
    "keySelector": "com.nimbusds.jose.proc.JWSVerificationKeySelector",
    "jwkSourceChain": [
        {
            "class": "com.nimbusds.jose.jwk.source.JWKSetBasedJWKSource"
        },
        {
            "class": "com.nimbusds.jose.jwk.source.CachingJWKSetSource",
            "timeToLiveMs": 300000,
            "cacheRefreshTimeoutMs": 15000,
            "meaning": "the JWK Set is re-fetched no more often than timeToLive"
        },
        {
            "class": "org.springframework.security.oauth2.jwt.NimbusJwtDecoder$JwkSetUriJwtDecoderBuilder$SpringJWKSource",
            "jwkSetUri": "http://localhost:9000/jwks.json",
            "springCache": "org.springframework.cache.support.NoOpCache",
            "meaning": "no Spring cache supplied, so Nimbus's own cache layer is enabled above"
        }
    ],
    "readMe": "Each entry wraps the next. A layer that is absent was switched off."
}
--------------------------------------------------------------------------
 resource server profiles: stub,springcache
--------------------------------------------------------------------------
One token is decoded first, because the decoder for an issuer-uri is built lazily.
{
    "decoderClass": "org.springframework.security.oauth2.jwt.NimbusJwtDecoder",
    "processor": "com.nimbusds.jwt.proc.DefaultJWTProcessor",
    "keySelector": "com.nimbusds.jose.proc.JWSVerificationKeySelector",
    "jwkSourceChain": [
        {
            "class": "com.nimbusds.jose.jwk.source.JWKSetBasedJWKSource"
        },
        {
            "class": "org.springframework.security.oauth2.jwt.NimbusJwtDecoder$JwkSetUriJwtDecoderBuilder$SpringJWKSource",
            "jwkSetUri": "http://localhost:9000/jwks.json",
            "springCache": "org.springframework.cache.caffeine.CaffeineCache",
            "meaning": "a Spring cache was supplied, so Nimbus's cache layer was disabled and this cache's TTL is the only expiry"
        }
    ],
    "readMe": "Each entry wraps the next. A layer that is absent was switched off."
}
--------------------------------------------------------------------------
 resource server profiles: stub,nottlcache
--------------------------------------------------------------------------
One token is decoded first, because the decoder for an issuer-uri is built lazily.
{
    "decoderClass": "org.springframework.security.oauth2.jwt.NimbusJwtDecoder",
    "processor": "com.nimbusds.jwt.proc.DefaultJWTProcessor",
    "keySelector": "com.nimbusds.jose.proc.JWSVerificationKeySelector",
    "jwkSourceChain": [
        {
            "class": "com.nimbusds.jose.jwk.source.JWKSetBasedJWKSource"
        },
        {
            "class": "org.springframework.security.oauth2.jwt.NimbusJwtDecoder$JwkSetUriJwtDecoderBuilder$SpringJWKSource",
            "jwkSetUri": "http://localhost:9000/jwks.json",
            "springCache": "org.springframework.cache.concurrent.ConcurrentMapCache",
            "meaning": "a Spring cache was supplied, so Nimbus's cache layer was disabled and this cache's TTL is the only expiry"
        }
    ],
    "readMe": "Each entry wraps the next. A layer that is absent was switched off."
}
--------------------------------------------------------------------------
 resource server profiles: stub,hardened
--------------------------------------------------------------------------
One token is decoded first, because the decoder for an issuer-uri is built lazily.
{
    "decoderClass": "org.springframework.security.oauth2.jwt.NimbusJwtDecoder",
    "processor": "com.nimbusds.jwt.proc.DefaultJWTProcessor",
    "keySelector": "com.nimbusds.jose.proc.JWSVerificationKeySelector",
    "jwkSourceChain": [
        {
            "class": "com.nimbusds.jose.jwk.source.JWKSetBasedJWKSource"
        },
        {
            "class": "com.nimbusds.jose.jwk.source.RefreshAheadCachingJWKSetSource",
            "timeToLiveMs": 300000,
            "cacheRefreshTimeoutMs": 15000,
            "meaning": "the JWK Set is re-fetched no more often than timeToLive"
        },
        {
            "class": "com.nimbusds.jose.jwk.source.RateLimitedJWKSetSource",
            "minTimeIntervalMs": 30000,
            "meaning": "forced refreshes are throttled to this interval"
        },
        {
            "class": "com.nimbusds.jose.jwk.source.OutageTolerantJWKSetSource",
            "meaning": "a stale JWK Set is served if the issuer is unreachable"
        },
        {
            "class": "com.nimbusds.jose.jwk.source.RetryingJWKSetSource"
        },
        {
            "class": "com.nimbusds.jose.jwk.source.URLBasedJWKSetSource"
        }
    ],
    "readMe": "Each entry wraps the next. A layer that is absent was switched off."
}
