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:
--max-http-header-size=16384
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 :
const express = require("express");
const app = express();
app.get("/", (req, res) => {
const headerSizeInBytes = JSON.stringify(req.headers).length;
const maxHeaderSizeInBytes = 2000; // example limit
if (headerSizeInBytes > maxHeaderSizeInBytes) {
res.status(431).send("Request Header Fields Too Large");
} else {
res.send("Hello World!");
}
});
app.listen(3000, () => {
console.log("Server is running on port 3000");
});
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 :
- 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.
- 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 :
const express = require("express");
const app = express();
app.get("/", (req, res) => {
const headerSizeInBytes = JSON.stringify(req.headers).length;
const maxHeaderSizeInBytes = 2000; // example limit
const exceededHeaderField = Object.keys(req.headers).find(
(key) => req.headers[key].length > maxHeaderSizeInBytes * 0.1, // example individual field limit
);
if (exceededHeaderField) {
res
.status(431)
.send(
`Size of Individual Header Field '${exceededHeaderField}' Too Large`,
);
} else if (headerSizeInBytes > maxHeaderSizeInBytes) {
res.status(431).send("Total Size of Request Headers Too Large");
} else else {
res.send("Hello World!");
}
});
app.listen(3000, () => {
console.log("Server is running on port 3000");
});
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.
HTTP/1.1 431 Request Header Fields Too Large
Content-Type: application/problem+json
Content-Language: en
{
"type": "https://httpproblems.com/http-status/431",
"title": "Request Header Fields Too Large",
"detail": "Size of individual header field 'referer' too large",
"instance": "/account/12345/msgs/abc",
"trace": {
"requestId": "4d54e4ee-c003-4d75-aba9-e09a6d707b08"
}
}
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.
- Limiter la taille totale de la requête avec la Politique de Limite de Taille de Requête.
- 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