개발(0)/Java

동일 Host에서 다른 포트의 두 프로젝트 간 POST 요청 시 세션 충돌 문제 해결 방법 도메인 변경

까만밀가루 2025. 1. 13. 06:22

문제 상황

개발 환경에서 localhost를 기반으로 두 개의 프로젝트를 실행하고 있었습니다:

  • Frontend 프로젝트: localhost:8081
  • Admin 프로젝트: localhost:8080

이 두 프로젝트에서 POST 방식으로 데이터를 전송할 때마다 사용자가 강제로 로그아웃되는 현상이 반복되었습니다.

문제 원인

브라우저는 기본적으로 쿠키를 도메인 + 포트 단위로 관리합니다.
localhost는 브라우저에서 특별한 호스트로 처리되며, 같은 localhost에서 포트가 다른 경우에도 쿠키가 공유되지 않습니다.

때문에 POST 요청을 보낼 때마다 세션이 초기화되었습니다.

 


 

문제 해결 방법

이 문제를 해결하기 위해 아래 두 가지 접근 방식을 사용할 수 있습니다


방법 1: 도메인 분리를 통한 세션 충돌 해결

방법 설명

두 프로젝트에 도메인을 설정하면 브라우저가 이를 별개의 사이트로 인식하여 쿠키를 독립적으로 관리합니다.

해결 과정

  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라서 문제였을까?

  1. 포트 기반 세션 격리
    • localhost에서는 브라우저가 포트별로 쿠키를 관리하기 때문에, 두 포트 간 세션이 공유되지 않았습니다.
  2. 루프백 호스트 특성
    • localhost는 일반적인 도메인이 아니므로, 브라우저가 더 엄격하게 관리하며, 세션 쿠키 공유가 어렵습니다.
  3. 도메인 설정으로 문제 해결
    • 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>
 
 
이 설정으로 각 프로젝트에서 고유한 이름의 세션 쿠키(JSESSIONID_ADMIN과 JSESSIONID_FRONT)를 사용하게 됩니다.
 
 

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>
 
이 설정으로 Tomcat은 /admin 경로의 프로젝트에는 JSESSIONID_ADMIN, /front 경로의 프로젝트에는 JSESSIONID_FRONT를 사용하도록 설정합니다.
 

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 에러에 대해 포스팅해보겠습니다