Comprendre l’erreur HTTP 431 : Guide pour développeurs

Le code d’état HTTP 431, également connu sous le nom de « Champs d’en-tête de la requête trop volumineux », est une erreur côté client qui indique que le serveur refuse de traiter une requête car ses champs d’en-tête sont trop grands. Cette erreur peut être causée soit par la taille totale des en-têtes, soit par un seul champ d’en-tête dépassant la taille autorisée.

Le code d’état HTTP 431 a été introduit pour la première fois dans RFC 6585, publiée en avril 2012. Cela faisait partie d’un effort pour standardiser des réponses supplémentaires pour HTTP/1.1, traitant des problèmes qui n’étaient pas couverts par les codes d’état existants à l’époque. Introduire ce code d’erreur spécifique était crucial pour améliorer la sécurité du serveur et prévenir les attaques malveillantes comme les attaques de débordement de tampon, qui pourraient exploiter de grands en-têtes.

Comprendre l’erreur HTTP 431

Lorsqu’une erreur 431 se produit, cela signifie que le serveur a bloqué la requête du client en raison de champs d’en-tête excessivement volumineux. Chaque serveur a ses propres politiques concernant la taille maximale autorisée pour les champs d’en-tête HTTP, ce qui aide à se protéger contre les attaques par déni de service.

Symptômes courants des erreurs HTTP 431

  • La taille totale des en-têtes de la requête est trop grande : Cette erreur se produit lorsque la taille cumulative de tous les en-têtes de la requête dépasse la limite.
  • La taille des champs d’en-tête individuels est trop grande : Dans ce cas, un seul champ d’en-tête est trop volumineux pour être traité, entraînant l’erreur 431.

Causes fréquentes des erreurs HTTP 431

  • Trop de cookies : Avoir des cookies excessivement grands ou nombreux peut provoquer l’erreur 431. Cela peut se produire si les mêmes cookies sont définis plusieurs fois ou si plusieurs cookies sont combinés dans une seule requête ou réponse. Un scénario courant est la réutilisation du même port localhost across multiple projects and sending all of those projects’ cookies along with a request.
  • Mauvais cache des champs d’en-tête : Le cache incorrect de grands en-têtes peut conduire à l’erreur 431. Un cache inapproprié peut augmenter la taille de l’en-tête, provoquant un débordement de tampon.
  • En-têtes de requête inutiles ou mal formatés : Une utilisation excessive des en-têtes HTTP peut entraîner des requêtes qui dépassent les limites de taille définies par le serveur, conduisant à une réponse 431. De plus, assurez-vous que vos en-têtes sont correctement formatés. Avoir une URL Referer trop longue peut déclencher une 431.

Comment éviter l’erreur 431

Effacer les cookies

Effacez régulièrement les cookies du côté client (Outil dev Chrome > Application > Cookies) et limitez le nombre de cookies utilisés sur le serveur.

Cache des en-têtes

Implémentez correctement le cache des en-têtes pour garantir que les en-têtes mis en cache reflètent la demande réelle et la réponse compressée. Ajustez les ETags si vous dépendez fortement d’eux pour les requêtes conditionnelles, car des ETags volumineux peuvent contribuer à l’erreur.

Minimisez les en-têtes HTTP

Simplifiez vos en-têtes HTTP pour inclure uniquement les informations nécessaires. Évitez d’inclure des métadonnées redondantes, en particulier dans les en-têtes comme Authorization, Referer et User-Agent.

Compression de la taille des en-têtes

Parfois, vous n’envoyez pas suffisamment d’en-têtes et vos en-têtes sont gonflés en raison de contraintes hors de votre contrôle (par exemple, votre jeton JWT encode une tonne d’informations). La compression des en-têtes peut réduire considérablement la taille de vos en-têtes de requête. Utilisez des protocoles comme HTTP/2 et HTTP/3, qui prennent en charge la compression des en-têtes par défaut. Cela peut automatiquement réduire la taille de vos en-têtes sans nécessiter de configuration supplémentaire.

Gérer les limites de taille maximale des en-têtes du serveur

