[TOMCAT] java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

[TOMCAT] java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

■ 오류 내용

서비스를 톰캣에 띄웠을 때 400 에러가 나는 경우가 있다. 400은 404와 다르다.

404는 페이지를 찾지 못하는 경우고, 400은 신택스(문법) 에러다. 쉽게 말해 파싱 실패다.

검색결과 아래 버전들에서 해당 현상이 발견되고 있다.

– Tomcat 7.0.73 버전

– Tomcat 8.0.39 버전

– Tomcat 8.5.31 버전

– Tomcat 8.5.7 버전

– Tomcat 9.0.8 버전

참고 1) Tomcat 8.5.3 에러 메시지

Ensure that requests with HTTP method names that are not tokens (as required by RFC 7231) are rejected with a 400 response

참고 2) Tomcat 8.5.7 에러 메시지

Add additional checks for valid characters to the HTTP request line parsing so invalid request lines are rejected sooner.

* http://stackoverflow.com/questions/41053653/tomcat-8-is-not-able-to-handle-get-request-with-in-query-parameters/44005213#44005213

* http://stackoverflow.com/questions/50361171/how-to-allow-character-in-urls-for-tomcat-8-5

■ 원인

보안상의 이유로 톰캣이 URL에 특수문자가 들어간 경우를 잡아내는 것이다.

해결방법은 아래와 같다.

■ 문제해결

1. 특수문자 인코딩하기

자바스크립트에서 encodeURI 또는 encodeURIComponent 로 주소를 인코딩하면 된다.

encodeURI 는 주소 전체를 인코딩하는 경우 사용하면 되고, encodeURIComponent 는 개별 파라미터를 인코딩하는 경우 사용하면 된다.

특수문자는 인코딩해주고, 한글은 웬만하면 제거하도록 한다.

* Javascript encodeURI 와 encodeURIComponent 차이 (http://blog.naver.com/bb_/221047463324)

2. POST 방식으로 호출하기

GET 방식으로 호출하던 것을 POST 방식으로 바꾼다.

3. 톰캣 설정값을 변경하기

relaxedPathChars, relaxedQueryChars 를 수정하면 된다고 한다.

* http://tomcat.apache.org/tomcat-8.5-doc/config/http.html 페이지에서 relaxedPathChars, relaxedQueryChars 검색