Tomcat 10.1.48 Release Note 요약 및 정리
안녕하세요.
오늘은 톰캣 릴리즈 노트 최근 10월 10일 자에 올라온 따끈따끈한 내용으로 준비해 보았습니다.
Tomcat 10.1.48 버전 Release 의 내용 정리 및 요약 입니다.

[목차]
- SSO (Single Sign-On) 관련 로그 표시
- RemoteCIDRFilter/RemoteCIDRValve 사용 권장
- SSO 엔트리 업데이트
- FileStore 저장소 생성 경쟁 조건정리
- AJP 커넥터 요청 처리 오류 수정
- permessage-deflate 호환성 개선
- SSO (Single Sign-On) 관련 로그 표시
SSO 관련 설정이 문서에서 권장하는 방식과 다를 경우, 서버 시작 시 또는 SSO 초기화 시 경고 로그를 남깁니다.
- 개요
SSO 설정이 문서 기준과 다르게 사용되는 경우 Tomcat SSO 설정은 정확히 문서에 따라 구성해야 정상 작동합니다.
하지만 SSO 설정이 문서와 다르게 잘못 구성되면, 세션 관리나 인증 처리에서 문제가 발생할 수 있습니다.
- 개선사항
SSO 밸브(SSO Valve) 설정이 공식 문서와 다를 경우 로그에 경고(warning) 메시지를 남기도록 개선됨.
- RemoteCIDRFilter/RemoteCIDRValve 사용 권장
RemoteAddrFilter와 RemoteAddValve를 이제 사용하지 않고, RemoteCIDRFilter와 RemoteCIDRValve로 대체하기로 합니다.
# RemoteCIDRFilter와 RemoteCIDRValve 란?
- RemoteCIDRFilter : 웹 애플리케이션 레벨에서 특정 IP 대역 단위 접근 제어합니다.
- RemoteCIDRValve : Tomcat 엔진 레벨에서 특정 IP 대역 단위 접근 제어합니다.
- 개요
RemoteAddrFilter/Valve는 IP대역을 지정할 때 정규 표현식(Regular Expression)에 의존해야 합니다.
정규 표현식으로 IP대역을 지정하는 것은 까다롭고, 잘못된 구문 사용으로 인해 의도하지 않은 IP 접근이 허용되거나 차단될 위험이 있습니다.
그리고 표준 방식을 벗어난 표기법은 네트워크 엔지니어에게 익숙하지 않고, 설정의 의도를 즉각적으로 파악하기 어렵게 만듭니다.
- 개선사항
기존 RemoteAddrFilter와 RemoteAddValve를 사용 시 복잡하고 오류 가능성이 있는 정규 표현식을 기반으로 사용하게됩니다.
그러나 RemoteCIDRFilter와 RemoteCIDRValve는 CIDR이라는 명확하고 표준화된 네트워크 표기법을 사용하여 IP 대역을 쉽게 정의할 수 있습니다
- 설정방법
[TOMCAT_HOME]/conf/server.xml
...
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.RemoteCIDRValve"
# 모든 IPv4 및 IPv6 주소를 차단합니다.
deny="0.0.0.0/0"
denyIP="::/0" />
<Valve className="org.apache.catalina.valves.RemoteCIDRValve
# 192.168.1.0/24 대역과 10.0.0.0/8 대역을 허용
allow="192.168.1.0/24,10.0.0.0/8"
# 허용할 IPv6 대역이 있다면 여기에 추가 (없다면 생략 가능)
allowIP="" />
</Host>
...
WEB-INF/web.xml
<filter>
<filter-name>Remote CIDR Filter</filter-name>
<filter-class>org.apache.catalina.filters.RemoteCIDRFilter</filter-class>
<init-param>
<param-name>allow</param-name>
<param-value>203.0.113.0/27, 127.0.0.1</param-value>
</init-param>
<init-param>
<param-name>deny</param-name>
<param-value>10.0.0.0/8</param-value> </init-param>
<init-param>
<param-name>allowIfNone</param-name>
<param-value>false</param-value>
</init-param>
</filter>
– 203.0.113.0/24, 127.0.0.1 이 아이피 대역에 속하는 모든 IP 주소는 접근이 허용됩니다.
– 10.0.0.0부터 10.255.255.255까지에 속하는 모든 IP 주소는 접근이 거부됩니다.
– IP 주소가 allow 규칙과 일치하지 않고, deny 규칙과도 일치하지 않는다면, 기본적으로 접근을 거부합니다.
- SSO 엔트리 업데이트
인증 후 세션 ID 변경 시 SSO 엔트리 정상 정리를 보장합니다.
- 개요
일반적으로 웹 애플리케이션의 보안을 위해, 사용자가 로그인을 성공적으로 마쳤을 때 Tomcat은 기존의 익명 세션 ID를 무효화하고 새로운 세션 ID를 발급합니다.
이 새로운 ID 정보가 SingleSignOn Valve에 완전히 전달되지 않는 경합 조건이나 누락 문제가 발생할 수 있었습니다.
* 예시)
당신이 회사에 방문했다고 가정해 봅시다.
당신은 임시로 발급받은 임시 출입증 (세션 ID ‘A’)을 사용합니다.
정식으로 신원 확인(로그인)을 마치는 순간, 보안팀은 당신이 이전에 사용하던 임시 출입증(A)을 무효화하고 새로운 정식 출입증 (세션 ID ‘B’)을 즉시 발급합니다.
회사에는 여러 부서(웹 애플리케이션)를 한 번에 통과하게 해주는 중앙 통제실 (SSO Valve)이 있습니다.
당신이 정식 출입증(B)을 발급받을 때, 통제실의 중앙 명단(SSO 엔트리)이 새로운 출입증 B로 갱신되지 않고, 여전히 무효화된 이전 출입증 A에 연결된 상태로 남아있을 수 있었습니다.
- 개선사항
인증 후 세션 ID가 변경되는 즉시, 이 변경 사항(새로운 세션 ID)이 SSO Valve에 전파되도록 보장합니다.
SSO Valve는 새로운 세션 ID와 SSO 엔트리를 정확하게 연결하여 관리합니다.
- FileStore 저장소 생성 경쟁 조건정리
# Tomcat Session Persistence란?
Tomcat이 서버를 재시작해도 사용자의 세션 정보를 잃지 않도록 저장하는 기능입니다.
재시작 될 때 Tomcat의 Session Manager가 사용자의 세션 데이터를 메모리가 아닌 디스크 파일에 저장하게 하는 컴포넌트가 FileStore 입니다.
- 개요
Tomcat이 시작되거나 여러 컴포넌트가 동시에 초기화되는 과정에서, 두 개 이상의 스레드가 동시에 FileStore의 세션 저장 디렉터리를 생성하려고 시도했을 수 있습니다.
운영체제나 JVM 레벨에서 동시에 디렉터리를 생성하려는 시도가 충돌하면서, 디렉터리 생성에 실패하거나, 파일 시스템 충돌을 일으키거나, 세션 저장이 불가능한 상태가 되는 등의 예기치 않은 오류가 발생했습니다.
- 개선사항
저장소 디렉터리를 생성하는 작업이 한 번에 하나의 스레드에 의해서만 안전하게 실행되도록 보장합니다.
서버 시작 시 혹은 부하가 높을 때 세션 저장소 디렉터리 생성과 관련된 불안정성 문제가 해결되어, 세션 퍼시스턴스 기능의 신뢰성이 향상되었습니다.
- AJP 커넥터 요청 처리 오류 수정
Tomcat 10.1.47 버그로 코드를 리팩터링 하거나 업데이트하는 과정에서 특정 HTTP 메서드를 처리하는 코드 블록이 잘못 복사/붙여넣기 되어 논리적 오류가 발생했습니다.
- 개요
클라이언트가 서버에게 특정 리소스(파일, 데이터) DELETE(삭제)를 요청했습니다.
Tomcat은 이 요청을 DELETE 요청으로 인식하지 않고, 서버가 어떤 HTTP 메서드를 지원하는지 묻는 OPTIONS 요청으로 인식하고 응답했습니다.
그러므로 삭제 작업이 실행되지 않았고, 클라이언트는 잘못된 정보를 받거나 예상한 결과를 얻지 못했습니다.
또 다른 사례로,
클라이언트가 서버에게 특정 리소스의 속성 정보를 요청했습니다.
Tomcat은 이를 요청 경로를 되돌려주는 TRACE 요청으로 인식하고 응답했습니다.
- 개선사항
Tomcat 10.1.48 버전에서는 이 복사/붙여넣기 오류를 찾아 수정하여, AJP 커넥터가 수신한 HTTP 요청 메서드를 정확하게 해당 메서드로 인식하고 처리하도록 복구했습니다.
- permessage-deflate 호환성 개선
WebSocket 통신의 압축 기능(permessage-deflate)이 Java 버전이 바뀔 때 발생하는 오류를 안전하게 처리하도록 수정했다는 내용입니다.
- 개요
기존 Java 24 이하 버전에서는 표준을 따르지 않고 IllegalStateException 이 나와도 엉뚱하게 NullPointerException을 던지는 버그가 있었습니다.
# NullPointerException란?
– 프로그램이 널(null) 값을 가진 객체에 접근하려고 할 때 발생합니다.
# IllegalStateException란?
– 객체가 현재 상태에서 수행할 수 없는 작업을 시도했을 때 발생하는 예외입니다.
예를들어 이미 닫힌 문을 다시 닫으려고 시도할 때라고 생각하면 됩니다.
- 개선사항
Java 25에서 IllegalStateException을 출력하기 시작한것은, Java 라이브러리가 올바른 예외 처리 표준을 따르도록 한 것입니다.
따라서 톰캣은 이 변화에 발맞춰 잘못된 예외(NullPointerException) 대신 올바른 예외(IllegalStateException)를 안전하게 처리하도록 코드를 수정하여 안정성과 호환성을 개선한 것입니다.
자유롭게 댓글을 달아주세요! 언제나 환영합니다.
기타 문의: info@neoclova.co.kr
네오클로바 기술블로그 홈 바로가기: https://neoclova.net
네오클로바 홈페이지: http://neoclova.co.kr
