카테고리 없음

🔐 Spring Boot + Redis + Nginx에서 도메인 간 세션 공유

백봉 2025. 6. 19. 11:06

📌 문제 상황

두 개의 스프링 부트 프로젝트가 각각 다른 도메인으로 운영될 때,

사용자가 인증 서버에서 로그인하면 메인 서비스로 리디렉션되지만, 세션이 공유되지 않아 로그인 상태가 유지되지 않는 문제가 발생한다.


🧩 원인 분석

  1. 기본적으로 브라우저는 서로 다른 서브도메인 간 쿠키를 공유하지 않음
  2. **Spring Session(Redis)**을 사용하더라도, 클라이언트가 동일한 SESSION 쿠키를 보내지 않으면 서버는 세션을 복원할 수 없음
  3. **리버스 프록시(Nginx Proxy Manager)**가 쿠키를 잘못 전달하거나 Domain, SameSite 속성이 누락되면 세션 공유는 무산됨

✅ 해결 방법

1. Nginx Proxy Manager에서 설정

대상 Proxy Host → Advanced 탭 → 아래 설정 추가

proxy_cookie_path / "/; Secure; HttpOnly; SameSite=None; Domain=.pks1.co.kr";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;

🔍 설명

설정 설명

proxy_cookie_path 쿠키의 도메인을 .pks1.co.kr로 강제 지정 → 모든 서브도메인 공유 가능
Secure + SameSite=None 크로스 도메인 쿠키 전송 허용 (HTTPS 환경 필수)
proxy_set_header 실제 요청 정보를 원본 서버에 정확히 전달하기 위한 필수 헤더 설정

2. Redis 세션 네임스페이스 통일

application.properties 또는 application.yml에서 양쪽 모두 동일하게 설정

spring.session.store-type=redis
spring.session.redis.namespace=pks-session

✅ 포인트: spring.session.redis.namespace가 다르면 Redis 키가 달라져서 세션 공유 안 됨


✨ 보너스: 쿠키 설정 없이도 되는 이유

  • 위에서 Nginx가 Set-Cookie를 강제 재작성해주기 때문에

Spring Boot 단에서는 server.servlet.session.cookie.domain, same-site, secure 설정이 없어도 실제 전달되는 쿠키에는 정상 속성이 포함됨

 

🧪 테스트 방법

  • dev-auth 로그인 후 → dev-www 리디렉션 → SESSION 쿠키가 그대로 유지되는지 확인
  • 브라우저의 Network → Headers → Cookie 또는 Application → Cookies 탭에서 확인 가능