반응형

정말 문법을 확인하고 또 확인해도 정확히 썼는데 POST 통신이 되지 않는다면?

설정한 XSS 공격 방어 또는 인터셉터를 의심하세요.

네이버에서 만든 lucy-xss-sax.xml 쓸 경우

HttpServletRequest를 가져가 먼저 작업을 하기 때문에 POST로 데이터를 못 받아온다.

POST 방식으로 전달된 "application/json" 타입의 데이터를 Servlet의 Filter나 Spring의 Interceptor에서 모종의 처리를 하기 위해서는 HttpServletRequest의 InputStream을 읽어 들여야 합니다. 
그러나 HttpServletRequest의 InputStream은 한 번 읽으면 다시 읽을 수 없습니다. 

왜냐하면 톰캣이 그걸 막습니다.

만약 Interceptor나 Filter에서 InputStream을 읽게 되면, 이후 Spring이 Converter를 이용해 Json 데이터를 바인딩 처리할 때 아래와 같은 에러를 만날 수 있습니다. Spring이 이미 읽어버린 InputStream을 다시 읽으려고 시도하다가 슬픈 에러를 뱉어내는 거죠.


바인딩 예외


1.JSON으로 던졌을 때

java.lang.IllegalStateException: getReader() has already been called for this request 
org.springframework.http.converter.HttpMessageNotReadableException: 
Could not read JSON: Stream closed; nested exception is java.io.IOException: Stream closed


2.FORM으로 던졌을 때

14:46:39.691 [http-nio-80-exec-11] WARN  j.l.Exception line:23 method:handlerException  - 
org.springframework.validation.BindException: 
org.springframework.validation.BeanPropertyBindingResult: 1 errors 


상황 발생 
어느 날 갑자기 POST로 보내는 통신은 싹 다 null이 뜨기 시작함
데이터를 바인딩하지 못하는 현상

@RequestMapping(value="manage/postTest.do",method=RequestMethod.POST)   
public String signUp(HttpServletRequest request){ 
LOG.warn(request); 
LOG.warn(request.getParameter("id")); 
 return "/java119.do"; 
} 

 

로그 출력 

14:41:21.964 [http-nio-80-exec-1] WARN  c.k.P.o.c.Java119Controller line:39 method:signUp  

-com.pack.project.XSS.RequestWrapper@61d1d9fa 
14:41:21.965 [http-nio-80-exec-1] WARN  c.k.P.o.c.Java119Controller line:40 method:signUp  - null 

 

요청을 Java119Controller에 보냈는데 HttpServletRequest 객체는 뜬금없이 XSS 설정해둔 패키지를 바라보고 있음

XSS 설정 의심 시작

필자가 사용한 XSS는 네이버 선배 형님들이 만든 lucy-xss-servlet-filter입니다.
git 주소 : https://github.com/naver/lucy-xss-servlet-filter

다시 보니

 

Recommendation 

신규로 개발하는 서비스에는 lucy-xss-servlet-filter를 사용하는 것을 추천하지만, 
기존 잘 운영되는 시스템에 lucy-xss-servlet-filter를 사용하는 것은 추천하지 않습니다. 
입력 파라메터가 전부 필터링 되기 때문에 
서비스가 잘 동작하지 않는 의도치 않은 결과가 발생할 수 있기 때문입니다.  

 

라고 써져있었네요.. 죄송합니다 네이버 선배님들

web.xml에 설정해둔 XSS Filter 주석 처리 후 POST 테스트 부분

결과 : 아주 잘 됩니다.

아무리 POST가 안 되는 이유, 갑자기 POST 안됨, POST 통신 먹통, POST 무조건 null 등등 
검색해봐도 찾을 수가 없었는데 
역시 검색에 너무 의존하는 것도 문제인 거 같습니다.

 

꼭 XSSFilter 아니더라도 POST가 되지 않는다면 뭔가가 가로채고 있다는 뜻입니다.

그런 것을 잘 확인해보시고 즐 코 하세요~

 

 

 

XSSFilter를 적용하면서 POST를 하시고 싶으신 분들은 참고 자료

 

Spring Interceptor(혹은 Servlet Filter)에서 POST 방식으로 전달된 JSON 데이터 처리하기 : TOAST Meetup

Spring Interceptor(혹은 Servlet Filter)에서 POST 방식으로 전달된 JSON 데이터 처리하기

meetup.toast.com

 

반응형

+ Recent posts