Comprendiendo el error HTTP 431: Guía para desarrolladores

El código de estado HTTP 431, también conocido como “Campos de Encabezado de Solicitud Demasiado Grandes”, es un error del lado del cliente que indica que el servidor se niega a procesar una solicitud porque sus campos de encabezado son demasiado grandes. Este error puede ser causado por el tamaño total de los encabezados o porque un solo campo de encabezado excede el tamaño permitido.

El código de estado HTTP 431 se introdujo por primera vez en RFC 6585, publicado en abril de 2012. Esto fue parte de un esfuerzo para estandarizar respuestas adicionales para HTTP/1.1, abordando problemas que no estaban cubiertos por los códigos de estado existentes en ese momento. Introducir este código de error específico fue crucial para mejorar la seguridad del servidor y prevenir ataques maliciosos como los ataques de desbordamiento de búfer, que podrían explotar encabezados grandes.

Comprensión del Error HTTP 431

Cuando ocurre un error 431, significa que el servidor ha bloqueado la solicitud del cliente debido a campos de encabezado excesivamente grandes. Cada servidor tiene sus propias políticas regarding el tamaño máximo permitido para los campos de encabezado HTTP, lo que ayuda a proteger contra ataques de denegación de servicio.

Síntomas Comunes de Errores HTTP 431

  • El tamaño total de los encabezados de solicitud es demasiado grande: Este error ocurre cuando el tamaño acumulado de todos los encabezados de solicitud excede el límite.
  • El tamaño de los campos de encabezado individuales es demasiado grande: En este caso, un solo campo de encabezado es demasiado grande para procesar, lo que lleva al error 431.

Causas Comunes de Errores HTTP 431

  • Demasiadas cookies: Tener cookies excesivamente grandes o muchas puede causar el error 431. Esto puede ocurrir si se establecen las mismas cookies múltiples veces o si se combinan múltiples cookies en una sola solicitud o respuesta. Un escenario común es reutilizar el mismo puerto localhost en varios proyectos y enviar todas las cookies de esos proyectos junto con una solicitud.
  • Almacenamiento en caché incorrecto de campos de encabezado: Almacenar en caché encabezados grandes de manera incorrecta puede llevar al error 431. El almacenamiento en caché inapropiado puede aumentar el tamaño del encabezado, causando un desbordamiento del búfer.
  • Encabezados de solicitud innecesarios o mal formateados: El uso excesivo de encabezados HTTP puede resultar en solicitudes que exceden los límites de tamaño establecidos por el servidor, lo que lleva a una respuesta 431. Además, asegúrate de que tus encabezados estén correctamente formateados. Tener una URL Referer demasiado larga puede activar un 431.

Cómo Evitar el Error 431

Limpiar Cookies

Limpiar regularmente las cookies en el lado del cliente (Herramienta de desarrollo de Chrome > Aplicación > Cookies) y restringir la cantidad de cookies utilizadas en el servidor.

Almacenar Encabezados en Caché

Implementar correctamente el almacenamiento en caché de encabezados para asegurarse de que los encabezados en caché reflejen la solicitud real y la respuesta comprimida. Ajusta los ETags si dependes mucho de ellos para solicitudes condicionales, ya que los ETags grandes pueden contribuir al error.

Minimizar los Encabezados HTTP

Simplifica tus encabezados HTTP para incluir solo la información necesaria. Evita incluir metadatos redundantes, especialmente en encabezados como Authorization, Referer y User-Agent.

Comprimir el Tamaño de los Encabezados

A veces, no estás enviando suficientes encabezados y tus encabezados están inflados debido a restricciones fuera de tu control (por ejemplo, tu token JWT codifica una gran cantidad de información). La compresión de encabezados puede reducir significativamente el tamaño de tus encabezados de solicitud. Utiliza protocolos como HTTP/2 y HTTP/3, que admiten la compresión de encabezados de forma predeterminada. Esto puede reducir automáticamente el tamaño de tus encabezados sin requerir configuración adicional.

Manejo de Límites Máximos de Tamaño de Encabezados del Servidor

