Le Hollandais Volant

L’histoire des User-Agents

Un bureau avec un ordinateur portable.
L’user-agent, c’est une donnée qu’un navigateur envoie au site qu’il visite et contenant des informations comme son nom et sa version.

Normalement, c’est censé être une information simple, dans le genre de ça :

Firefox/19.0 (Windows 7)


Dans les faits, c’est plutôt ce truc compliqué :
Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0


Oh, on retrouve toujours diverses informations, comme le nom « Firefox », sa version (19) ainsi que « Linux ». On voit aussi tout un tas d’autre informations. À quoi elles servent ? Comment c’est arrivé là ? Vous allez le voir juste après. Pour l’instant, reconnaissez seulement que l’user-agent de Firefox est assez bordélique. Rassurez-vous, il en va de même pour tous les navigateurs : IE, Chrome, Opera… Tous affichent un user-agent bordélique !

Il n’en a pourtant pas toujours été ainsi : quand on regarde l’histoire de ces user-agent (UA) et son évolution depuis le premier navigateur graphique au monde — NCSA Mozaic — il y a plus de 20 ans, on voit que les premiers navigateurs affichaient la chose simple que ça devrait être.

La raison qui fait que l’UA est devenu bordélique avec le temps est historique. Cette page, History of the browser user-agent string, écrite par Aaron Andersen explique ce qui s’est passé.
Le texte semble plutôt humoristique, et il l’est, mais on comprend tout très vite et très bien.

Je me permet une traduction libre du texte ici :

Au commencement [1992] il y avait le navigateur NCSA Mosaic.
Il affichait les images en plus du texte et tout le monde était très heureux.

Mosaic s’identifiait comme :
NCSA_Mosaic/2.0 (Windows 3.1)


Peu de temps après arriva un nouveau navigateur appelé Mozilla, raccourcissement de « Mosaic Killer ».
Mosaic n’était pas du tout amusé de cela et Mozilla a dû changer de nom pour Netscape. Ce dernier s’identifia comme
Mozilla/1.0 (Win3.1)


Puis tout le monde était à nouveau très heureux.

Mais Netscape supportait l’affichage de frames [cadres HTML], et les frames devinrent très populaire. Mosaic ne supportait pas les frames et donc naquit la pratique de la détection de l’user-agent : les sites web envoyaient les frames à Mozilla et ne les envoyaient pas aux autres.

Et Netscape se dit « moquons nous un peu de Microsoft, et faisons référence à Windows comme un “pilote pour matériel mal débuggé” »…
Microsoft était furieux, et Microsoft conçu son propre navigateur qu’ils appelèrent Internet Explorer, en espérant qu’il deviendrait un « Netscape Killer ».

Internet Explorer supportait bien les frames, mais comme il n’était pas Mozilla, les sites ne les lui donnaient pas…
Microsoft s’impatienta et ne voulu pas attendre que les webmasters mettent à jour leur site. Du coup Internet Explorer, étant en fin de compte « compatible Mozilla », se fit passer pour Mozilla et s’identifia ainsi :

Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)


Et Internet Explorer recevait bien les frames, et Microsoft était content, mais les webmasters assez confus.
Et Microsoft vendit IE avec Windows, et le rendit mieux que Netscape, et ce fut la guerre pour qui avait le meilleur navigateur. Et finalement, Netscape mourut et Microsoft était vraiment très heureux.

Mais Netscape ressuscita en tant que Mozilla ; Mozilla construit Gecko, et Mozilla s’identifia comme :
Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826


… où Gecko était le moteur de rendu des pages, et Gecko était bon !

Mozilla devint finalement Firefox et se nomma :
Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0


… et Firefox était très bon !

Et Gecko était repris par d’autres navigateurs qui se nommèrent par exemple Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.2) Gecko/20040825 Camino/0.8.1 pour l’un ou Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.8) Gecko/20071008 SeaMonkey/1.0 pour l’autre : chacun d’eux prétendaient être compatibles Mozilla et tous tournaient avec Gecko.

Gecko était bon et IE ne l’était pas et la détection de l’user-agent renaissait. Du coup, Gecko recevait le bon code et les autres navigateurs ne le recevaient pas.

