Tomcat 10.1.54 버전 Release Note 요약 및 정리

 

안녕하세요.

톰캣 릴리즈 노트 최신 업데이트 내용으로 소개하고자 합니다.

Tomcat 10.1.54 버전 Release 의 내용 정리 및 요약 입니다.

 

tomcat

 

  1. URI 및 Query String 이스케이프 처리 추가

 

  • 개요

(1) 로그 깨짐 (Log Injection / Format 깨짐)

예를 들어 이런 요청이 들어오면:

GET /test?param=hello” 500 “hacked HTTP/1.1 → “GET /test?param=hello” 500 “hacked HTTP/1.1”

– 로그 필드 구분(“)이 깨짐

– 분석 툴(Grafana, ELK) 파싱 실패

 

(2) 로그에 그대로 찍히면 로그 위조(Log Forging) 가능

/test?param=abc\nERROR: hacked → /test?param=abc ERROR: hacked

 

 

  • 개선사항

URI와 Query String을 로그에 남길 때 위험한 문자들을 안전한 형태로 변환

ELK / Grafana / Splunk에서 깨짐 방지 공격자가 로그를 조작하는 것 차단

JSON 구조 로그 대응

 

 

  1. 잘못된 HEADERS 프레임 수신 시 연결이 비정상 종료되는 문제 수정

 

HEADERS 프레임이란?

클라이언트(웹 브라우저 등)가 서버에 새로운 요청을 시작할 때 보내는 가장 첫 번째 프레임입니다. 여기에는 어떤 페이지를 요청하는지(URL 경로), 어떤 방식인지(GET/POST), 브라우저 정보는 무엇인지 등 핵심적인 HTTP 헤더 정보가 담겨 있습니다.

 

  • 개요

이전 버전에서는 잘못된 HEADERS 프레임을 해석(Parsing)하는 로직에 결함이 있었습니다. 이 때문에 GOAWAY 프레임을 클라이언트에게 보내지도 않은 채 TCP 연결 자체를 비정상적으로 끊어버리는(Abrupt Close) 현상이 발생했습니다.

 

  • 개선사항

이제 규격에 어긋난 프레임이 들어오더라도 당황해서 연결을 끊어버리지 않고, HTTP/2 표준에 맞게 정상적으로 GOAWAY 프레임을 생성하여 클라이언트에게 전송한 뒤 안전하게 연결을 종료합니다.

 

 

  1. request header 버퍼가 stream reset 후 제대로 초기화되지 않는 문제 수정

 

  • 개요

정상흐름 : 요청 → 헤더 파싱 → 처리 → 응답 → 버퍼 초기화

문제 상황: 요청 → 헤더 파싱 중 or 직후 → Stream Reset 발생→ 버퍼 초기화 안됨

– HTTP/2는 연결을 재사용하기 때문에 다음 stream에서 이전 header 일부가 남아 있을 수 있음 그로 인해 이전 요청 데이터가 다음 요청에 섞일 가능성 있음 또한 내부 객체 상태가 깨지거나

예상치 못한 동작 발생 할수 있음,보안 관련 문제 발생가능성 생김

 

  • 개선사항

– Stream reset 시점에 request header 버퍼를 명시적으로 초기화

 

 

  1. non-blocking flush 버그 수정

 

  • 개요

정상흐름: write() → flush() → 일부 전송 → 나머지는 나중에 이어서 전송

문제상황: write() → flush() → 실제 전송 안됨 (버퍼에 남음) → 계속 쌓임 → 연결 종료 시점에 한 번에 전송

 

– 이로인해  응답 지연 발생

클라이언트는 응답이 안 오는 것처럼 보임, 실제로는 서버 버퍼에 쌓여 있음

그리고 스트리밍 깨짐 – SSE (Server-Sent Events), chunked response , 파일 다운로드 등 마지막에 한꺼번에 전송

 

  • 개선사항

– flush가 완전히 끝나지 않았을 때 반드시 재시도 상태로 등록

– socket writable 이벤트 발생 시 남은 데이터 다시 flush

 

 

  1. OpenSSL 동작을 tomcat-native 및 FFM 코드와 일관되게 정렬

 

  • 개요

