Class: KeycloakSdk::JwksStore
- Inherits:
-
Object
- Object
- KeycloakSdk::JwksStore
- Defined in:
- lib/keycloak_sdk/jwks_store.rb
Overview
DoS-safe JWKS 스토어. Mutex 캐시 + rate-limit + single-flight. 위조 서명(알려진 kid)은 캐시 반환만 하고 재조회를 유발하지 않는다. 미해결 kid(force:true)만 재조회하며, rate-limit gate는 재조회 결정 시점에 stamp한다 (성공 아님 — IdP 장애창에서 위조 kid 폭주에도 재조회를 상한한다). Go/Rust/Python 동형.
Instance Method Summary collapse
-
#initialize(jwks_url:, http:, min_refetch: Config::DEFAULT_JWKS_MIN_REFETCH) ⇒ JwksStore
constructor
⚠️ 기본값을 여기 숫자로 적지 말 것 —
Config가 유일한 정의 자리다. -
#key_set(force: false) ⇒ Object
ruby-jwt jwks: 로더가 호출.
Constructor Details
#initialize(jwks_url:, http:, min_refetch: Config::DEFAULT_JWKS_MIN_REFETCH) ⇒ JwksStore
⚠️ 기본값을 여기 숫자로 적지 말 것 — Config가 유일한 정의 자리다. 이 클래스는 평범한
public 클래스라 소비자가 파사드를 거치지 않고 직접 생성할 수 있고, 예전에는 그 경로가
문서의 30초가 아니라 10초를 받아 IdP를 3배 자주 때렸다(2026-08-13 Task D1).
14 15 16 17 18 19 20 21 |
# File 'lib/keycloak_sdk/jwks_store.rb', line 14 def initialize(jwks_url:, http:, min_refetch: Config::DEFAULT_JWKS_MIN_REFETCH) @jwks_url = jwks_url @http = http @min_refetch = min_refetch @mutex = Mutex.new @cache = nil # {"keys" => [...]} @last_refetch = nil # monotonic seconds end |
Instance Method Details
#key_set(force: false) ⇒ Object
ruby-jwt jwks: 로더가 호출. force=true는 미해결 kid 재조회 요청.
24 25 26 27 28 29 30 31 32 |
# File 'lib/keycloak_sdk/jwks_store.rb', line 24 def key_set(force: false) @mutex.synchronize do return @cache if @cache && !force return @cache if force && !refetch_allowed? @last_refetch = monotonic if force # 결정 시점 stamp(cold load는 예산 미소모) @cache = fetch end end |