[오류] 유효한 문자는 RFC 7230 and RFC 3986에서 정의 오류

리뷰를 GET 할 때

리뷰 이미지에 index값이 1,2,3,4,5, 이런식으로 들어오는 게 아니라

이런 식으로 들어온다..

이제 왜때문에 이렇게 값이 들어오는지 파보도록 하자 ..

* 오른쪽으로 들어와야 정상 = localhost로 연결했을 때 상황


우선, 추측을 해보면

1. addReview 할 때 애초에 잘못 insert 했다.

2. getReview 할 때 reviewImage 값 set이 이상하게 됐다.

3. 배포 연결한 DB 설정 /서버 문제

정도로 우선 예상이 가는데

우선 local에서는 같은 코드로도 아주 잘 돌아가니 3번이 제일 의심간다

(근데 저 ImageIndexs는 Vo로 만든건데 그게 연관이 있나..)


 

우선 배포한 사이트에서만 오류가 나기때문에 서버로그를 확인하기 위해 SSH 접속 후 아래의 명령어를 입력한다.

https://passwd.tistory.com/entry/journalctl

ubuntu@a.b.c.d:/var/log/tomcat9$ journalctl -xe

그러면 이제 서버 에러  코드를 상세히 알려주는데, 



코드를 하나씩 해석해보자면,

 

java.lang.IllegalArgumentException: Invalid character found in the request target [/data/reviewImage?index=[ ]. The valid characters are defined in RFC 7230 and RFC 3986 at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:494)

: 오류가 발생한 위치, "org.apache.coyote.http11.Http11InputBuffer" 클래스의 "parseRequestLine"메소드에서 발생하였고

HTTP 요청대상(target)에서 유효하지 않은 문자가 발견됨, 유효한 문자는 RFC 7230 and RFC 3986에서 정의 되어있음.

이 경우, [/data/reviewImage?index=[ ]라는 요청 대상에 잘못된 문자가 포함되어있어서 발생한 오류

 

at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:271)

: 오류가 발생한 위치,"org.apache.coyote.http11.Http11Processor"클래스의 "service"메소드에서 발생.

 

따라서,  HTTP 요청 헤더를 파싱하는 과정에서 잘못된 문자가 발견되어 오류가 발생한 것임으로,

해당 요청 대상에 사용된 문자를 검토 후 유효문자 범위 내의 문자로 수정해야 함을 파악했다.

 

그래서 RFC 7230 and RFC 3986  과 관련된 오류코드를 찾아보니,

오류가 발생하는 원인은

"유효하지않은 문자(특수문자나 한글같은..?)가 쿼리스트링으로 포함된 URI로 요청시에 나는 톰캣 에러"

라고 한다.

 해결 방법은

1. 톰캣 Server.xml의 Connector에 relaxedQueryChars를 추가 (원하는 특수문자 다 추가)

2. 요청보내는곳에서 encoding 처리해서 보내기

예를 들면 javascript에서는 param을 보낼 때, encodeURI(param) 처리를 해서 보내면 된다

(참고- https://aroundlena.tistory.com/50)

 

근데 수정해도 안되네.. 뭐가 문제일까 흐잉