동일 Host에서 다른 포트의 두 프로젝트 간 POST 요청 시 세션 충돌 문제 해결 방법 도메인 변경
문제 상황
개발 환경에서 localhost를 기반으로 두 개의 프로젝트를 실행하고 있었습니다:
- Frontend 프로젝트: localhost:8081
- Admin 프로젝트: localhost:8080
이 두 프로젝트에서 POST 방식으로 데이터를 전송할 때마다 사용자가 강제로 로그아웃되는 현상이 반복되었습니다.
문제 원인
브라우저는 기본적으로 쿠키를 도메인 + 포트 단위로 관리합니다.
localhost는 브라우저에서 특별한 호스트로 처리되며, 같은 localhost에서 포트가 다른 경우에도 쿠키가 공유되지 않습니다.
때문에 POST 요청을 보낼 때마다 세션이 초기화되었습니다.
문제 해결 방법
이 문제를 해결하기 위해 아래 두 가지 접근 방식을 사용할 수 있습니다
방법 1: 도메인 분리를 통한 세션 충돌 해결
방법 설명
두 프로젝트에 도메인을 설정하면 브라우저가 이를 별개의 사이트로 인식하여 쿠키를 독립적으로 관리합니다.
해결 과정
- hosts 파일 수정
- Windows 환경에서는 C:\Windows\System32\drivers\etc\hosts 파일을 열어 다음 내용을 추가했습니다:
127.0.0.1 front.co.kr
127.0.0.1 admin.co.kr
-
- localhost가 아니기 때문에 하나의 별도 도메인만 설정해도 된다.
- 2개의 도메인을 별도 설정하여, form action 설정시 도메인을 설정해서 보내도 되었습니다.
왜 localhost라서 문제였을까?
- 포트 기반 세션 격리
- localhost에서는 브라우저가 포트별로 쿠키를 관리하기 때문에, 두 포트 간 세션이 공유되지 않았습니다.
- 루프백 호스트 특성
- localhost는 일반적인 도메인이 아니므로, 브라우저가 더 엄격하게 관리하며, 세션 쿠키 공유가 어렵습니다.
- 도메인 설정으로 문제 해결
- admin.co.kr과 같은 정식 도메인을 설정하면, 브라우저가 이를 별도의 사이트로 간주해 쿠키 충돌 문제가 해결됩니다.
방법 2: Tomcat 세션 쿠키 이름 변경
방법 설명
기본적으로 Tomcat은 세션 관리를 위해 **JSESSIONID**라는 쿠키 이름을 사용합니다.
다른 포트를 사용하는 두 프로젝트가 같은 쿠키 이름을 사용하면 브라우저가 이를 혼동할 수 있습니다.
이를 방지하기 위해 각 프로젝트의 쿠키 이름을 다르게 설정합니다.
해결 과정
1. Tomcat의 context.xml 수정
각 프로젝트의 META-INF/context.xml 파일에 다음과 같이 sessionCookieName 속성을 추가하여 세션 쿠키 이름을 변경합니다
<Context>
<Manager sessionCookieName="JSESSIONID_ADMIN" />
</Context>
<Context>
<Manager sessionCookieName="JSESSIONID_FRONT" />
</Context>
2. Tomcat의 server.xml 수정 (옵션)
여러 애플리케이션을 관리하는 경우, Tomcat의 server.xml 파일을 수정하여 세션 쿠키 이름을 Context 단위로 설정할 수 있습니다.
<Host name="localhost" appBase="webapps">
<Context path="/admin" docBase="admin" reloadable="true">
<Manager sessionCookieName="JSESSIONID_ADMIN" />
</Context>
<Context path="/front" docBase="front" reloadable="true">
<Manager sessionCookieName="JSESSIONID_FRONT" />
</Context>
</Host>
3. Spring Boot 프로젝트에서의 설정
Spring Boot 기반 프로젝트라면, application.properties 또는 application.yml 파일에서 세션 쿠키 이름을 설정할 수 있습니다.
- application.properties 설정
server.servlet.session.cookie.name=JSESSIONID_ADMIN
- application.yml 설정
server:
servlet:
session:
cookie:
name: JSESSIONID_FRONT
각 프로젝트에서 쿠키 이름을 다르게 설정하면 Tomcat 설정을 수정하지 않아도 세션 충돌 문제를 해결할 수 있습니다
두 가지 방법 비교
도메인 분리 설정 | Tomcat 세션 쿠키 이름 변경 | |
설정 난이도 | 간단 (hosts 파일 수정 필요) | 약간 복잡 (Tomcat 설정 파일 수정 필요) |
적용 대상 | 도메인 기반 (정식 도메인 사용 가능) | 로컬 개발 환경에서 효과적 |
세션 독립성 보장 | 완벽히 독립적 | 쿠키 이름으로만 독립 관리 |
추가 설정 필요 여부 | CORS 및 크로스 도메인 요청에 대한 추가 설정 필요 | 추가 설정 없이 로컬 환경에서 바로 적용 가능 |
다음 포스팅에선 세션과 쿠키 , CORS 에러에 대해 포스팅해보겠습니다