Server

[WAS]POST 방식에서 파라미터 개수 제한

  • -
반응형

GET 방식에서의 URL 글자수 제한이 있는 것은 흔한 사실(IE 기준)이며, POST 방식에서는 제한 없이 보낼 수 있는 것으로알고 있습니다. 이 생각에 사로잡혀서 조금 헤맸던 적이 있습니다.

 

한번은 Tomcat을 사용하는 환경에서 POST 방식을 사용하던 중 컨트롤러에서 파라미터를 받아오지 못하는 현상이 있었습니다. 로그를 찍어봐도 파라미터가 넘어오지 않아 대체 원인이 뭘까 고민하던 중 찾은 원인은 Tomcat에서 파라미터 개수 제한이 걸려 받지 못하던 것이었습니다.

 

해서 오늘은 Tomcat : POST 방식의 파라미터 제한에 대한 실험과 해결법을 포스팅 남깁니다.


기본적으로 Tomcat POST 방식의 파라미터 최대 크기(Size)는 2097152(2MB) 이며 최대 개수는 10000개라고 한다.
(Tomcat 7.0 ver 기준)

 

테스트 코드를 만들었다.

Submit을 하기전 form 안에 10000개가 조금 넘는 파라미터 값을 만들고, Submit을 시켜보기로 했다.

 

test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<script>
function fnct_submit() {
	var html = "";
	
	for(var i = 0; i < 10009; i++) {
		html += "<input type='text' class='form-control' name='iptTitle" + i + "'  id='iptTitle" + i + "' value='파라미터값" + i + "'>";
	}
	
	$("#space").html(html);
	
	$("#frm").submit();
}

$(document).ready(function() {	
	
});
</script>
<form:form id="frm" action="/notice/writeNotice.ajax" method="POST"> 
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
<div class="container-fluid">
	<div class="row">
		<span id="space"></span>	
	</div>
</div>

<button type="button" class="btn btn-outline-secondary" onclick="fnct_submit()">SUBMIT</button>
</form:form>

 

Controller.java

	@RequestMapping(value = "/notice/writeNotice.ajax", method = {RequestMethod.POST})
	public ModelAndView writeNotice(@RequestParam HashMap<String, Object> paramMap, HttpSession session) throws Exception {
		ModelAndView mav = new ModelAndView();
							
		try {						
			logger.info("파라미터 : " + paramMap);						
			
			mav.addObject("msg", "저장되었습니다.");						
			mav.setViewName("common/msg"); 	
		} catch (Exception e) {
			e.printStackTrace();			
		}
		
		return mav;
	}

로그를 보자.

Map 형태의 paramMap을 찍었을 때, csrf 토큰과 파라미터값0 부터 쭉 넘어온 것을 확인할 수 있었다.

 

 

그런데 끝까지 이동해본 결과 마지막 파라미터의 값은 10008이 아닌 9998이었다.

전체 파라미터 중 일부가 잘린 것이다.

 

이 문제에 대한 해결은 어렵지 않다.

Tomcat의 POST 파라미터 개수 및 사이즈 제한을 풀어주면 된다.

 

Tomcat - server.xml의 Connector 설정 부분에 maxPostSizemaxParameterCount 옵션을 추가해주면 된다.

  • maxPostSize : POST 방식으로 보낼 때 파라미터 사이즈 
  • maxParameterCount : POST 방식으로 보낼 때 파라미터 개수

제한을 없애기 위해서는 

☞ Tomcat 7.0.63 이전은 "0"

 Tomcat 7.0.63 & Tomcat 8.x 이후는 "-1"

<Connector connectionTimeout="20000" port="8099" protocol="HTTP/1.1" redirectPort="8443" maxPostSize="-1" maxParameterCount="-1"/>

 

*만약 Tomcat + Apache를 연동하여 사용한다면 AJP 포트에 설정하면 된다.

<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" maxPostSize="-1" maxParameterCount="-1" />

 

제한을 없앤 후 다시 테스트해보면 모든 파라미터가 정상적으로 넘어온다.

 

참고

https://sarc.io/index.php/tomcat/948-tomcat-post-parameter

https://okky.kr/article/307144?note=1016242

 


+ 피드백은 언제나 환영입니다 :)

 

반응형

'Server' 카테고리의 다른 글

Apache + Tomcat 세션 클러스터링  (0) 2022.01.28
[WAS]Tomcat 한글 깨짐(???? 현상)  (0) 2020.09.15
아파치 SSL 설정  (5) 2020.02.05
아파치 톰캣 연동(Apache + Tomcat)  (2) 2020.02.03
[WAS]Tomcat SSL 적용  (0) 2020.02.03
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.