본문 바로가기
Stack Overflow/스프링

[스프링] 아파치 톰캣 Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986 오류가 나오는 경우(JAVA, JAVA SCRIPT 해결방법)

by Lich King 2022. 4. 15.
정보: Error parsing HTTP request header
 Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:460)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:291)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)

아파치 톰캣 버전이 올라가면서 URI에 특수문자, 한글을 씌우면 다음과 같은 오류가 발생한다.

이런 경우 GET, POST 등 뭐로 URI 날려도 오류가 발생한다.

 

톰캣 7.x 특정 버전 이상부터 RFC 3986 규정이 적용되어, 더 이상 URI에 특수문자와 같은 텍스트를 넣을 수 없다.

 

이를 해결해주기 위해서 인코딩을 처리해서 날린다음에 받는 쪽에서 디코딩을 해줘야 한다.

이름과 같은 한글을 넘겨주는 특수한 상황에서는 골치아프다.

 

자바스크립트에서 해당 URI를 encodeURI()로 씌워서 날려주면 해결된다.

한글을 지양하는 것이 더 나은방법이겠다. 그게 내맘대로 되는 것은 아니지만... 

 

-> 추가로

거의 인터넷을 보면 자바스크립트 버전만 있는것 같다.

자바와 같은 경우는 다음과 같이 처리하면 깔끔하게 해결된다.

 

// 기존 방식
UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl(url).build();
uriComponents.toUri()

// 수정된 방식
UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl(url).build();
uriComponents.encode().toUri()

UriComponents 클래스의 encode() 메소드를 사용해서 처리하면 간단하게 특수문자를 처리한다.

톰캣 버전을 바꾸느니 뭐니...그런식으로 할 필요가 없다..

댓글