La especificación HTTP no define un límite en el tamaño de los encabezados; sin embargo, muchos servidores sí lo hacen. Aquí están los límites para varios servidores/web hosts populares:

  • Apache: 8K
  • nginx: 4K-8K
  • IIS: 8K-16K
  • Tomcat: 8K-48K
  • Node: (<13) – 8K; (>13) – 16K
  • Cloudflare: 16K por encabezado, 32K en total

La mayoría de los servidores permiten algún tipo de configuración, y diferentes versiones del software del servidor pueden tener límites más bajos o más altos. También deberías consultar la documentación más reciente para ver si estos límites incluyen otras partes de la solicitud (por ejemplo, cookies) o solo las cabeceras regulares.

Aumentar el Límite de Tamaño de la Cabecera de Solicitud

A veces, puede ser necesario aumentar el límite de tamaño de la cabecera de solicitud. Generalmente, puedes hacerlo desde la consola web o la CLI de tu servidor. Si estás desarrollando localmente, suelen haber flags de CLI que pueden configurar este valor. Aquí está el flag para configurar los límites de tamaño de la cabecera de solicitud en Node JS:

Shell

 

Nota: Aumentar el límite de tamaño de la cabecera debe hacerse con precaución, ya que cabeceras más grandes pueden consumir más memoria y degradar el rendimiento.

Cómo Enviar Respuestas de Error HTTP 431

Tal vez no quieras confiar en tu servidor para determinar el límite de tamaño de la cabecera de solicitud, o quizás quieras imponer un límite de tamaño de cabecera personalizado por endpoint de API. Sigue los pasos a continuación para aprender cómo enviar tus propios errores 431.

Integrar Límites de Tamaño de Cabecera de Solicitud en tu API

Como se mencionó anteriormente, tu combinación de host + servidor probablemente impondrá automáticamente un límite. Para construir tu propia capacidad de límite de tamaño de cabecera de solicitud en tu API, puedes usar bibliotecas como express en Node.js. Aquí hay un ejemplo que ilustra cómo habilitar límites en los tamaños de las cabeceras de solicitud:

JavaScript

 

Diferenciación de Respuestas de Error Entre el Tamaño Total de Encabezados de Solicitud y un Solo Campo de Encabezado

Al manejar el error HTTP 431, asegúrate de diferenciar las respuestas entre dos escenarios:

  1. El tamaño total de los encabezados de solicitud es demasiado grande: Retorna una respuesta que indique que el tamaño acumulado de los encabezados es demasiado grande.
  2. El tamaño de los campos de encabezado individuales es demasiado grande: En este caso, proporciona una respuesta de error que especifique qué campo de encabezado específico excede el tamaño permitido.

Modifica el ejemplo de la sección anterior para lograr respuestas de error diferenciadas:

JavaScript

 

Ejemplo de una Respuesta HTTP 431

Recomendamos responder a tus usuarios utilizando el formato de detalles de problema en la respuesta de la API.

JSON

 

Dejar que tu Gateway Maneje Límites de Tamaño de Encabezados de Solicitud

Si usas un gateway de API, puedes agregar fácilmente una política a tu pipeline de solicitud para manejar esto. Aquí te mostramos cómo hacerlo usando Zuplo:

Navega a tu ruta en el Diseñador de Rutas y haz clic en Agregar Política en el pipeline de solicitud.

En el modal Elegir Política, tenemos dos opciones dependiendo de lo que quieras hacer.

  1. Limita el tamaño total de la solicitud con la Política de Límite de Tamaño de Solicitud.
  2. Use la Política de Entrada de Código Personalizado y copie el ejemplo de código de arriba (sin las partes express) en un módulo de typescript que se conectará a la política.

Conclusión

El error HTTP 431 a menudo es desencadenado por encabezados de solicitud demasiado grandes. Puede evitar encontrarse con este error optimizando sus encabezados, comprimiéndolos según sea necesario e implementando límites de tamaño de encabezados de solicitud en sus API.

Además, implementar verificaciones de límite de tamaño de encabezados en su API es sencillo. La mayoría de los servidores ya incluyen valores predeterminados, y también puede hacerlo usted mismo tanto a nivel acumulativo como individual de los encabezados dentro de las rutas de su API.

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