413 Content Too Large
사용법
413 Content Too Large 오류 메시지를 받으면 클라이언트가 서버에 비해 너무 큰 요청 본문을 보내고 있다는 뜻입니다. 흔한 예로는 클라이언트가 허용되는 유형과 형식의 파일을 보내려 하지만 그 파일이 크기 제한을 넘는 경우가 있습니다. 예를 들어 사진은 필요 이상으로 해상도가 높은 경우가 많으며, 의도한 용도에 지장을 주지 않으면서도 훨씬 작게 만들 수 있습니다. 서버는 이미지 파일을 수정하는 책임을 떠안기보다 전송을 거부하고, 필요한 처리는 클라이언트가 하도록 맡깁니다.
이런 상황에서 클라이언트는 Expect: 100-continue 헤더를 사용해 PUT을 시작하기 전에 파일 크기 허용 여부를 미리 확인합니다. 서버가 이에 응답하면 그 결과에 따라 메시지 본문을 보내거나 보내지 않습니다.
서버는 선택적으로 응답에 Retry-After 헤더를 보냅니다. 이 헤더가 있으면 클라이언트는 지정된 기간이 지난 뒤 또는 지정된 날짜와 시각에 요청을 다시 시도합니다. 예를 들어 클라이언트가 주간 업로드 할당량을 초과했거나 피크 시간대에는 대용량 업로드가 허용되지 않는 경우, 서버는 더 적절한 시점에 다시 시도하라고 제안합니다.
서버의 저장 공간이 부족해 이런 상황이 발생했다면 서버는 대신 507을 보냅니다.
서버는 클라이언트가 메시지 본문을 보내지 못하도록 Connection: close 헤더를 포함해 연결을 종료합니다.
참고
WAF와 CDN 방화벽(Cloudflare, AWS WAF)은 오리진 서버와 별개로 본문 크기 제한을 적용합니다. 오리진 서버의 한도가 페이로드보다 큰데도 오류가 난다면 WAF/방화벽 로그를 확인하세요. 페이로드 크기를 줄이는 방법으로는 Content-Encoding: gzip으로 압축하기, 큰 결과 집합에 페이지네이션 적용하기, 대용량 파일에 멀티파트나 이어받기 가능한 업로드 사용하기가 있습니다.
SEO 영향
Google 같은 검색 엔진은 413 응답 상태를 가진 URL을 색인하지 않습니다. 이전에 색인된 URL은 검색 결과에서 제거됩니다.
예시
클라이언트가 파일을 보내려 하지만, 지금 트래픽이 많아 서버는 413 Content Too Large로 응답합니다. 서버는 요청을 거부하고 연결을 닫으며, 30분 뒤 다시 시도할 것을 제안합니다.
요청
PUT /docs HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 10000
응답
HTTP/1.1 413 Content Too Large
Retry-After: 1800
Connection: close
Content-Type: text/html
Content-Length: 188
<html>
<head>
<title>File Too Large</title>
</head>
<body>
<p>Too much server traffic to accept the transfer
at this time. Try again after 30 minutes.</p>
</body>
</html>
해결 방법
이 오류는 스택에서 크기 제한을 가장 먼저 적용하는 계층, 즉 웹 서버, 리버스 프록시, CDN, 또는 애플리케이션 프레임워크 중 어느 하나에서 비롯됩니다. 413을 반환하는 계층을 찾아 그곳에서 한도를 조정하세요.
nginx: http, server, 또는 location 블록에 client_max_body_size를 설정하세요. 값이 0이면 검사를 완전히 비활성화합니다(운영 환경에서는 권장하지 않습니다). 값을 바꾼 뒤 nginx를 재시작하세요.
Apache: httpd.conf나 .htaccess에 LimitRequestBody를 설정하세요. 값의 단위는 바이트이므로 10 MB는 10485760입니다. 적용하려면 Apache를 리로드하세요.
IIS: web.config 파일의 system.webServer > security > requestFiltering > requestLimits 아래에서 maxAllowedContentLength 속성을 편집하세요.
PHP: php.ini에서 upload_max_filesize와 post_max_size를 함께 조정하세요. post_max_size 값은 upload_max_filesize와 같거나 더 커야 합니다.
Node.js / Express: body-parser나 Express 내장 JSON/URL 인코딩 미들웨어의 limit 옵션을 설정하세요. 예: express.json({ limit: ‘50mb’ }).
Cloudflare: Free와 Pro 요금제는 업로드를 100 MB, Business는 200 MB, Enterprise는 500 MB로 제한합니다. 이 한도를 넘는 업로드는 오리진에 도달하기 전에 413을 반환합니다. Cloudflare 뒤에서 대용량 파일을 업로드하려면 프록시를 우회하거나 청크 업로드 전략을 사용하세요.
클라이언트 쪽에서는 큰 페이로드를 보내기 전에 압축하거나 청크로 나누세요. 파일 업로드의 경우 서버 한도 안에 머물도록 멀티파트나 이어받기 가능한 업로드 프로토콜을 구현하세요. 전체 본문을 전송하기 전에 서버가 그 페이로드 크기를 받아들일지 확인하려면 Expect: 100-continue 메커니즘을 사용하세요.
코드 참고
.NET
HttpStatusCode.RequestEntityTooLarge
Rust
http::StatusCode::PAYLOAD_TOO_LARGE
Rails
:payload_too_large
:request_entity_too_large
Go
http.StatusRequestEntityTooLarge
Symfony
Response::HTTP_REQUEST_ENTITY_TOO_LARGE
Python3.5+
http.HTTPStatus.REQUEST_ENTITY_TOO_LARGE
Java
java.net.HttpURLConnection.HTTP_ENTITY_TOO_LARGE
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_REQUEST_TOO_LONG
Angular
@angular/common/http/HttpStatusCode.PayloadTooLarge