Tomcat 10.1.49 버전 Release Note 요약 및 정리

 

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

tomcat

 

1. 클래스 경로 생성 시 NullPointerException 발생 가능성 수정

• 개요
Tomcat의 Loader (클래스 로딩 담당)가 클래스패스를 만들 때, 특정 조건에서 NullPointerException이 발생할 수 있었습니다.

• 개선사항
클래스패스를 생성하는 코드에서 ‘null’ 값을 안전하게 확인하고 처리하도록 로직을 개선하여, 프로그램이 멈추지 않도록 했습니다.

 

2. JNDI Realm의 SSL Socket Factory 설정 오류 수정

• 개요
이 보안 채널을 설정하는 과정(Socket Factory 설정)에 오류가 있어서, 안전한 통신이 제대로 이루어지지 않거나 설정이 불가능했을 수 있습니다.

• 개선사항
설정 로직을 수정하여, Tomcat이 JNDI Realm을 통해 안전하고 암호화된 통신을 제대로 확립하고 인증 작업을 수행할 수 있도록 개선했습니다.

* JNDI Realm이란?
– 사용자 인증(로그인)을 LDAP와 같은 외부 시스템에 맡길 때 사용되는 Tomcat의 인증 모듈.

* SSL Socket Factory이란?
– 암호화된 통신을 위한 보안 소켓(Socket)을 생성하는 도구입니다. 이 팩토리가 올바르게 설정되어야만, Tomcat은 LDAP 서버와 $\text{ldaps://}$ (LDAP over SSL) 통신을 안전하게 시작할 수 있습니다.

 

3. MessageDigestCredentialHandler 업데이트
digestInRfc3112Order라는 새로운 설정이 추가되었습니다.
이 설정을 이용해 해시 계산 순서를 개발자가 선택할 수 있게 되었습니다.

• 개요
* Credential: 실제 비밀번호입니다.
* Salt: 비밀번호에 추가하는 보안 문자열입니다.
현재 기본 순서 현재는 salt 를 먼저 넣고 → credential 을 나중에 넣어 해시를 계산합니다. 이것이 기존 Tomcat의 방식입니다.

• 개선사항
Tomcat 12 버전부터는 보안 표준인 RFC 3112를 따르기 위해 순서가 credential (비밀번호)을 먼저 넣고 → salt를 나중에 넣는 방식으로 기본값이 바뀔 예정입니다.
이 업데이트는 두 재료를 섞는 순서를 바꿀 수 있게 만들어서, 국제 표준(RFC 3112)을 준수할 수 있도록 준비하는 단계라고 볼 수 있습니다.

 

4. BoringSSL 사용 시 OCSP 실패 처리 개선

• 개요
BoringSSL이라는 보안 라이브러리를 사용할 때, OCSP를 통한 인증서 확인 과정에서 문제가 생기더라도 전체 시스템이 멈추거나 심각한 오류를 내지 않고 더 안정적으로 (graceful) 다음 단계로 넘어가게 만든 것입니다.
* BoringSSL이란?
– 구글이 개발한 SSL/TLS 암호화 라이브러리입니다. Tomcat에서 보안 통신을 위해 사용될 수 있습니다.
* OCSP 이란?
– 클라이언트가 서버의 SSL/TLS 인증서가 아직 유효한지 실시간으로 확인하는 보안 절차입니다.

• 개선사항
OCSP 서버가 응답하지 않거나 오류를 보내는 등 OCSP 확인에 실패했을 경우, Tomcat이 즉시 연결을 끊거나 심각한 오류를 발생시키는 대신, 부드럽게 (Graceful) 실패를 처리하고 다음 통신 절차를 진행할 수 있도록 안정성을 높인 것입니다.

 

5. deferAccept JMX 속성 처리 오류 수정
Tomcat의 HTTP 커넥터 설정 중 하나인 deferAccept라는 속성이 JMX(Java Management Extensions)를 통해 관리될 때 발생하는 문제를 수정한 것입니다.

• 개요
버전업 과정에서 내부 구조 변경 등의 이유로 Tomcat 11 버전에서 이 deferAccept 속성을 더 이상 사용하지 않고 제거하기로 결정했습니다.
JMX (Tomcat을 모니터링하고 관리하는 도구)는 이 사실을 제대로 반영하지 못하고 이미 삭제된 deferAccept 속성을 계속 관리 가능한 속성 목록에 포함하고 있었습니다.
결과적으로, 관리 도구(JMX)를 사용하는 사용자가 존재하지 않는 속성을 설정하거나 조회하려고 시도하면서 오류나 예기치 않은 동작이 발생했던 것입니다.

• 개선사항
이번 수정은 Tomcat 11에서 제거된 deferAccept 속성을 JMX의 관리 대상 목록에서도 깨끗하게 제거함으로써, 속성 관리에 대한 혼란을 없애고 시스템의 안정성을 확보한 것입니다.

 

6. OpenSSL trust store 사용 시 메모리 누수 수정

• 개요
Tomcat이 OpenSSL Provider를 사용하고 Trust Store를 설정하여 외부 연결의 유효성을 검사할 때, 특정 상황에서 Trust Store 관련 데이터 구조체가 사용이 끝난 후에도 메모리에서 해제되지 않고 남아 있는 문제가 있었습니다.
이러한 누수가 반복되면서, Tomcat 서버를 오랫동안 가동할수록 불필요하게 점유되는 메모리의 양이 점점 늘어났습니다.

• 개선사항
이번 패치는 메모리 누수를 유발했던 OpenSSL 관련 코드 부분을 찾아, Trust Store의 사용이 완료되면 해당 메모리를 운영체제에 즉시 반환(해제)하도록 수정했습니다.
즉, Tomcat에서 OpenSSL 보안 기능을 사용할 때, 인증서를 신뢰하는 과정에서 메모리가 새는(누수되는) 버그를 고쳐서, 서버가 오래 작동해도 메모리 부족 없이 안정적으로 돌아가도록 만들었다.는 뜻입니다.

 

7. Tomcat Native 의존 커넥터 종료 시 충돌 가능성 해결

Tomcat Native Library를 사용하는 고성능 커넥터가 서버 종료 시 예상치 못한 충돌(Crash)을 일으킬 수 있는 문제를 해결하여, 서버 종료의 안정성을 높인 것입니다.

• 개요
문제는 Tomcat 서버가 종료(Shutdown)을 할 때 발생했습니다.
자원 해제 시작: 서버 종료 시, 커넥터는 자신이 사용하던 모든 자원(메모리, 파일 핸들 등)을 정리하고 운영체제에 반환해야 합니다.
Native 의존성 Native 커넥터는 자원 해제를 위해 Tomcat Native Library에 있는 특정 C 함수를 호출합니다.
타이밍 오류 서버 종료 절차상, 때로는 Native Library 자체가 메모리에서 먼저 언로드되거나 불안정한 상태가 된 후에, 커넥터가 해당 라이브러리의 함수를 호출하는 상황이 발생했습니다.
이처럼 이미 사라진 도구를 사용하려고 시도했기 때문에, 프로그램이 접근할 수 없는 메모리 영역을 건드리게 되어 Crash로 이어졌습니다.

• 개선사항
서버 종료 시 커넥터와 Native Library 간의 자원 정리 순서를 엄격하게 통제하도록 변경했습니다.
커넥터가 Native Library의 기능을 모두 사용하고 안전하게 종료될 때까지 라이브러리가 메모리에서 제거되지 않도록 순서를 조정했습니다.

 

8. AJP 메시지 길이 검사 오류 수정
AJP(Apache JServ Protocol) 커넥터가 클라이언트로부터 수신하는 메시지의 길이(Length)를 확인할 때 발생하던 오류를 바로잡은 것입니다. 이로써 AJP 통신의 안정성과 보안성이 강화되었습니다.

• 개요
이전 버전에서는 AJP 메시지의 길이를 검사하는 로직에 오류가 있었습니다.
예를 들어, 메시지 헤더가 실제 내용보다 더 긴 길이를 보고하거나, 메시지가 허용된 최대 크기를 초과했을 때, Tomcat이 이를 정확하게 감지하거나 안전하게 처리하지 못하고 오류를 일으키거나 잠재적인 보안 취약점으로 이어질 수 있었습니다.
잘못된 길이 검사는 데이터 처리 과정에서 버퍼 오버플로우와 같은 심각한 문제를 유발할 수 있습니다.

• 개선사항
이번 수정은 AJP 메시지 헤더의 길이 값을 정확하게 읽고, 이 길이가 Tomcat이 처리할 수 있는 합리적이고 안전한 범위 내에 있는지 확인하는 로직을 강화했습니다.
이는 비정상적으로 크거나 잘못된 길이 값을 가진 메시지가 들어왔을 때 서버가 충돌하거나 악용되는 것을 방지합니다.

 

9. Servlet 예외 unwrap 과정에서 NPE 발생 문제 해결

• 개요
예외를 처리하고 원래의 예외를 추출하는 과정중에 내부적으로 null 값에 접근하려 할 때 NullPointerException이 발생했습니다.
이 NPE 때문에 톰캣은 원래 발생했던 서블릿 예외에 대한 적절한 상세 정보를 기록하거나 사용자에게 제공하지 못하고, 오히려 이 NPE에 의해 원래의 중요한 예외 정보가 가려지게 되었습니다.

• 개선사항
이 NPE를 발생시키던 내부 로직의 오류를 수정하여, 예외 언랩 과정이 정상적으로 수행되도록 했습니다.
예외 처리 과정에서 NPE로 인해 원래 발생한 예외가 사라지거나 가려지는 일 없이 정확한 예외 정보와 스택 트레이스를 볼 수 있게 되었습니다.
Tomcat 10.1.49의 변경 로그에서 69862번 이슈로 언급되었습니다.

 

10. 라이브러리 버전 업그레이드 및 번역추가

• Apache Commons BCEL 6.11.0
• Byte Buddy 1.17.8
• Checkstyle 12.1.1
• Jacoco 0.8.14
• SpotBugs 4.9.8
• JSign 7.4
• Maven Resolver Ant Tasks 1.6.0
• 프랑스어 번역 개선.
• 일본어 번역 개선.

이번 릴리즈는 톰캣의 기능적인 측면보다 내부 소스코드나 개발관점에서의 수정이 많은것 같네요.
안정성과 품질에 초점을 둔 매우 실용적인 릴리스라고 생각합니다.
이번 글도 봐주셔서 감사합니다.

 

 

자유롭게 댓글을 달아주세요! 언제나 환영합니다.
기타 문의:  info@neoclova.co.kr
네오클로바 기술블로그 홈 바로가기: https://neoclova.net
네오클로바 홈페이지: http://neoclova.co.kr

 

Similar Posts

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다