Tomcat에서 TLS(HTTPS)는 3가지 방식으로 처리

1) JSSE

2) tomcat-native

3) FFM

 

같은 OpenSSL 기반인데도 tomcat-native 과 FFM 는 동작 방식이 미묘하게 달랐음

– handshake 처리 방식

– 에러 반환 방식

– 버퍼 처리 타이밍

– shutdown / close 처리

다음과 같은 처리방식 시, 환경마다 동작이 달라짐 (native에서는 정상, FFM에서는 오류)

디버깅 어려움 , TLS edge case에서 오류

 

  • 개선사항

OpenSSL 호출/처리 로직을 통일하여 TLS 동작 일관성 확보 , 환경별 차이 제거, 유지보수 쉬워짐 , 버그 발생 가능성 감소

 

  1. HTTP trailer 필드에도 필터링 적용

 

Trailer Field란?

: 일반 HTTP 요청/응답 구조

[Start Line]
[Headers]
[Body]

 

  • 개요

Trailer Field 필터링 부족,없음으로 인해 검증되지 않은 데이터가 들어올 수 있음

 

  • 개선사항

– 제어 문자 제거 ( \x00 ~ \x1F :제어문자, \x7F : DEL )

– 255 초과 문자 제거

Trailer 필드에도 Header와 동일한 입력 검증을 적용하여, 제어문자 및 비정상 문자를 공백으로 치환하는 보안 강화 패치

 

 

  1. OpenSSLEngine 버퍼 재사용 방식 개선

 

  • 개요

버퍼 재사용 방식 불일치

– tomcat-native (JNI 기반)

– FFM (Foreign Function & Memory API)

둘 다 OpenSSL 쓰는데 버퍼 처리 방식이 달랐음

 

불필요한 버퍼 생성/복사

데이터 → 새 ByteBuffer 생성 → 복사 → OpenSSL 전달

이로인해 GC 증가 , 메모리 낭비 , CPU 오버헤드

 

  • 개선사항

버퍼 재사용 로직 통일하여 같은 방식으로 buffer lifecycle 관리함

불필요한 복사 제거하기위해 가능하면 기존 buffer 그대로 재사용

버퍼 lifecycle 명확화

tomcat-native와 FFM 간 동작을 통일

 

  1. Kubernetes 연결 실패 로그 과다 출력 감소

 

클러스터/서비스 디스커버리 과정에서 불필요하게 반복되던 에러 로그를 줄인 개선입니다.

 

  • 개요

java.net.ConnectException: Connection refused 이로그가 매 요청 / 매 주기마다 계속 출력됨

그래서 로그 파일 급증 , 중요한 로그 묻힘, 디스크 사용량 증가등의 문제가 생김

 

  • 개선사항

동일한 오류 반복 출력 제한, Log Level Down : ERROR → WARN / DEBUG

 

 

  1. EncryptInterceptor 에러 처리 개선

 

  • 개요

암호화/복호화 과정에서는 다양한 예외가 발생할 수 있습니다:

잘못된 키 (Key mismatch)

암호화 알고리즘 오류

데이터 손상 (네트워크 문제)

Padding 오류

복호화 실패 (BadPaddingException 등)

 

  • 개선사항

단순 Exception → 구체적인 처리

– 복호화 실패 → 해당 메시지만 드롭

– 전체 클러스터 영향 최소화

 

안전한 실패 (Fail-safe)

<변경전>

복호화 실패 → 연결 끊김 → 클러스터 불안정

<변경후>

복호화 실패 → 해당 메시지 무시 → 계속 동작

결론적으로,

암호화 실패가 전체 클러스터 장애로 이어지지 않도록 안전하게 처리하도록 개선한 것입니다

 

 

  1. 그외 릴리즈

– bnd 라이브러리 7.2.3으로 업데이트

– 프랑스어 / 일본어 번역 품질 개선

 

 

Kubernetes 연결 실패 로그 과다 출력 관련해선 꼭 개선해야 한다고 생각 했었는데

드디어 되었네요!

글 읽어 주셔서 감사합니다:)

 

 

 

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

 

 

 

Similar Posts

답글 남기기

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