NGINX Plus API Gateway – JSON 캐싱 더 빠른 JWT 인증

지난 『NGINX Plus API Gateway로 JWT 인증 구현』 사례에서 NGINX JWT 인증을 구현하는 방법에 대해 다뤘습니다. 이번에는 JWT 인증에 JSON 캐싱을 적용하는 방법을 살펴보겠습니다.

JSON 웹 키 세트 캐싱으로 더 빠른 JWT 검증

JSON Web Tokens의 유효성을 검사할 때 NGINX는 JWKS(JSON Web Key Set)를 사용하여 토큰의 서명을 확인하거나 토큰을 해독합니다. JWKS는 구성 파일에 저장하거나 HTTP 요청을 통해 외부 서비스에서 얻을 수 있습니다. 또한 메모리에 JWKS를 캐싱하면 다음과 같은 몇 가지 이점이 있습니다.

  • CPU 사용량의 상당한 감소
  • 요청 지연 시간 감소
  • 캐싱 프로세스의 일부로 JWKS 키가 JSON에서 암호화 작업에 최적화된 바이너리 형식으로 변환되기 때문에 JWT 유효성 검사 간소화

JWKS를 메모리에 캐시하려면 새 auth_jwt_key_cache 지시문을 포함하고 각 키 세트의 만료 시간(이 예에서는 3시간)을 지정합니다.

http {
    server {
        listen       127.0.0.1:8080;

        auth_jwt "closed site";
        auth_jwt_key_cache 3h; 
        auth_jwt_key_file conf.d/jwk.json;
  
        location / {
            proxy_pass http://my_backend;
        }	
    }
}

외부 서버에서 JWK를 가져오는 경우 표준 콘텐츠 캐싱을 구성하고 NGINX Plus가 백그라운드에서 새로고침되는 동안 만료된 JWKS를 계속 제공하도록 지시하는 proxy_cache_use_stale 지시문을 포함하는 것이 좋습니다.

http {
    proxy_cache_path /var/cache/nginx/jwk levels=1 keys_zone=jwk:64k max_size=1m;

    server {
        listen       127.0.0.1:8080;

        auth_jwt "closed site";
        auth_jwt_key_cache 3h; 
        auth_jwt_key_request /_jwks_uri;
  
        location / {
            proxy_pass http://my_backend;
        }
        location = /_jwks_uri {
            internal;
            proxy_cache jwk;                              # Cache the JWK Set recieved from IdP
            proxy_cache_valid 200 12h;                    # How long to consider keys "fresh"
            proxy_cache_use_stale error timeout updating; # Use old JWK Set if cannot reach IdP
            proxy_ssl_server_name on;                     # For SNI to the IdP
            proxy_method GET;                             # In case client request was non-GET
            proxy_set_header Content-Length "";           # ''
            proxy_pass https://idp-jwk-endpoint;
            proxy_ignore_headers Cache-Control Expires Set-Cookie; # Does not influence caching
        }
    }
}

JWKS 캐싱 외에 콘텐츠 캐싱의 이점은 두 가지입니다.

  • 복원력  – JWKS는 만료된 경우에도 Cache에서 검색할 수 있습니다. 이렇게 하면 JWKS 공급자를 일시적으로 사용할 수 없는 경우 복원력이 증가합니다.
  • 권한 부여 서버에  미치는 영향 – 캐시된 JWKS의 만료는 JWKS 캐싱이 단독으로 사용되는지 또는 콘텐츠 캐싱과 함께 사용되는지에 따라 인증 서버에 다르게 영향을 줍니다.
    • JWKS 캐싱만 사용하면 Cache가 만료된 JWKS의 새 버전으로 다시 채워질 때까지 들어오는 모든 권한 부여 요청이 인증 서버로 전달됩니다. 인증 서버가 느리게 응답하면 JWKS에 대한 반복 HTTP 요청이 갑자기 증가할 수 있습니다. 이 추가 부하는 인증 서비스를 압도하여 문제를 악화시킬 수 있습니다.
    • 만료된 JWKS 제공과 함께 콘텐츠 캐싱이 활성화된 경우 JWKS에 대한 하나의 요청만 인증 서버로 전달되고 콘텐츠 Cache가 채워진 후 NGINX가 이를 충족할 수 있을 때까지 후속 요청이 대기합니다. 그 결과 인증 서비스에 대한 수요가 낮아져 리소스 소비가 줄어듭니다.