Questions sur le user agent
Pourquoi tous les navigateurs disent Mozilla, ce que signifie Edg, et pourquoi votre iPad prétend être un Mac.
Quel est mon user agent ?+
C'est la ligne que votre navigateur place dans l'en-tête User-Agent de chaque requête qu'il envoie, pour se décrire auprès du serveur. Appuyez sur le bouton de l'espace de travail ci-dessus et cette page la lit dans navigator.userAgent, puis la décompose. Rien n'est importé pour cela ; la lecture se fait dans l'onglet. Un user agent typique ressemble à Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36, et de ces six éléments, seuls deux, le commentaire de plateforme et la version de Chrome, disent quelque chose de vrai. Le reste est un sédiment de compatibilité qu'aucun navigateur n'ose retirer.
Pourquoi tous les navigateurs disent-ils encore Mozilla/5.0 ?+
À cause d'une décision prise en 1994 et de trente ans pendant lesquels personne n'a pu revenir dessus. Le nom de code interne de Netscape était Mozilla, et il envoyait Mozilla/2.0 comme identité. Les serveurs se sont mis à le vérifier avant de servir des frames, que Netscape prenait en charge et pas la concurrence. Quand Internet Explorer 2 a obtenu les frames, il ne recevait pas la bonne page, alors il a envoyé Mozilla/2.0 (compatible; MSIE 2.0) et a été servi correctement. Depuis, chaque navigateur a copié le leader du moment : Safari a ajouté Mozilla et KHTML, Chrome a ajouté Mozilla et Safari, Edge a ajouté Mozilla, Chrome et Safari. Le préfixe signifie désormais seulement que l'expéditeur est un navigateur web, et le 5.0 n'a pas bougé depuis 1998. Quiconque le supprime tombe sur un serveur, quelque part, qui lui sert une page de 1999.
Pourquoi Chrome prétend-il être Safari ?+
Pour la même raison qu'Internet Explorer prétendait être Netscape. À son lancement en 2008, Chrome utilisait WebKit, le moteur de Safari, et une grande partie du code de détection côté serveur avait été écrite comme si WebKit voulait dire Safari. Envoyer les tokens AppleWebKit et Safari donnait à Chrome les mêmes pages que Safari, alors il les a envoyés. En 2013, Chromium a créé Blink à partir d'un fork de WebKit, et a continué d'envoyer les deux tokens malgré tout, car à ce stade les retirer aurait cassé des sites. AppleWebKit/537.36 est donc un numéro de build datant du fork, et aucune version de Chrome depuis plus de dix ans n'a contenu ce code, tandis que Safari/537.36 ne correspond à aucun Safari ayant jamais existé. La conséquence pratique est qu'un analyseur doit tester Chrome avant Safari, sinon chaque utilisateur de Chrome est compté comme un utilisateur de Safari.
Que signifie Edg, et pourquoi pas Edge ?+
Edg désigne Microsoft Edge basé sur Chromium, c'est-à-dire tous les Edge depuis 2020. Il s'écrit en trois lettres exprès. L'ancien Edge envoyait Edge/18.19041, et beaucoup de code de détection de fonctionnalités avait été écrit pour repérer la chaîne Edge et la traiter comme le navigateur EdgeHTML, avec ses propres bugs. Livrer un navigateur Chromium qui correspondait à ces tests lui aurait imposé des contournements EdgeHTML dont il n'avait pas besoin, alors Microsoft a choisi un token que rien ne repérait encore. Edge sur Android est EdgA et Edge sur iOS est EdgiOS, une lacune fréquente des analyseurs écrits à la main. Dans les trois cas, le token se trouve après un token Chrome complet, donc un analyseur qui lit de gauche à droite et s'arrête au premier navigateur qu'il reconnaît signale Edge comme Chrome.
Pourquoi mon iPad dit-il Macintosh ?+
Parce qu'Apple a décidé avec iPadOS 13 qu'un iPad devait recevoir les sites de bureau par défaut, et le moyen d'y parvenir était d'envoyer la chaîne de bureau. Safari sur iPad envoie désormais Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) sans aucun token iPad, identique octet pour octet à Safari sur Mac. Il est impossible de les distinguer à partir de la chaîne, et c'est voulu. Si vous devez le savoir, l'indice se trouve dans la page plutôt que dans l'en-tête : navigator.maxTouchPoints renvoie un nombre supérieur à zéro sur un iPad qui se fait passer pour un Mac, et zéro sur presque tous les vrais Mac. Le token iPad ne réapparaît que lorsque l'utilisateur a choisi Demander le site mobile pour ce site.
Peut-on se fier à ce que dit un user agent ?+
Non, et ce n'est pas une réserve : c'est la propriété qui définit le format. La chaîne est choisie par le client. La modifier prend un champ dans le panneau des conditions réseau des outils de développement de n'importe quel navigateur, une option -A dans curl ou une ligne dans n'importe quelle bibliothèque HTTP. Rien ne la signe, rien ne la vérifie et rien dans l'en-tête ne voyage avec la moindre garantie. Elle convient pour les statistiques d'audience, où une petite part d'absurdités ne change pas l'allure des données, et pour choisir un lien de téléchargement, où le pire résultat est le mauvais installateur. Elle n'est jamais acceptable comme contrôle d'accès, vérification de licence, protection contre les bots ou toute autre décision de sécurité. Si vous devez savoir qu'une requête vient vraiment de Googlebot, Google publie des plages DNS inverses et une liste JSON de ses adresses précisément pour cela, et les vérifier est la seule façon honnête de traiter cette revendication.
Que sont les User-Agent Client Hints ?+
Ils remplacent tout le format. Au lieu d'une seule chaîne qui transporte tout, que le site le veuille ou non, le navigateur envoie trois champs à faible entropie avec chaque requête (la liste des marques, s'il s'agit d'un mobile et le nom de la plateforme) et garde tout le reste jusqu'à ce qu'un site le demande nommément via l'en-tête de réponse Accept-CH ou via navigator.userAgentData.getHighEntropyValues en JavaScript. Les valeurs à haute entropie sont les plus utiles : la version complète du navigateur, la version de la plateforme, l'architecture, le nombre de bits et le modèle de l'appareil. Deux détails méritent d'être connus. La liste des marques contient délibérément une marque inventée dont le nom change à chaque version, pour que le code doive analyser la liste correctement au lieu de chercher un seul nom codé en dur, ce qui est précisément l'erreur qui a rendu l'ancienne chaîne impossible à corriger. Et la prise en charge n'est pas universelle : les navigateurs Chromium l'implémentent, tandis que Safari et Firefox ont tous deux refusé, ce qui explique pourquoi l'ancienne chaîne est toujours ce que tous les navigateurs envoient.
Qu'est-ce que la réduction du user agent, et qu'a-t-elle déjà supprimé ?+
C'est le programme progressif de Google, en grande partie achevé depuis Chrome 110 en 2023, qui fige les parties de la chaîne qui en faisaient une surface d'empreinte numérique. Chrome indique désormais ses numéros mineur, de build et de correctif sous la forme 0.0.0, si bien que la version complète se lit 131.0.0.0 et que seul le numéro majeur est réel. Sur ordinateur, la version de la plateforme est fixée à une valeur constante. Sur Android, chaque appareil indique Android 10 et un modèle K, quel qu'il soit réellement. Apple y est arrivé plus tôt et par une autre voie : macOS indique 10.15.7 depuis Big Sur, parce que beaucoup de code de détection comparait la version numériquement et cassait sur 11, et le mot Intel est toujours envoyé sur Apple Silicon. Résultat : la chaîne est désormais un signal bien plus faible que ne le suppose généralement le code qui la lit, et tout ce qui a besoin des vraies valeurs doit les demander via les Client Hints.
Comment modifier ou usurper mon user agent ?+
Dans Chrome et Edge, ouvrez les outils de développement, utilisez le menu à trois points pour afficher Plus d'outils puis Conditions du réseau, décochez Utiliser la valeur par défaut du navigateur, et choisissez ou saisissez une chaîne. Firefox expose general.useragent.override dans about:config. Safari dispose d'un menu Développement avec un sous-menu Agent utilisateur. En ligne de commande, c'est curl -A pour curl et --user-agent pour wget, et chaque bibliothèque HTTP propose une option équivalente en une ligne. Les usages légitimes sont réels : vérifier que votre propre site sert ce qu'il faut à un vieux navigateur, reproduire un bug qu'un client particulier est seul à voir, et vérifier ce que reçoit un robot d'exploration. Ce qui compte, c'est l'inverse. Puisque le modifier est aussi simple pour vous, c'est tout aussi simple pour tout le monde, donc aucun contrôle écrit côté serveur ne peut supposer que la chaîne est honnête. Usurper un user agent pour contourner un paywall ou une limite de débit relève des conditions d'utilisation plutôt que de la technique, et cela échoue généralement de toute façon, car les systèmes sérieux ont cessé de faire confiance à cet en-tête depuis des années.
Chrome sur mon iPhone s'affiche comme CriOS. Est-ce vraiment Chrome ?+
C'est vraiment l'interface de Chrome, sa synchronisation et sa barre d'adresse, mais ce n'est pas le moteur de Chrome. Apple impose à tous les navigateurs sur iOS et iPadOS d'utiliser le WebKit du système pour le rendu, donc Chrome pour iOS, Firefox pour iOS, Edge pour iOS et Opera pour iOS sont tous Safari en dessous, avec des habillages différents par-dessus. Les tokens sont respectivement CriOS, FxiOS, EdgiOS et OPiOS, et chacun se trouve dans une chaîne qui contient aussi AppleWebKit et un numéro de build Safari, authentiques dans ce cas plutôt que décoratifs. La conséquence pratique pour les tests est la partie utile : un bug de rendu signalé dans Chrome sur iPhone est un bug WebKit, il se reproduira dans Safari sur le même appareil, et il ne se reproduira dans Chrome sur aucune autre plateforme. Le règlement sur les marchés numériques de l'Union européenne a commencé à assouplir cette règle, mais en dehors de ce contexte, elle tient toujours.