카테고리 없음
🔐 Spring Boot + Redis + Nginx에서 도메인 간 세션 공유
백봉
2025. 6. 19. 11:06
📌 문제 상황
두 개의 스프링 부트 프로젝트가 각각 다른 도메인으로 운영될 때,
- https://dev-www.pks1.co.kr (Web 서비스)
- https://dev-auth.pks1.co.kr (OAuth 인증 서버)
사용자가 인증 서버에서 로그인하면 메인 서비스로 리디렉션되지만, 세션이 공유되지 않아 로그인 상태가 유지되지 않는 문제가 발생한다.
🧩 원인 분석
- 기본적으로 브라우저는 서로 다른 서브도메인 간 쿠키를 공유하지 않음
- **Spring Session(Redis)**을 사용하더라도, 클라이언트가 동일한 SESSION 쿠키를 보내지 않으면 서버는 세션을 복원할 수 없음
- **리버스 프록시(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 탭에서 확인 가능