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가 이를 충족할 수 있을 때까지 후속 요청이 대기합니다. 그 결과 인증 서비스에 대한 수요가 낮아져 리소스 소비가 줄어듭니다.