본문 바로가기
IT/linux

POST 시 수신 측에서 데이터 짤려서 받을 때

by 어느해겨울 2021. 12. 21.

POST 시 수신 측에서 데이터 짤려서 받을 때

 

웹 페이지에서 새로운 윈도 팝업을 띄우면서 post를 하는 간단한 동작을 만들었다.

현재 프로토 타입이라 json 데이터는 약 8만 바이트를 약간 넘는 작은 사이즈임에도 불구하고 데이터 일부가 유실되는 상황이 발생하였다.

 

처음에는 보내는 쪽을 console.log 및 F12 개발도구에서 request / response 데이터를 살펴보았지만 request 데이터는 정상적으로 송신하였고 response는 받은 만큼만 처리해서 응답하는 것을 확인하였다.

 

그래서 다른 해결 방법을 찾으려 linux 내에서 apache2 error 로그를 확인하다보니 재미있는 문장을 발견하였다.

 

tail -f /var/log/apache2/error.log

[Tue Dec 21 07:55:57.975980 2021] [php7:warn] [pid 30679] [client 192.168.47.159:13346] PHP Warning:  Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in Unknown on line 0, referer: -

To increase the limit change max_input_vars in php.ini.

php.ini 파일 내에 있는 max_input_vars 를 더 크게 변경하라는 거 아닌가.. 그래서 조치를 취했다.

 

/etc/php/7.4/apache2/php.ini

; How many GET/POST/COOKIE input variables may be accepted
; max_input_vars = 1000
max_input_vars = 50000

 

max_input_var 의 기본값이 1000으로 설정되어 있는데 이 것을 큰 수로 변경하고 웹 서버를 재시작하니 해결되었다.

 

파라미터의 사이즈를 조절하는 것은 근본적인 해결이 아니라고 생각한다. 지금보다 복잡해지고 커질 데이터를 생각하면 매번 파라미터를 적절하게 고쳐줄 수 없을 테니..

그리고 개발 환경에서는 자유롭게 수정할 수 있더라도 상용이나 root 권한을 사용할 수 없는 임대 서버 같은 경우에는 해당 방법을 사용할 수 없으니 post 시 데이터를 분할하거나 post가 아닌 다른 방식으로 데이터를 전송하는 것도 염두해야 한다.

http의 헤더 중 Content-Type:application/json이나 뭐 multipart 데이터로 바꾸면 된다고 하던데 내가 직접 해본 게 아니라 그건 모르겠다. 근데 jquery post의 default content type은 application/json 일 텐데..

 

 

ps. max_input_vars 정보

https://www.php.net/manual/en/info.configuration.php#ini.max-input-vars

How many input variables may be accepted (limit is applied to $_GET, $_POST and $_COOKIE superglobal separately). Use of this directive mitigates the possibility of denial of service attacks which use hash collisions. If there are more input variables than specified by this directive, an E_WARNING is issued, and further input variables are truncated from the request.

 

 

댓글