Etc

[Tomcat] Tomcat에서 POST방식 요청 시 parameter가 null로 들어오는 경우에 확인해 볼 사항

coding-knowjam(코딩노잼) 2020. 12. 17.
728x90

안녕하세요

최근에 SM을 맡고 있는 사이트에서 발생한 이슈에 대해서 포스팅해보려고 합니다.

1. 문제점 및 해결 전 상황

  • POST방식으로 요청하는 경우 화면에서 받아온 parameter의 값 중 일부분이 null로 들어오는 현상
  • POST방식으로 동작하는 다른 로직들에서는 parameter의 값이 정상적으로 들어옴
  • 문제가 발생하는 화면에서 다른 값으로 바꿔서 요청하면 정상적으로 parameter의 값이 들어옴 (특정 데이터에 대해서만 일부분의 값이 null로 들어옴)

예를 들어 A데이터 선택 후 요청 시 일부분 null, B데이터 선택 후 요청 시 정상적으로 값이 받아지는 상황

 

2. 원인 파악

운영을 하면서 제일 당황스러운 상황이 이런 상황입니다.

최근에 뭔가 소스를 수정한 적이 없는데 갑자기 문제가 발생하는 경우

그리고 그 문제가 소스 문제라면 에러 메시지를 보고 해결해 볼 텐데 NullPointerException만 발생하고 왜 null값이 들어오는지 도통 원인을 모르겠는 상황..

 

문제 해결을 위해 경우의 수를 하나하나 따져보았습니다.

  1. form태그 안에 parameter의 name값은 제대로 작성했는가?? -> 기존에 잘 사용하던 부분이고 소스 수정도 한 적이 없으므로 이상 없음
  2. post방식으로 요청 시 form태그에 있는 값들은 넘어가긴 하는가?? -> POST방식으로 요청 후에 실행되는 로직에서 값들에 대해서 로그를 찍어보니 일부는 null, 일부는 정상적으로 들어옴
  3. 최근에 작업했던 것들이 있는가?? -> 최근 6개월 내에 해당 로직 관련해서 소스코드 수정한 적은 없음, WAS 서버 OS를 Window에서 Linux로 변경하면서 tomcat6에서 tomcat7로 업그레이드

소스코드를 계속 분석해보니 코드에서 발생하는 문제는 아닌 것 같았고, Tomcat의 버전 업그레이드가 영향을 준 것 같아서 Tomcat6, 7의 server.xml을 비교해서 확인해보았는데 둘 다 동일하게 아래와 같이 작성되어 있었습니다.

<!-- 다른 쪽 설정은 기본 tomcat설정과 동일 -->

<Connector port="8080" redirectPort="8443" connectionTimeout="20000" protocol="HTTP/1.1"
		maxParameterCount="0" maxPostSize="0" URIEncoding='EUC-KR"  />

눈여겨볼 만한 부분은 maxParameterCount="0" maxPostSize="0" 2개의 속성인 것 같습니다.

2개 속성을 설정하는 값이 버전 별로 달라서 문제가 발생하는 거라고 생각했고, 공식문서를 찾아서 비교해봤습니다.

 

  • Tomcat 6 문서 (http://tomcat.apache.org/tomcat-6.0-doc/config/http.html)
  • Tomcat 7 문서 (http://tomcat.apache.org/tomcat-7.0-doc/config/http.html)
  maxParameterCount 설명
Tomcat 6 The maximum number of parameters (GET plus POST) which will be automatically parsed by the container. A value of less than 0 means no limit. If not specified, a default of 10000 is used. Note that FailedRequestFilter filter can be used to reject requests that hit the limit.
Tomcat 7 The maximum number of parameter and value pairs (GET plus POST) which will be automatically parsed by the container. Parameter and value pairs beyond this limit will be ignored. A value of less than 0 means no limit. If not specified, a default of 10000 is used. Note that FailedRequestFilter filter can be used to reject requests that hit the limit.

 

  maxPostSize 설명
Tomcat 6 The maximum size in bytes of the POST which will be handled by the container FORM URL parameter parsing. The limit can be disabled by setting this attribute to a value less than or equal to 0. If not specified, this attribute is set to 2097152 (2 megabytes).
Tomcat 7 The maximum size in bytes of the POST which will be handled by the container FORM URL parameter parsing. The limit can be disabled by setting this attribute to a value less than zero. If not specified, this attribute is set to 2097152 (2 megabytes). Note that the FailedRequestFilter can be used to reject requests that exceed this limit.

 

간단하게 해당 속성을 설명하겠습니다.

maxParameterCount는 parameter의 개수를 제한(GET+POST)하는 속성으로 default값은 10000이며, 0 미만의 값을 지정하면 parameter의 개수를 무제한으로 사용할 수 있습니다.

maxPostSize는 POST방식으로 요청할 때, parameter의 최대 byte값을 지정하는 속성으로 default값은 2097152 (2MB)입니다. byte값을 무제한으로 사용하기 위해서는 Tomcat 6 버전은 0 이하의 값을 지정, Tomcat 7 버전은 0 미만의 값을 지정해야 합니다.

 

3. 해결

공식문서를 보고 나니 알겠습니다. byte값이 2MB를 넘는 parameter는 null로 처리되고, 2MB보다 적은 parameter의 값은 정상적으로 처리가 되어서 이런 문제가 발생한 것으로 보입니다. (이래서 문서 확인은 필수!!)

maxParameterCount와 maxPostSize에 값을 -1로 아래와 같이 수정 후 Tomcat을 재 기동 하니 문제 해결!!

<!-- tomcat 6버전일 때 셋팅 -->
<Connector port="8080" redirectPort="8443" connectionTimeout="20000" protocol="HTTP/1.1" 
		URIEncoding="EUC-KR"
       		maxParameterCount="0"   <-- 초기 설정 값이 잘못된 것으로 보임
        	maxPostSize="0"  	<-- 6버전에서는 0이하의 값
/>
          
          
<!-- tomcat 7버전일 때 셋팅 -->
<Connector port="8080" redirectPort="8443" connectionTimeout="20000" protocol="HTTP/1.1" 
		URIEncoding="EUC-KR"
       		maxParameterCount="-1"  <-- 6,7버전에서는 0미만의 값
        	maxPostSize="-1" 	<-- 7버전에서는 0미만의 값 
/>

 

4. 참고사항

구글링을 하다 보면 아래와 같은 내용을 여러 블로그에서 찾아볼 수 있는데 맞는 정보인지 잘 모르겠습니다.

  • Tomcat 7.0.63 미만 : maxPostSize를 0 이하로 설정하면 무제한 
  • Tomcat 7.0.63 이후 & Tomcat 8.x 이후 : maxPostSize를 0 미만으로 설정해야 무제한

왜냐면 제가 현재 공식문서에서 찾은 내용은 Tomcat의 버전이 7.x일 때에 대한 내용이기 때문입니다.

마이너 버전에 따라서 설정이 구분되는 경우는 공식문서에도 특별한 내용을 찾지는 못했습니다.

(혹시나 이와 관련해서 공식문서에서 찾으신 분이 있으면 알려주시면 감사하겠습니다.)


728x90

댓글