[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/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 검색