[Spring] 갑자기 POST가 안되는 현상(feat.XSSFilter)
정말 문법을 확인하고 또 확인해도 정확히 썼는데 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' 카테고리의 다른 글
[Spring] 절대경로와 상대경로(feat.${pageContext.request.contextPath}) (0) | 2020.04.28 |
---|---|
[Spring] GET URL 범위 초과 문제 및 해결(feat.HTTP) (0) | 2020.03.15 |
[Spring] GET 파라미터(parameter) 데이터 받기 총 정리 (0) | 2019.12.15 |
[Spring] MyBatis 데이터 HashMap으로 받기 (0) | 2019.10.31 |
[Spring] @Scheduled (0) | 2019.10.30 |