Watch at Ease세상을 읽고, 일상의 답을 찾다.

기술 · 실용 가이드

NGINX를 바꿔도 413인가요? body 제한을 집행하는 hop부터 증명하세요

모든 proxy 제한을 키우거나 무제한으로 만들지 마세요. 같은 marked request로 최초 거부 hop을 찾고 실제 설정을 덤프한 뒤 하나의 유한 scope만 바꾸고 경계 아래와 위를 검증하세요.

HTTP 413 hop 소유권 지도
원본 일러스트: marked request를 처음 거부하는 계층 식별. Watch at Ease

모든 proxy 제한을 키우거나 무제한으로 만들지 마세요. 같은 marked request로 최초 거부 hop을 찾고 실제 설정을 덤프한 뒤 하나의 유한 scope만 바꾸고 경계 아래와 위를 검증하세요.

HTTP 413은 request path의 어떤 server/proxy hop에서도 올 수 있습니다. NGINX client_max_body_size 기본값은 1m이며 http, server, location에 둘 수 있습니다.

1. 재현 request 고정

목표 limit 주변의 정확한 byte 수를 가진 무해한 body를 만들고 같은 method, auth, content type과 고유 request ID로 정확한 route에 보냅니다. status, headers, response prefix, 시간, client trace를 저장하고 browser 문구로 owner를 판단하지 않습니다.

2. 최초 거부 hop 식별

response headers, TLS endpoint, server signature, request ID를 각 hop의 access/error log와 맞춥니다. 가장 먼저 413을 만든 계층이 거부 owner이며 app에 같은 request가 없으면 body가 도달하지 않은 것입니다.

3. 실제 policy 증명

standalone NGINX는 실제 instance에서 nginx -T를 수집해 URI를 지배하는 http, server, location을 찾습니다. ingress-nginx는 Ingress, annotation, controller version, ConfigMap, generated block을 저장하고 edge와 app cap을 분리합니다.

4. 유한한 한 계층만 변경

memory, buffer, timeout, scanner, storage가 감당할 유한 값을 선택하고 최초 거부 계층의 목표 scope만 바꿉니다. security review 없이 0으로 만들지 않습니다. syntax와 새 worker, Pod, generation을 보존합니다.

5. 경계 양쪽 시험

같은 request로 limit 바로 아래, 가능하면 정확히 limit, 바로 위를 시험합니다. 작은 body는 app에 도달하고 큰 body는 예상 계층에서 거부되어야 합니다. bytes, route, config hash, logs, 결과, rollback과 small request health를 기록합니다.

HTTP body limit 경계 시험
원본 일러스트: 유한한 한 계층을 바꾸고 경계 양쪽 증명. Watch at Ease