La spécification HTTP ne définit pas de limite sur la taille des en-têtes ; cependant, de nombreux serveurs en ont. Voici les limites pour divers serveurs/web hôtes populaires :

  • Apache : 8K
  • nginx : 4K-8K
  • IIS : 8K-16K
  • Tomcat : 8K-48K
  • Node : (<13) – 8K ; (>13) – 16K
  • Cloudflare : 16K par en-tête, 32K au total

La plupart des serveurs permettent une certaine forme de configuration, et les différentes versions du logiciel serveur peuvent avoir des limites plus basses ou plus élevées. Vous devriez également consulter la documentation la plus récente pour voir si ces limites incluent d’autres parties de la requête (par exemple, les cookies) ou simplement les en-têtes réguliers.

Augmentation de la limite de taille de l’en-tête de requête

Parfois, il peut être nécessaire d’augmenter la limite de taille de l’en-tête de requête. Vous pouvez généralement le faire depuis la console web ou en ligne de commande pour votre serveur. Si vous développez en local, il existe généralement des paramètres CLI qui peuvent configurer cette valeur. Voici le paramètre pour configurer les limites de taille de l’en-tête de requête dans Node JS:

Shell

 

Remarque : Augmenter la limite de taille de l’en-tête doit être fait avec prudence, car des en-têtes plus volumineux peuvent consommer plus de mémoire et dégrader les performances.

Comment Envoyer des Réponses d’Erreur HTTP 431

Vous ne voulez peut-être pas vous fier à votre serveur pour déterminer la limite de taille de l’en-tête de votre requête, ou peut-être souhaitez-vous imposer une limite de taille d’en-tête personnalisée par point de terminaison API. Suivez les étapes ci-dessous pour apprendre comment envoyer vos propres erreurs 431.

Intégrer des Limites de Taille d’En-tête de Requête Dans Votre API

Comme mentionné précédemment, votre combinaison hôte + serveur imposera probablement automatiquement une limite. Pour intégrer votre propre capacité de limite de taille d’en-tête de requête personnalisée dans votre API, vous pouvez utiliser des bibliothèques comme express en Node.js. Voici un exemple illustrant comment activer des limites sur les tailles d’en-tête de requête :

JavaScript

 

Différencier les Réponses d’Erreur Entre la Taille Totale des En-têtes de Requête et un Champ d’En-tête Unique

Lors de la gestion de l’erreur HTTP 431, assurez-vous de différencier les réponses entre deux scénarios :

  1. La taille totale des en-têtes de requête est trop grande : Renvoyez une réponse indiquant que la taille cumulative des en-têtes est trop importante.
  2. La taille des champs d’en-tête individuels est trop grande : Dans ce cas, fournissez une réponse d’erreur précisant quel champ d’en-tête dépasse la taille autorisée.

Modifiez l’exemple de la section précédente pour obtenir des réponses d’erreur différenciées :

JavaScript

 

Exemple de Réponse HTTP 431

Nous recommandons de répondre à vos utilisateurs en utilisant le format de détail des problèmes pour les réponses API.

JSON

 

Laisser Votre Passerelle Gérer les Limites de Taille des En-têtes de Requête

Si vous utilisez une passerelle API, vous pouvez facilement ajouter une politique à votre pipeline de requête pour gérer cela. Voici comment faire avec Zuplo :

Naviguez vers votre route dans le Concepteur de Routes et cliquez sur Ajouter une Politique dans le pipeline de requête.

Dans le modal Choisir une Politique, nous avons deux options selon ce que vous souhaitez faire.

  1. Limiter la taille totale de la requête avec la Politique de Limite de Taille de Requête.
  2. Utilisez la Politique d’Entrée de Code Personnalisé et copiez l’exemple de code ci-dessus (sans les parties express) dans un module TypeScript qui sera connecté à la politique.

Conclusion

L’erreur HTTP 431 est souvent déclenchée par des en-têtes de requête trop volumineux. Vous pouvez éviter de rencontrer cette erreur en optimisant vos en-têtes, en les compressant si nécessaire, et en mettant en œuvre des limites de taille des en-têtes de requête dans vos API.

De plus, la mise en œuvre de vérifications de la taille des en-têtes dans votre API est simple. La plupart des serveurs incluent déjà des valeurs par défaut, et vous pouvez également le faire vous-même à la fois au niveau cumulatif et individuel des en-têtes depuis vos routes API.

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