배경
keycloak을 k8s headless service로 운영하고, 앞단에 nginx proxy 서버를 두는 구조에서 클라이언트 쪽에서 아래 메시지와 함께 에러가 발생했다.
upstream sent too big header while reading response header from upstream
Syntax: client_header_buffer_size size;
Default: client_header_buffer_size 1k;
Context: http, server
그러면서 502 Gateway Error가 나는 문제였다.
원인
클라이언트에서 nextAuth.js 라는 라이브러리를 사용하고 있었는데, keycloak에서 내보내는 3가지 쿠키(KEYCLOAK_SESSION, KEYCLOAK_IDENTITY, AUTH_SESSION_ID)에 포함된 JWT를 JWE로 암호화하고 있었다. 그러면서 header가 너무 길어지면서 nginx에서 header를 처리하지 못하고 있는 상황이였다.
해결 과정
결론적으로는 DevOps 팀에서 nginx 서버의 header 설정에서 크기를 늘려서 해결했다. 아래처럼 설정을 변경해주었다.
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
백엔드 서버에서 점검한 내용은 아래와 같다.
1. cookie 사이즈 줄이기(JWT 사이즈 줄이기)
요청을 하는 client의 jwt상 client scopes에서 불필요한 내용들을 모두 삭제했다. 이전 글(https://whitepro.tistory.com/1119)에서 다룬 것과 같이, client 측에서 사용하는 roles를 모두 제거하고, 기본으로 설정된 불필요한 claim 들을 모두 제거하여 최소화를 시도했다.
2. 쿠키 설정 확인
쿠키설정은 Secure, samesite=None인 상태였다. Https 요청을 받아서 프록시단에서 TLS Termination을 처리해서 그런지, 문제없이 쿠키를 전송하고 있었고, keycloak에 등록된 client는 example.com인데 반해 요청을 보내는 client의 실제 도메인은 example.co.kr이였는데 samtesite=None이라서 그런지 문제가 되지는 않고 있었다.
프론트엔드에서 nextAuth에서 JWT -> JWE로 암호화하는 과정을 확인해주기로 하였으나, 적절한 답변은 못들었다. DevOps측의 header 크기 적용으로 인해 해당 과정을 확인하는 것은 다음으로 미뤄진 것 같았다.
'Programming-[Backend] > Keycloak' 카테고리의 다른 글
keycloak v26.1.2 image build issue( w/ Docker engine 28.x.x) (1) | 2025.04.28 |
---|---|
Keycloak Infinispan 통신 방식 정리: udp, jdbc-ping, kubernetes (0) | 2025.04.27 |
Keycloak 성능 테스트 - 특정 url 호출 확인(userinfo) (0) | 2025.04.23 |
Keycloak CODE_TO_TOKEN_ERROR: cookie와 roles (0) | 2025.04.21 |
keycloak benchmark 성능 테스트 w/ kubernetes (0) | 2025.04.03 |