Tomcat 10.1.50 Release Note 요약 및 정리
안녕하세요.
오늘도 톰캣 릴리즈 노트 최신 업데이트 내용으로 소개하고자 합니다.
Tomcat 10.1.50 버전 Release 의 내용 정리 및 요약 입니다.

-
JUnit 테스트 출력 제어 옵션 추가
- 개요
: 톰캣은 웹 서버이기 때문에 멀티스레드(여러 작업을 동시에 처리) 환경에서 테스트가 이루어지는 경우가 많습니다.
테스트가 실행될 때마다 수많은 로그와 시스템 메시지가 콘솔(터미널)에 쏟아집니다.
- 개선사항
: 테스트 실행 시 출력을 제어할 수 있는 test.silent라는 옵션을 추가했습니다.
이 속성을 true로 설정하면, 테스트 중에 발생하는 일반적인 표준 출력을 억제합니다.
불필요한 노이즈 정보를 줄여서 진짜 확인해야 할 테스트 결과(성공/실패 여부)에만 집중하게 만드는 것입니다.
-
로그 레벨 및 경고 강화
1) RewriteValve 설정 누락 로그 상향,
2) Host appBase의 의심스러운 값에 대한 경고 로그 추가
# RewriteValve란?
– URL 주소를 재작성하는 기능입니다. ( (예: example.com/login을 내부적으로 example.com/auth/login.jsp로 연결)
# appBase 란?
– 톰캣이 웹 애플리케이션(WAR 파일 등)을 찾는 기본 디렉토리입니다
설정은 $CATALINA_BASE/conf/server.xml 에서 합니다.
- 개요 및 개선
1) RewriteValve 설정 누락 로그 상향
기존에는 Rewrite 관련 설정이 잘못되어도 톰캣은 DEBUG 모드에서만 그 사실을 알려줬습니다.
이제 설정 누락이 발견되면 일반적인 INFO 레벨로 로그를 남깁니다.
-> 트러블슈팅 시간이 단축
2) Host appBase의 의심스러운 값에 대한 경고 로그 추가
관리자가 실수로 appBase 경로를 이상하게 설정하거나, 보안상 위험할 수 있는 경로를 지정할 경우 톰캣이 WARNING(경고) 로그를 띄웁니다.
-
의존성 완화
catalina.jar에서 tomcat-jni.jar 하드 의존성 제거
# JNI (Java Native Interface)란?
– 자바 언어가 C나 C++ 같은 다른 언어로 작성된 프로그램을 불러올 때 사용하는 통로입니다.
# tomcat-jni.jar란?
– 톰캣이 성능 향상을 위해 운영체제(OS)의 기능을 직접 빌려 쓸 때(APR 라이브러리 등) 필요한 부품입니다.
- 개요
기존 톰캣 구조에서는 catalina.jar안에 tomcat-jni.jar가 반드시 있어야만 코드가 정상적으로 컴파일 되거나 실행되는 구조적 연결이 강하게 걸려 있었습니다.
• 개선사항
리플렉션(Reflection) 방식으로 catalina.jar는 실행 시점에 tomcat-jni.jar가 있나 물어봅니다.
있으면 성능 최적화 기능을 활성화합니다.
그러나 없으면 자바 표준 방식으로 동작하며, 하고 아무 문제 없이 넘어갑니다.
-
크롤러 세션 관리 확장
구글이나 네이버 같은 검색 로봇(크롤러)들이 서버에 접속할 때, 이들을 식별하는 방식을 훨씬 자유롭고 똑똑하게 바꿀 수 있도록 개선한 내용입니다.
- 개요
보통 일반 사용자가 웹사이트에 들어오면 서버는 ‘세션’을 생성합니다. 하지만 크롤러는 수많은 페이지를 순식간에 훑고 지나가기 때문에, 일반 사용자처럼 세션을 다 만들어주면 서버 메모리가 금방 바닥나 버립니다.
그래서 톰캣은 CrawlerSessionManagerValve라는 장치를 제공합니다.
– 역할: “아, 이건 크롤러구나!”라고 판단되면, 페이지마다 새 세션을 만들지 않고 하나의 고정된 세션을 재사용하게 해서 메모리를 아낍니다.
– 기존 방식: 주로 크롤러의 IP 주소나 User-Agent(브라우저 정보)를 조합해서 크롤러를 식별했습니다.
- 개선사항
기존에는 톰캣이 정해놓은 방식(IP 등)으로만 크롤러를 식별할 수 있었는데, 이제는 개발자가 직접 만든 함수(로직)를 통해 누가 크롤러인지를 정의할 수 있게 되었습니다.
예를 들어, 단순히 IP 주소만 보는 게 아니라 다음과 같은 복잡한 조건으로 크롤러 ID를 생성할 수 있습니다
– 헤더 정보 조합: 특정 보안 토큰이나 커스텀 헤더가 포함된 경우에만 특정 크롤러로 인식.
– 암호화된 식별자: 클라이언트의 정보를 암호화하거나 가공하여 서버만의 고유한 크롤러 ID 생성.
– 동적 판단: 실시간 상황에 따라 크롤러 식별 규칙을 변경.
-
SPNEGO 인증 동작 개선
# SPNEGO 란?
– 윈도우 로그인 정보 등을 이용해 웹사이트에 자동으로 로그인하게 해주는 기술입니다. 사내망에서 따로 아이디/비번 안 치고 게시판에 들어가는 기능이라고 생각하면 됩니다.
# SSL Valve란?
– 사용자가 HTTPS로 접속했을 때, 톰캣이 그 보안 정보를 확인하고 처리하는 장치입니다.
- 개요
기존 톰캣에서는 HTTPS(SSL)를 사용하면서 동시에 SPNEGO(자동 로그인)를 쓸 때 충돌이 발생하는 경우가 있었습니다.
특히 보안을 위해 ‘재인증(Re-authentication)’ 옵션을 켰을 때가 문제였습니다. 사용자가 이미 로그인했는데 보안상 다시 한번 확인하는 과정에서, 톰캣이 SPNEGO 인증 정보를 제대로 처리하지 못하고 잃어버리는 현상이 있었습니다.
결과적으로 대리 권한(위임 자격 증명)이 전달되지 않아, 서버가 사용자를 대신해 뒷단의 DB나 다른 서비스에 접근하지 못하는 문제가 발생하곤 했습니다.
- 개선사항
SL Valve와 SPNEGO가 서로 정보를 주고받는 로직을 정교하게 다듬었습니다.
– 정상적인 인증 수행: 이제 HTTPS 재인증 옵션이 켜져 있어도 SPNEGO 인증 프로세스가 중간에 끊기지 않고 끝까지 완수됩니다.
– 위임 자격 증명 사용 가능: 인증이 정상적으로 완료되므로, 사용자가 가진 ‘대리 권한’ 정보가 서버에 안전하게 전달됩니다. 이제 서버는 로그인한 사용자의 이름으로 다른 서비스(파일 서버, DB 등)에 명령을 내릴 수 있게 되었습니다.
-
TLS 로그 정확성 개선
KeyStore를 직접 설정한 경우 잘못된 경로 로그 출력 문제 수정
- 개요
사용자가 server.xml에 KeyStore 경로를 직접 입력 했을 때, 만약 그 경로가 틀리거나 파일이 없으면 로그에 이상한 내용이 찍히는 버그가 있었습니다.
상황: 관리자가 C:/auth/mykey.jks라고 경로를 적었는데, 실제로는 파일이 없는 상태.
기존 로그: 톰캣은 “사용자가 입력한 경로에 파일이 없다”라고 말하는 대신, “기본값(default) 경로에 파일이 없다”거나 혹은 전혀 상관없는 엉뚱한 위치를 가리키며 에러 로그를 남기는 경우가 있었습니다.
- 개선사항
정확한 경로 출력: 이제 사용자가 KeyStore 경로를 직접 설정했다면, 에러 발생 시 관리자가 설정한 그 경로를 정확히 지목하며 로그를 남깁니다.
로그 가독성: “관리자가 server.xml에 적은 [특정 경로]에서 파일을 찾을 수 없습니다”라고 명확하게 알려줍니다.
-
SNI 보안 강화
- 개요
공격자들은 간혹 SNI(겉 주소)와 Host 헤더(속 주소)를 다르게 보내는 수법을 씁니다. 이를 ‘Domain Fronting’ 또는 ‘Virtual Host Confusion’이라고 부릅니다.
공격 예시로 겉으로는 허용된 사이트(safe.com)로 가는 척하면서, 실제 요청은 차단된 사이트나 내부망의 다른 사이트(hidden.internal)로 찔러 넣는 방식입니다.
전에는 이 두 주소가 달라도 적당히 넘어가 주거나 유연하게 처리했습니다. 하지만 이는 보안상 허점이 될 수 있습니다
- 개선사항
[strictSNI]라는 속성이 추가되었고, 기본값이 true로 설정되었습니다.
매칭 검사: 톰캣이 SNI로 전달된 호스트명과 HTTP 요청 헤더에 적힌 호스트명이 일치하는지 엄격하게 검사합니다.
요청 거부: 만약 두 주소가 다르다면, 톰캣은 “이 요청은 신뢰할 수 없다”고 판단하여 400 Bad Request 에러를 내뿜으며 연결을 즉시 끊어버립니다.
-
클러스터링 회귀(regression) 버그 수정
- 개요
문제 현상: 특정 네트워크 설정이나 복잡한 클러스터 환경에서 세션 복제가 제대로 일어나지 않는 문제가 발생했습니다.
결과: 서버 한 대가 장애가 나면 다른 서버로 연결된 사용자들이 “로그인이 풀려버리는” 등 서비스 연속성이 깨지는 상황이 벌어졌습니다.
원인: 주로 서버 간에 메시지를 주고받는 채널링 로직이나, 멤버십(어떤 서버들이 살아있는지 확인하는 것) 처리 과정에서 오류가 있었습니다.
- 개선사항
동작 정상화: 다시 예전처럼 여러 대의 톰캣이 서로 세션 정보를 안정적으로 주고받을 수 있게 되었습니다.
안정성 강화: 클러스터 멤버(서버들)가 추가되거나 빠질 때 발생하는 감지 로직의 정확도를 높였습니다.
-
커넥션 풀 안정성 강화
이미 닫힌 커넥션은 풀에 재반환하지 않도록 수정
- 개요
간혹 네트워크 문제나 DB 서버의 타임아웃 등으로 인해, 사용자가 다 쓰기도 전에 커넥션이 이미 끊겨버리는(Closed) 경우가 생깁니다.
기존 동작: 예전에는 커넥션이 살았는지 죽었는지 꼼꼼히 따지지 않고, 사용이 끝나면 일단 풀로 돌려보내는 로직이 작동할 수 있었습니다.
발생하는 문제: 사용자가 풀에서 커넥션을 꺼냈는데, 이미 죽어있는 ‘좀비 커넥션’이라 에러가 발생합니다. 그리곤 풀 안이 이미 닫힌 커넥션들로 가득 차서, 정작 쓸 수 있는 연결이 없는데도 풀이 꽉 찼다고 인식하는 오작동이 일어납니다.
- 개선사항
이제 톰캣은 커넥션을 풀에 다시 넣기 직전에 상태를 한 번 더 체크합니다.
체크 로직: “이 커넥션이 아직 살아있나? 이미 닫혔나(isClosed)?”
수정된 동작: 만약 이미 닫힌 커넥션이라면 풀에 넣지 않고 즉시 폐기합니다.
결과: 풀 안에는 언제나 *실제로 사용 가능한 커넥션’들만 남게 됩니다.
10 .부록
1) 테스트 실행 개선
– Dtest.profile=<name> 기반 테스트 프로파일 시스템 추가
2) MIME 타입 매핑 최신화
– Apache httpd 기준으로 업데이트
3)번들 라이브러리 업데이트
– Commons Daemon 1.5.0
– Byte Buddy 1.18.2
– Checkstyle 12.2.0
– Tomcat Migration Tool 1.0.10
4) 다국어 번역 개선
– 스페인어, 프랑스어, 일본어
정리를 마치며
눈에 띄는 기능 추가는 없지만, 운영 안정성과 보안 정합성을 확실히 다지는 릴리즈 내용이라고 생각합니다.
읽어주셔서 감사합니다😊
자유롭게 댓글을 달아주세요! 언제나 환영합니다.
기타 문의: info@neoclova.co.kr
네오클로바 기술블로그 홈 바로가기: https://neoclova.net
네오클로바 홈페이지: http://neoclova.co.kr
