HTTP 431 오류 이해하기: 개발자 가이드

431 HTTP 상태 코드는 “Request Header Fields Too Large”라고도 하며, 클라이언트 측 오류로서 서버가 요청의 헤더 필드가 너무 크기 때문에 처리를 거부함을 나타냅니다. 이 오류는 헤더의 총 크기 또는 단일 헤더 필드가 허용된 크기를 초과하여 발생할 수 있습니다.

HTTP 431 상태 코드는 RFC 6585에서 처음 소개되었으며, 이는 2012년 4월에 발표되었습니다. 이는 HTTP/1.1에 대한 추가 응답을 표준화하려는 노력의 일환으로, 당시 기존 상태 코드로 커버되지 않은 문제를 해결하기 위한 것이었습니다. 이 특정 오류 코드를 도입하는 것은 서버 보안을 강화하고 버퍼 오버플로우 공격과 같은 악의적인 공격을 방지하는 데 중요했습니다. 이러한 공격은 큰 헤더를 악용할 수 있습니다.

HTTP 431 오류 이해하기

431 오류가 발생하면 서버가 클라이언트의 요청을 과도하게 큰 헤더 필드로 인해 차단했음을 의미합니다. 각 서버는 HTTP 헤더 필드에 대한 최대 허용 크기에 대한 자체 정책을 가지고 있으며, 이는 서비스 거부 공격으로부터 보호하는 데 도움이 됩니다.

HTTP 431 오류의 일반적인 증상

  • 요청 헤더의 총 크기가 너무 큼: 이 오류는 모든 요청 헤더의 누적 크기가 제한을 초과할 때 발생합니다.
  • 개별 헤더 필드의 크기가 너무 큼: 이 경우 단일 헤더 필드가 너무 커서 처리할 수 없어 431 오류가 발생합니다.

HTTP 431 오류의 일반적인 원인

  • 쿠키가 너무 많음: 지나치게 크거나 많은 쿠키가 431 오류를 유발할 수 있습니다. 동일한 쿠키가 여러 번 설정되거나 여러 쿠키가 단일 요청 또는 응답에 결합될 때 이런 현상이 발생할 수 있습니다. 일반적인 시나리오는 동일한 localhost 포트를 여러 프로젝트에 재사용하고 해당 프로젝트의 모든 쿠키를 요청과 함께 전송하는 경우입니다.
  • 헤더 필드 캐싱 부적절: 큰 헤더를 잘못 캐싱하면 431 오류가 발생할 수 있습니다. 부적절한 캐싱은 헤더 크기를 증가시켜 버퍼 오버플로를 일으킬 수 있습니다.
  • 불필요하거나 형식이 잘못된 요청 헤더: HTTP 헤더를 과도하게 사용하면 서버가 설정한 크기 제한을 초과하는 요청이 발생하여 431 응답이 나타날 수 있습니다. 또한, 헤더가 올바르게 형식화되었는지 확인하세요. Referer URL이 너무 길면 431 오류가 발생할 수 있습니다.

431 오류를 피하는 방법

쿠키 지우기

정기적으로 클라이언트 측에서 쿠키를 지우세요 (Chrome 개발자 도구 > 애플리케이션 > 쿠키) 및 서버에서 사용하는 쿠키 수를 제한하세요.

헤더 캐싱

헤더 캐싱을 올바르게 구현하십시오 캐시된 헤더가 실제 요청과 압축 응답을 반영하도록 하십시오. 조건부 요청에 중점적으로 의존하는 경우 ETags를 조정하십시오. 큰 ETags는 오류에 기여할 수 있습니다.

HTTP 헤더 최소화

HTTP 헤더를 단순화하여 필요한 정보만 포함하십시오. 특히 Authorization, Referer, User-Agent와 같은 헤더에 중복된 메타데이터를 포함하지 마십시오.

헤더 크기 압축

때때로, 너무 많은 헤더를 보내지 않지만, 제어할 수 없는 제약으로 인해 헤더가 비대해질 수 있습니다(예: JWT 토큰에 많은 정보가 인코딩되어 있는 경우). 헤더 압축은 요청 헤더의 크기를 크게 줄일 수 있습니다. HTTP/2와 HTTP/3와 같은 프로토콜을 활용하십시오. 이 프로토콜들은 기본적으로 헤더 압축을 지원하며, 추가 설정 없이 헤더 크기를 자동으로 줄일 수 있습니다.

서버 최대 헤더 크기 제한 처리