Les utilisateurs de Linux étaient alors bien tristes car ils avaient construit le navigateur Konqueror, dont le moteur de rendu était KHTML, et qu’ils pensaient être aussi bon que Gecko. Mais il n’était pas Gecko et ne recevait donc pas les bonnes pages.

Konqueror déclara être « comme Gecko » puis pour avoir les bonnes pages, il s’identifia comme Gecko :
Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)


… et il y avait beaucoup de confusion…

Puis Opera [un autre navigateur] déclara « nous devrions laisser le choix à l’utilisateur concernant le navigateurs dont il doit prendre le nom ! » et Opera créa un menu de choix et il s’identifia selon le choix de l’utilisateur :
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51

Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51

Opera/9.51 (Windows NT 5.1; U; en)


C’est alors qu’Apple construit Safari, et repris KHTML en ajoutant plein de bonnes choses. Et Apple reprit finalement le projet tout entier et l’appela WebKit. Mais ils voulaient quand même les pages écrites pour KHTML et donc Safari se nommait :
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5


… et la confusion était encore plus grande…

Entre temps Microsoft avait très peur de Firefox et Internet Explorer revint et se nommait alors Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) et il affichait le bon code… mais seulement si les Webmasters le voulaient bien !

Et enfin Google construit Chrome, et Chrome utilisait WebKit, comme Safari, et il voulait les pages destinées à Safari et donc s’identifia comme Safari.

Donc… Chrome utilisait Webkit, en prétendant être Safari.
WebKit se déclara comme KHTML.
Ce dernier s’affichait être comme Gecko
… et tous les navigateurs se faisaient passer pour Mozilla.

Chrome se dénomma donc :
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13


… et l’user-agent était devenu un gros foutoir pratiquement inutile, et tout le monde prétendait être tous les autres et la confusion était à son comble…

Voilà un peu l’histoire de quelque chose de simple devenant un véritable bordel impossible à gérer. Tout ça parce que d’un côté les navigateurs ne sont pas tous égaux en fonctionnalités non standards, et de l’autre parce que les webmaster voulaient utiliser des choses proposées par un navigateur en particulier et pas les autres…

Moi ça me fait rire, parce que c’est assez marrant mais aussi parce que c’est quand même assez vrai : certaines choses deviennent de plus en plus compliqués à cause de patchs et de reprises dans tous les sens.

Malheureusement ceci pose beaucoup de problèmes : les sites qui ont encore des systèmes de détection du navigateur sont nombreux et continuent d’être créés. C’est mal : cette détection peut souvent être foireuse et elle oblige le webmaster à construire plusieurs version de son site, alors qu’une seule version pourrait suffire si le webmaster savait coder proprement et que les standards étaient respectés (et à jour, et ouverts).

Oh, et histoire de poursuivre cette histoire (qui s’arrête grosso-modo après la naissance de Chrome en 2009) : Opera Mobile, qui utilise le moteur Presto d’Opera, se mettra à utiliser WebKit dès 2013. La version beta est déjà sortie sur Android. Voici son user-agent, juste pour rire :

Mozilla/5.0 (Linux; Android 2.3.6; YP-G1 Build/GINGERBREAD) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.123 Mobile Safari/537.22 OPR/14.0.1025.52315


C’est joyeux, tout ce monde…


Pour ma part, je m’étais mis en tête de créer un outil de détection de navigateurs. Je ne pensais pas que c’était aussi le bordel et je suis tombé sur un certain nombre de pépins. Mais j’ai finalement réussi. L’outil est disponible là : Trouver les informations de votre navigateur.
Je suis assez ravi de voir qu’il fonctionne plutôt bien : j’avoue d’ailleurs avoir utilisé cet historique pour déchiffrer les UA. Mon analyse commence par voir si il y a « Mozilla », puis essaye de voir s’il y a « KHTML », puis « Webkit », etc.
Ce n’est donc pas comme si la culture apportée par l’histoire des user-agent ne serait à rien : au contraire, elle est très utile ici !


MAJ du 27/03/13 : et ça continue : IE 11 pourra s’identifier comme Firefox avec un « like Gecko » ajouté à son user-agent. C’est magnifique :').


image d’en-tête de Agnieszka Boeske