개요
2026년 6월에 릴리스한 매뉴얼웍스 6.0.19 버전에서 아파치 톰캣을 9.0.119 버전으로 업데이트한 후, HTTP/2 환경에서 요청 본문을 읽는 과정에서 오류가 발생했습니다. 조사 결과, 톰캣 자체의 회귀 버그로 확인되어 9.0.118 버전으로 다운그레이드했습니다.
오류 증상
HTTP/2 연결에서 JSON 요청 본문을 읽을 때 다음 예외가 발생했습니다.
java.lang.IllegalArgumentException: newPosition > limit: (53247 > 9) at java.base/java.nio.Buffer.createPositionException(Buffer.java:351) at java.base/java.nio.Buffer.position(Buffer.java:326) at java.base/java.nio.ByteBuffer.position(ByteBuffer.java:1561) at org.apache.tomcat.util.buf.B2CConverter.convert(B2CConverter.java:300) at org.apache.catalina.connector.InputBuffer.realReadChars(InputBuffer.java:485) at org.apache.catalina.connector.CoyoteReader.readLine(CoyoteReader.java:156)
원인
톰캣 9.0.119에 포함된
B2CConverter의 EOF 처리 개선 과정에서 생긴 회귀 버그입니다.2026년 6월 26일 톰캣 users 메일링 리스트에 동일한 증상이 보고되었고("Possible regression after upgrade to 9.0.119"), 톰캣 커미터인 Mark Thomas가 톰캣 버그임을 확인했습니다.
2026년 7월 1일 수정 커밋이 9.0.x 브랜치에 반영되어, 9.0.120 버전(2026년 7월 릴리스 예정)에 포함될 예정입니다.
요청 본문을
request.getReader()로 읽는 경로(바이트에서 문자로 변환할 때B2CConverter사용)에서만 발생합니다.
조치
톰캣을 9.0.118 버전으로 다운그레이드했습니다. 9.0.119에서 수정된 보안 취약점이 있으므로 9.0.120 릴리스 후에 다시 업그레이드할 예정입니다.
향후 계획
다음 버전에서는 JSON 요청 본문 파싱 로직을 변경하여 릴리스할 예정입니다.
request.getReader()대신request.getInputStream()을 사용해 바이트를 직접 읽고 UTF-8로 명시적으로 디코딩합니다.버그가 있는
B2CConverter경로를 거치지 않으므로 9.0.119 버전에서도 안전합니다.클라이언트가 charset 헤더를 생략하면 ISO-8859-1로 디코딩될 수 있는 잠재적인 문제도 함께 제거됩니다.