본문으로 건너뛰기

BUMDAY · ENGINEERING NOTES

개발의 과정과
문제 해결의 기록.

직접 만들고, 부딪히고, 배운 것들을 기록합니다.

Record/Trubble Shooting

운영 배포 후에만 외부 인증 콜백에서 세션 정보를 잃어버린 사례

범데이 2026. 10. 26. 00:27

외부 인증 서비스(제3자 도메인)와 연동하는 콜백 기능이 개발환경에서는 정상 동작했지만, 운영 배포 후에는 콜백에서 세션 정보를 찾지 못해 매번 실패했다. 최종 원인은 세션 쿠키에 걸려 있던 SameSite=Strict 옵션이었고, 이를 Lax로 완화해 해결했다.

증상

  • 로그인/본인인증처럼 외부 도메인으로 이동했다가 인증 완료 후 자사 서버로 되돌아오는 콜백 기능에서, 콜백 시점에 "세션 정보가 없습니다" 류의 예외가 발생했다
  • 개발 환경(단일 WAS)에서는 같은 시나리오가 정상 동작했다
  • 운영 환경(다중 WAS 이중화 구성) 배포 후에는 매번 실패로 재현됐다
  • 처음에는 WAS 이중화(로드밸런서가 인증 시작 시점과 콜백 시점에 서로 다른 WAS 노드로 라우팅해서 세션 공유가 안 되는 것)를 의심했다

어떻게 좁혔나

1) 인증 시작 시점과 콜백 시점 각각에 세션ID와 처리한 WAS 노드 식별값을 로그로 남겨 재현했다

2) 두 시점의 세션ID와 노드가 실제로 다르게 찍혀, 처음 의심(노드 라우팅 불일치)이 맞는 것처럼 보였다

3) 로드밸런서 설정을 다시 확인한 결과 sticky routing(같은 사용자는 항상 같은 노드로)이 정상 동작 중이었다 — 라우팅 자체는 문제가 아니었다

4) 인증 시작부터 콜백까지 강제로 같은 노드에서만 처리되도록 재현해도 여전히 세션 정보가 비어 있는 것을 확인했다 — 노드가 달라서가 아니라 애초에 콜백 요청에 세션 쿠키 자체가 실려 오지 않은 것으로 결론지었다

5) 브라우저 개발자도구로 콜백 요청의 헤더를 직접 확인한 결과, 세션 쿠키가 아예 전송되지 않고 있었다

6) 같은 도메인 계열의 다른 정상 서비스 쿠키와 비교한 결과, 문제가 된 서비스의 쿠키에만 SameSite=Strict가 붙어 있었고, 정상 서비스는 값이 비어 있어(브라우저 기본값 Lax) 문제가 없었다

원인

콜백은 외부 도메인에서 자사 서버로 돌아오는 크로스사이트 최상위 이동(top-level navigation) 이다. SameSite=Strict 쿠키는 이런 크로스사이트 이동에서 브라우저가 아예 전송하지 않는다(Lax였다면 GET 최상위 이동에는 전송된다).

세션 쿠키에 SameSite=Strict가 걸려 있던 것은 애플리케이션 코드가 직접 설정한 값이 아니라 WAS 설정(컨텍스트의 쿠키 옵션) 에서 온 것이었다. 개발 환경에서 증상이 재현되지 않았던 것은 그 설정 값이 환경마다 다르게 적용되어 있었기 때문으로 추정된다.

해결

WAS 세션 쿠키의 SameSite 옵션을 Strict에서 Lax로 변경했다. 애플리케이션 코드는 건드리지 않고 WAS 설정(쿠키 옵션)만 수정했으며, 변경 후 동일 시나리오로 재현 테스트해서 콜백이 정상적으로 세션을 찾는 것을 확인했다.

정리

  1. 외부 도메인을 오가는 콜백/리다이렉트 기능은 세션 쿠키의 SameSite 옵션을 반드시 점검한다 — Strict면 크로스사이트 콜백에서 세션이 소실될 수 있다
  2. 증상이 "다중 WAS 이중화 환경에서만 재현"되면 라우팅 문제로 먼저 의심하기 쉽지만, 실제로는 쿠키 자체가 전송되지 않는 문제일 수 있다 — 같은 노드로 고정해서 재현되는지부터 확인하면 가설을 빠르게 좁힐 수 있다
  3. 브라우저 개발자도구에서 실제 요청 헤더에 쿠키가 실려 오는지 직접 확인하는 것이 가장 확실한 검증 방법이다
  4. 개발 환경에서 재현이 안 된다고 안심하지 말고, 운영과 동일한 크로스사이트 콜백 시나리오로 별도 검증이 필요하다

참고

옵션동작
Strict같은 사이트에서 시작된 요청에만 쿠키 전송. 외부 도메인에서 넘어오는 콜백·리다이렉트에는 전송되지 않음
Lax크로스사이트라도 GET 방식의 최상위 이동(주소 이동, 리다이렉트)에는 전송됨
None모든 크로스사이트 요청에 전송되지만 Secure(HTTPS) 속성이 필수

일부 WAS는 컨텍스트 설정에서 쿠키의 SameSite 옵션을 직접 지정할 수 있다. 이 옵션을 지원하지 않는 WAS라면, 응답 헤더를 감싸는 필터를 추가해 Set-Cookie 헤더에 SameSite 속성이 없을 때 애플리케이션 레벨에서 강제로 붙여주는 방식으로도 대응할 수 있다.

728x90
반응형