Aussi disponible en : English · Español · Português · العربية
Referrer-Policy : toutes les valeurs comparées, et la règle que personne ne cite
Déterminez quelle politique s’applique, ce qu’une requête donnée mettrait réellement dans l’en-tête Referer, et pourquoi envoyer deux valeurs est une technique documentée.
À quoi sert l’en-tête Referrer-Policy
Quand un navigateur suit un lien ou récupère une ressource, il indique en général à la destination d’où venait la requête, dans un en-tête nommé Referer. Referrer-Policy est le moyen pour un site de contrôler ce qu’il en cède : l’URL entière avec son chemin et sa requête, l’origine seule, ou rien. Il existe huit valeurs, et la spécification définit chacune face à trois situations : une requête vers la même origine, une vers une autre origine, et une qui quitte une page sécurisée pour une destination qui ne l’est pas.
Sans en-tête, c’est strict-origin-when-cross-origin qui s’applique. Cela envoie l’URL complète à l’intérieur de votre propre site, l’origine seule dès qu’on en sort, et rien du tout lorsque la destination retombe en HTTP simple. C’est un défaut raisonnable, et il vaut la peine de le connaître : un en-tête que le navigateur ne sait pas lire vous laisse exactement avec cela, et rien d’autre.
Un détail que la spécification relève elle-même à propos de son propre nom : l’en-tête ne reprend pas la faute d’orthographe célèbre. L’en-tête de requête s’écrit Referer, avec un seul r, une coquille assez ancienne pour être devenue définitive. L’en-tête de réponse qui le pilote s’écrit Referrer-Policy, correctement. Les intervertir est une façon courante d’écrire un en-tête qui, silencieusement, ne fait rien.
Comment s’en servir
- Collez votre en-tête. Un par ligne si vous en envoyez plusieurs : un navigateur lit plusieurs en-têtes Referrer-Policy comme une seule liste séparée par des virgules. Le panneau ci-dessous montre chaque valeur et indique celle qu’il retiendra réellement.
- Renseignez les deux URL. La page qui fait le lien et la destination. Les deux ont besoin d’un schéma, car c’est lui qui décide si la requête est de même origine, d’une autre origine, ou un déclassement — les trois seules distinctions que fait la moindre de ces politiques.
- Lisez la ligne Referer. Elle affiche l’en-tête exact que porterait la requête, ou indique qu’aucun n’est envoyé. Le tableau final aligne les huit politiques, celle en vigueur étant surlignée.
Pourquoi la dernière valeur l’emporte, et à quoi cela sert
C’est la partie qui piège tout le monde, et elle est écrite noir sur blanc. La spécification indique que les valeurs de politique inconnues sont ignorées, et que lorsque plusieurs sources en spécifient une, c’est la valeur de la dernière qui est retenue. Pas la première. L’algorithme d’analyse tient en trois étapes : partir de rien, puis, pour chaque token de l’en-tête, s’il s’agit d’une politique reconnue, affecter la politique à cette valeur. Ce que vous avez reconnu en dernier est ce qui reste.
Cela inverse l’instinct habituel. Une valeur d’en-tête qui ressemble à une liste signifie d’ordinaire des solutions de repli par ordre de préférence, et la façon naturelle d’écrire un analyseur est de retenir la première chose comprise puis de s’arrêter. Ici il faut continuer, et un analyseur qui s’arrête trop tôt donne la mauvaise réponse sur l’exemple même de la spécification.
La raison tient au déploiement. La spécification traite le cas elle-même : envoyez origin suivi d’unsafe-url et un navigateur trop ancien pour connaître unsafe-url l’ignore et applique origin, tandis qu’un navigateur actuel va jusqu’au bout et applique unsafe-url. Referrer-Policy: origin, unsafe-url n’est donc ni une coquille ni une ligne en double : c’est la manière documentée d’adopter une valeur récente sans abandonner les clients anciens. La grammaire est faite pour cela : la spécification autorise un token inconnu précisément pour qu’un navigateur n’échoue pas à analyser l’en-tête entier lorsqu’il en rencontre un.
La même règle a un tranchant plus désagréable. Si rien dans votre en-tête n’est reconnu — une coquille, une valeur tirée d’un billet de blog qui n’a jamais existé, un nom de politique avec un tiret bas — le navigateur se retrouve avec la chaîne vide et se rabat sur son défaut. L’en-tête n’a rien fait, et rien dans la réponse ne vous le dit. C’est ce que le panneau ci-dessus signale en premier.
Ce que chaque politique envoie réellement
Le tableau huit par trois de cette page est transcrit de la phrase de la spécification qui définit chaque politique, plutôt qu’assemblé de mémoire ou repris des tableaux des autres. Deux lignes méritent une seconde lecture, car ce sont celles qu’on confond le plus.
origin et strict-origin se ressemblent énormément — toutes deux n’envoient que l’origine — et ne diffèrent que sur une case. origin l’envoie partout, y compris vers du HTTP simple ; strict-origin s’abstient lors de ce déclassement. La spécification en donne explicitement la raison : elle note qu’origin laisse l’origine de référents HTTPS circuler sur le réseau au sein de requêtes HTTP non chiffrées, et que strict-origin répond à cette préoccupation. Le même couple se répète un cran plus haut : origin-when-cross-origin et strict-origin-when-cross-origin ne diffèrent que dans la colonne du déclassement.
Un cas surprend aussi ceux qui voient les origines comme une affaire de noms de domaine. Une origine comprend le schéma : passer de http à https sur le même hôte est donc une requête vers une autre origine, et non la même — la spécification mentionne explicitement les passages à un protocole supérieur. Un port différent produit le même effet. Si une politique se comporte bizarrement sur une requête qui ne quitte pas votre domaine, c’est généralement de là que cela vient.
Quant à unsafe-url, le nom dit vrai. La spécification ajoute une note qui tient presque de l’excuse : le nom de la politique ne ment pas, elle est dangereuse, et elle divulguera origines et chemins de ressources sécurisées vers des origines qui ne le sont pas. Son exemple emploie un document appelé sekrit.html, et ce n’est pas un hasard.
Ce que ceci ne vous dira pas
Ceci établit ce que signifie une politique. Il ignore ce que votre serveur envoie. Un navigateur ne peut pas lire à votre place les en-têtes de réponse d’un autre site : l’en-tête dans la zone est celui que vous avez tapé, pas celui de la production — vérifiez-le dans le panneau réseau de votre navigateur ou par une requête en ligne de commande.
Classer une destination comme sécurisée ou non est une simplification, et il faut le dire. La spécification renvoie à une autre norme pour ce qui compte comme URL potentiellement digne de confiance, et cet algorithme couvre plus de terrain que cette page n’en implémente : https, wss et file, plus localhost et les adresses de bouclage, sont ici tenus pour dignes de confiance, et tout le reste ne l’est pas. Cela couvre tous les exemples de la spécification et tout ce que vous taperez en pratique, mais un schéma qu’un navigateur ou une application empaquetée enregistre comme digne de confiance sera mal jugé.
La politique d’une page n’est pas non plus la seule chose en jeu. Un lien isolé peut la contourner avec un attribut referrerpolicy, rel=noreferrer supprime entièrement le référent, une iframe peut définir la sienne, et une redirection peut changer la politique en cours de requête. Cette page répond à la question pour une politique et un couple d’URL, ce dont traite l’en-tête ; le reste relève de décisions par élément prises dans votre balisage.
Enfin, rien de tout cela n’est une garantie de confidentialité. Supprimer l’en-tête Referer coupe une fuite précise ; cela ne fait rien contre une URL que vous avez passée dans une chaîne de requête, contre un script qui communique lui-même l’emplacement, ni contre ce que la destination peut déduire de la requête autrement. C’est un levier utile, pas un rideau.
Pourquoi est-ce gratuit ?
Lire un en-tête et comparer deux URL relève du traitement de texte et s’exécute dans votre navigateur. Aucun serveur n’intervient : rien à facturer, aucun compte à créer.
Rien n’est envoyé et rien n’est conservé. Rechargez la page et elle aura oublié les URL que vous aviez saisies.