JBoss EAP 7 도입 시 JSESSIONID 뒤에 예상치 못한 문자열(서버명, 그룹명 등)이 붙거나 길이가 늘어나는 현상을 분석합니다. 이는 Undertow 엔진의
JvmRouteHandler동작 방식 때문이며, 이를 제어하기 위한 설정 방법을 정리합니다.
1. 이슈 현상 및 원인 분석 (Context)
EAP 6와 EAP 7은 세션 ID를 생성하고 관리하는 방식에 차이가 있습니다. 특히 클러스터링 환경에서 Sticky Session(세션 고정)을 위해 ID 뒤에 붙이는 식별자(Route)의 기본 동작이 다릅니다.
버전별 차이점
| 구분 | JBoss EAP 6.x (JBossWeb) | JBoss EAP 7.x (Undertow) |
|---|---|---|
| Engine | Apache Tomcat Fork | Undertow |
| Format | [ID].[jvmRoute] |
[ID].[instance-id] |
| Default | 설정 없으면 ID만 생성하거나 Hostname 부착 | 강제로 jboss.node.name 부착 |
기술적 원인 (Undertow JvmRouteHandler)
EAP 7의 웹 엔진인 Undertow는 io.undertow.server.JvmRouteHandler를 통해 세션 ID를 처리합니다. 이 핸들러는 클러스터링 설정 여부와 관계없이, 설정된 instance-id가 있다면 무조건 세션 ID 뒤에 붙이도록 설계되어 있습니다. 또한, 이 값은 null이거나 비활성화(disable)할 수 없으며 기본적으로 노드 이름을 따라갑니다.
2. 해결 및 설정 방법 (Configuration)
JSESSIONID 뒤에 붙는 값을 제어하기 위해서는 undertow 서브시스템의 instance-id 속성을 명시적으로 변경해야 합니다.
설정 파일 수정 (standalone.xml / domain.xml)
Undertow 서브시스템 설정에서 instance-id 값을 원하는 식별자(기존 jvmRoute와 동일한 역할)로 지정합니다.
<subsystem xmlns="urn:jboss:domain:undertow:3.1">
<buffer-cache name="default"/>
<server name="default-server">
<http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/>
<ajp-listener name="ajp" socket-binding="ajp"/>
<host name="default-host" alias="localhost">
...
</host>
</server>
<servlet-container name="default" default-session-timeout="30" instance-id="${jboss.node.name}" />
</subsystem>
CLI를 이용한 변경
운영 중인 환경에서 값을 변경하려면 관리 CLI를 사용하는 것이 안전합니다.
# instance-id를 'node1'으로 변경하는 예시
/subsystem=undertow/servlet-container=default:write-attribute(name=instance-id, value="node1")
# 설정 적용을 위해 리로드 필요
reload
instance-id를 변경하면 기존에 발급된 세션 ID와 매핑이 달라지므로, 기존 사용자들의 세션이 끊길(Invalidate) 수 있습니다. 서비스 점검 시간에 수행하십시오.
3. 검증 (Verification)
설정 변경 후 애플리케이션을 호출하여 쿠키 값을 확인합니다.
개발자 도구 확인
- 브라우저 F12 (개발자 도구) 실행
- Application 탭 > Cookies 선택
JSESSIONID의 값 확인
결과 예시:
- 변경 전:
abcde12345.server-one-instance-group-a(길고 복잡함) - 변경 후:
abcde12345.node1(설정한 값으로 깔끔해짐)
Next Step:
만약 앞단의 웹 서버(Apache/IHS)와 mod_cluster 또는 mod_jk로 연동 중이라면, 웹 서버 설정의 jvmRoute 값과 JBoss의 instance-id 값이 정확히 일치해야 스티키 세션(Sticky Session)이 정상 작동합니다. 반드시 양쪽 설정을 맞춰주세요.