HTTP 사양은 헤더 크기에 대한 제한을 정의하지 않지만, 많은 서버는 제한을 두고 있습니다. 다음은 다양한 인기 웹 서버/호스트의 제한입니다:

  • Apache: 8K
  • nginx: 4K-8K
  • IIS: 8K-16K
  • Tomcat: 8K-48K
  • Node: (<13) – 8K; (>13) – 16K
  • Cloudflare: 헤더당 16K, 총 32K

대부분의 서버는 일정 형태의 구성을 허용하며, 서버 소프트웨어의 다른 버전들은 더 낮거나 높은 한계를 가질 수 있습니다. 또한 최신 문서를 확인하여 이러한 한계가 요청의 다른 부분(예: 쿠키)을 포함하는지 아니면 일반 헤더만 포함하는지 확인해야 합니다.

요청 헤더 크기 한계 증가

때로는 요청 헤더 크기 한계를 늘리는 것이 필요할 수 있습니다. 일반적으로 서버의 웹 콘솔이나 CLI에서 이를 수행할 수 있습니다. 로컬에서 개발 중이라면, 이 값을 구성할 수 있는 CLI 플래그가 일반적으로 있습니다. Node JS에서 요청 헤더 크기 한계를 구성하는 플래그는 다음과 같습니다:

Shell

 

참고: 헤더 크기 한계를 늘리는 것은 주의해서 해야 합니다. 더 큰 헤더는 더 많은 메모리를 소비하고 성능을 저하시킬 수 있습니다.

HTTP 431 오류 응답 보내는 방법

서버에 요청 헤더 크기 한계를 결정하는 것에 의존하고 싶지 않거나, API 엔드포인트별로 사용자 정의 헤더 크기 한계를 적용하고 싶을 수 있습니다. 다음 단계를 따라 자신의 431 오류를 보내는 방법을 배우세요.

API에 요청 헤더 크기 한계 구축

위에서 언급했듯이, 호스트 + 서버 조합은 자동으로 한계를 적용할 가능성이 큽니다. API에 사용자 정의 요청 헤더 크기 한계 기능을 구축하려면 Node.js의 express와 같은 라이브러리를 사용할 수 있습니다. 요청 헤더 크기에 대한 한계를 활성화하는 예제는 다음과 같습니다:

JavaScript

 

요청 헤더의 총 크기와 단일 헤더 필드 간의 오류 응답 구분

HTTP 431 오류를 처리할 때 두 가지 시나리오에 대한 응답을 구분해야 합니다:

  1. 요청 헤더의 총 크기가 너무 큼: 헤더의 누적 크기가 너무 크다는 응답을 반환합니다.
  2. 개별 헤더 필드의 크기가 너무 큼: 이 경우, 허용 가능한 크기를 초과하는 특정 헤더 필드를 명시하는 오류 응답을 제공합니다.

이전 섹션의 예제를 수정하여 구분된 오류 응답을 달성합니다:

JavaScript

 

HTTP 431 응답 예제

사용자에게 응답할 때 문제 세부 정보 형식 API 응답을 사용하는 것을 권장합니다.

JSON

 

게이트웨이가 요청 헤더 크기 제한을 처리하게 하기

API 게이트웨이를 사용하는 경우, 요청 파이프라인에 정책을 쉽게 추가하여 이를 처리할 수 있습니다. Zuplo를 사용하여 이를 수행하는 방법은 다음과 같습니다:

루트 디자이너에서 루트로 이동한 후 요청 파이프라인에서 정책 추가를 클릭합니다.

정책 선택 모달에서 원하는 작업에 따라 두 가지 옵션이 있습니다.

  1. 요청 크기 제한 정책을 사용하여 전체 요청 크기를 제한합니다.
  2. 사용자 정의 코드 인바운드 정책을 사용하고 위의 코드 예제(익스프레스 부분 제외)를 타입스크립트 모듈에 복사하여 정책에 연결하세요.

결론

HTTP 431 오류는 주로 요청 헤더가 너무 큰 경우에 발생합니다. 이 오류를 피하려면 헤더를 최적화하고 필요에 따라 압축하며, API에서 요청 헤더 크기 제한을 구현해야 합니다.

또한, API에서 헤더 크기 제한 검사를 구현하는 것은 간단합니다. 대부분의 서버는 기본값을 포함하고 있으며, API 라우트 내에서 누적 및 개별 헤더 수준에서 직접 구현할 수 있습니다.

Source:
https://dzone.com/articles/understanding-the-http-431-error