Aussi disponible en : English · Español · Português · العربية
Liste des en-têtes HTTP
Les 257 champs enregistrés, chacun avec le statut que lui donne le registre et avec la seule chose que le registre ne consigne pas : si le navigateur laisse un script le définir.
Qu’est-ce que la liste des en-têtes HTTP ?
Chaque requête et chaque réponse HTTP transportent des champs d’en-tête — Content-Type, Cache-Control, Authorization et les autres — et savoir quels noms existent vraiment n’est pas affaire d’opinion. L’IANA tient le registre des noms de champ HTTP, et cette page est ce registre : 257 champs, chacun avec le statut que l’IANA lui a donné et la spécification dont il vient.
Presque toutes les listes publiées d’en-têtes HTTP sont rangées en en-têtes de requête et en-têtes de réponse. Il vaut la peine de savoir que le registre n’a pas cette colonne. Ses cinq champs sont le nom, le statut, le type structuré, la référence et un commentaire libre — rien sur le sens de circulation. Et beaucoup de champs voyagent dans les deux sens, si bien que la séparation qu’on voit ailleurs est le jugement d’un rédacteur présenté comme un fait.
Ce que le registre consigne bel et bien, c’est le statut, et il y fait une distinction que les tableaux recopiés écrasent. 187 champs sont permanents, 23 provisoires et encore instables, 8 déconseillés et 39 remplacés — conservés pour qu’on puisse lire du trafic ancien, non pour que le nouveau s’en serve. Près d’un cinquième du registre est quelque chose que vous ne devriez pas envoyer.
Comment s’en servir
- Cherchez par nom, par référence ou par commentaire. Une seule case couvre les trois, et les résultats sont classés plutôt que simplement filtrés : le nom exact arrive en tête même lorsqu’il serait alphabétiquement dernier, si bien que chercher range donne Range et non Accept-Ranges.
- Lisez l’étiquette à côté de chaque nom. Elle dit si le navigateur laisse un script poser cet en-tête sur une requête, et ceux qu’il refuse portent la mention de la règle qui les refuse.
- Regardez le titre de statut au-dessus du groupe. Les champs sont regroupés selon ce que l’IANA en dit : un nom déconseillé ou remplacé ne se retrouve donc jamais discrètement à côté d’un nom courant.
La colonne manquante, et celle qui répond vraiment
La question avec laquelle on arrive n’est pas de savoir si un en-tête est de requête ou de réponse. C’est pourquoi le définir depuis JavaScript ne fait rien, et sans le moindre avertissement. Cette réponse est dans une autre spécification : la norme Fetch définit ce qu’elle appelle un en-tête de requête interdit, et le navigateur écarte toute tentative de le poser afin de garder la main sur ce qu’il envoie.
Ce n’est pas une liste. Ce sont 21 noms — Cookie, Host, Origin, Referer, Connection et compagnie — plus deux préfixes : proxy- et sec-. La moitié des préfixes est la plus intéressante, car elle est sans borne. Aucun en-tête dont le nom commence par Sec- ne pourra jamais être posé par le code de la page, y compris ceux que personne n’a encore inventés, et la norme dit pourquoi : l’espace de noms est réservé pour qu’on puisse frapper des en-têtes à l’abri des API qui laissent les développeurs fixer des en-têtes. C’est exactement ce qui donne sa valeur à un en-tête comme Sec-Fetch-Site : une page ne peut pas le falsifier.
Sur les 257 champs enregistrés, 218 sont de ceux qu’un script peut poser, 20 sont refusés par leur nom et 19 par leur préfixe. Un nom de la liste des interdits ne figure même pas au registre : DNT. Le navigateur refuse qu’un script pose un en-tête que l’IANA n’a jamais contenu.
Il existe aussi une règle plus modeste dans l’autre sens. Un script ne peut jamais lire Set-Cookie ni Set-Cookie2 sur une réponse, quels que soient les en-têtes CORS — c’est pourquoi un cookie posé par une API d’une autre origine reste invisible au code qui l’a appelée.
Limites honnêtes, et trois choses à savoir
Ceci est un instantané. Le registre gagne des entrées, et la date à laquelle il a été relevé est imprimée sous la liste plutôt que laissée à votre imagination. Un tableau qui ne dit pas quand il a été pris prétend silencieusement rester à jour pour toujours.
Le registre écrit par ailleurs quatre de ses propres statuts avec une majuscule, et ces quatre-là sont des champs Sec-Fetch-. Un filtre à correspondance exacte sur permanent renvoie 183 au lieu de 187 et laisse tomber précisément les en-têtes de sécurité modernes du fetch metadata. C’est un vrai piège pour qui lit le CSV lui-même, et c’est pourquoi cette page normalise l’orthographe.
Deux entrées ne sont pas des en-têtes. Close et un astérisque tout seul sont enregistrés avec le commentaire reserved, c’est-à-dire enregistrés pour que personne ne les enregistre. Leur statut est permanent : le statut seul ne vous dira donc pas qu’ils sont inutilisables — et oui, un astérisque est bel et bien un nom de champ HTTP enregistré.
Certains noms attendus sont absents. X-Forwarded-For, X-Requested-With, X-Powered-By et X-XSS-Protection s’emploient partout et ne sont enregistrés nulle part ; le parent enregistré du premier est Forwarded. Le registre compte exactement deux champs X-, dont X-Frame-Options — inscrit comme permanent et non comme remplacé, ce qui contredit la croyance répandue que frame-ancestors de CSP l’aurait mis à la retraite.
Un dernier avertissement sur l’étiquette de la liste CORS. Un en-tête de cette liste n’évite le préliminaire que pour certaines valeurs : Content-Type y a droit pour trois types de médias, si bien que application/json déclenche un préliminaire là où text/plain n’en déclenche pas, et toute valeur de la liste est plafonnée à 128 octets. L’appartenance à la liste est une propriété du nom et de la valeur ensemble : prenez donc cette étiquette pour un indice, non pour un verdict.
Pourquoi est-ce gratuit ?
Parce que cela ne coûte rien à faire tourner. La liste fait partie de la page, la recherche se passe dans votre navigateur, et rien n’est envoyé ni journalisé.
Les données viennent du fichier lisible par machine de l’IANA elle-même et non d’une autre liste, les règles concernant les scripts viennent de la norme Fetch, et le script qui lit les deux est conservé à côté des données qu’il produit, pour que les chiffres de cette page puissent être reproduits.