http 헤더 값의 최대 값?


326

HTTP 헤더에 허용되는 최대 크기가 있습니까? 그렇다면 무엇입니까? 그렇지 않은 경우 이것은 서버에 특정한 것이거나 어떤 크기의 헤더를 허용하는 표준입니까?

답변:


316

아니요, HTTP는 제한을 정의하지 않습니다. 그러나 대부분의 웹 서버는 허용하는 헤더 크기를 제한합니다. 예를 들어 Apache 기본 제한 은 8KB이고 IIS는 16K 입니다. 413 Entity Too Large헤더 크기가 해당 제한을 초과하면 서버에서 오류 를 반환 합니다.

관련 질문 : 사용자 에이전트 문자열은 얼마나 커질 수 있습니까?


10
이 답변은 서버가 허용하는 최대 헤더 크기를 나타냅니다. 그러나 웹 서버 (예 : Apache)가 전송할 수있는 최대 헤더 크기는 얼마입니까?
Pacerier

@Pacerier : 아파치의 경우 8175 바이트처럼 보이지만 여전히 검색 중입니다. 또한 백엔드가 무엇이든 한계에 도달하면 유용한 오류 메시지가 표시되지 않습니다.
hakre

2
@hakre : IIRC, 전체 줄에 대해 8K, 전체 헤더 줄 (헤더 이름, 공백 및 헤더 페이로드)을 계산합니다.
vartec

헤더의 사용자 정의 최대 크기를 정의하는 방법이 있습니까?
Sudip Bolakhe

SPNego 및 Kerberos 프로토콜 요구 사항으로 인해 IIS가 16k에 열려있을 수 있으며 "Windows 인증"에 자주 사용됩니다.
Ronan Kerdudou '12

220

vartec이 위에서 언급했듯이 HTTP 사양은 제한을 정의하지 않지만 많은 서버가 기본적으로 사용합니다. 이것은 실제로 하한이 8K 임을 의미 합니다. 대부분의 서버에서이 제한 은 요청 라인과 모든 헤더 필드합계에 적용 되므로 쿠키를 짧게 유지하십시오.

nginx는 기본적으로 시스템 페이지 크기 (대부분의 시스템에서 4K)를 사용합니다. 이 작은 프로그램으로 확인할 수 있습니다 :

pagesize.c :

#include <unistd.h>
#include <stdio.h>

int main() {
    int pageSize = getpagesize();
    printf("Page size on your system = %i bytes\n", pageSize);
    return 0;
}

gcc -o pagesize pagesize.c다음으로 컴파일하고 실행하십시오 ./pagesize. Linode의 우분투 서버 는 정답이 4k라고 알려줍니다.


6
아파치를 들어, URL의 길이에 의해 제어됩니다 LimitRequestLineLimitRequestFieldSize... indivually 각 HTTP 헤더 라인이 아닌 "의 ... 합을"적용
이브 마틴에게

1
쿠키의 크기 제한은 4093 바이트입니다. stackoverflow.com/questions/640938/…
Jeff Lowery

25
페이지 크기를 얻기 위해 코드를 작성할 필요가 없습니다. 터미널에서 : getconf PAGESIZE
Ponytech

6
이 답변이 작성된 이후로 변경되었을 수 있지만 연결된 nginx 페이지가 답변과 일치하지 않습니다. nginx 페이지는 기본 버퍼 크기가 8k이고 요청이 기본적으로 4 개의 버퍼를 사용할 수 있음을 나타냅니다 (버퍼 크기 자체는 요청 라인 및 각 개별 헤더의 크기를 제한 함). 따라서 이것은 nginx가 16-32k 사이의 어딘가를 허용 함을 나타냅니다 (한 줄을 두 개의 버퍼로 나눌 수 없으므로 버퍼가 완전히 채워지지 않을 수 있습니다).
릴리 발라드

동일하게 유지되는 아파치 2.4에 값 추가 : httpd.apache.org/docs/2.4/mod/core.html#limitrequestfieldsize : Apache 2.0, 2.2,2.4 : 8K
Med Ali Difallah

5

HTTP는 2.5 절에서 설명한 것처럼 각 헤더 필드의 길이 또는 헤더 섹션의 길이에 미리 정의 된 제한을 두지 않습니다. 개별 헤더 필드 길이에 대한 다양한 임시 제한은 실제로 특정 필드 의미에 따라 실제로 발견됩니다.

HTTP 헤더 값은 서버 구현에 의해 제한됩니다. HTTP 사양은 헤더 크기를 제한하지 않습니다.

처리하고자하는 것보다 큰 요청 헤더 필드 또는 필드 세트를 수신하는 서버는 반드시 적절한 4xx (클라이언트 오류) 상태 코드로 응답해야합니다. 이러한 헤더 필드를 무시하면 밀수 공격을 요청하는 서버의 취약성이 증가합니다 (9.5 절).

413 Entity Too Large이 문제가 발생하면 대부분의 서버가 반환 되거나 적절한 4xx 오류가 발생합니다.

필드 시맨틱이 메시지 프레이밍 또는 응답 시맨틱을 변경하지 않고 드롭 된 값 (들)을 안전하게 무시할 수있는 경우, 클라이언트는 처리하고자하는 것보다 큰 수신 된 헤더 필드를 폐기 또는 절단 할 수있다 (MAY).

캡핑되지 않은 HTTP 헤더 크기는 서버가 공격에 노출되도록하며 유기적 인 트래픽을 처리하는 능력을 떨어 뜨릴 수 있습니다.

출처


2

가장 인기있는 웹 서버의 한계는 다음과 같습니다

  • 아파치-8K
  • Nginx-4K-8K
  • IIS-8K-16K
  • 톰캣-8K – 48K

1

또한 경우에 따라 많은 헤더의 경우 502/400의 이유는 크기에 관계없이 많은 수의 헤더 때문일 수 있습니다. 문서에서

tune.http.maxhdr 요청의 최대 헤더 수를 설정합니다. 요청에이 값보다 많은 헤더가 있으면 (첫 번째 줄 포함) "400 잘못된 요청"상태 코드로 거부됩니다. 마찬가지로 "502 Bad Gateway"로 너무 큰 응답이 차단됩니다. 기본값은 101이며, 광범위하게 배포 된 Apache 서버가 동일한 제한을 사용한다는 점을 고려하면 모든 사용에 충분합니다. 버그가있는 애플리케이션이 수정 될 때까지 일시적으로 작동하도록이 한계를 더 높이는 것이 유용 할 수 있습니다. 각각의 새로운 헤더는 각 세션마다 32 비트의 메모리를 소비하므로이 한계를 너무 높이 지 마십시오.

https://cbonte.github.io/haproxy-dconv/configuration-1.5.html#3.2-tune.http.maxhdr

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.