A história do user-agent string

A história do user-agent string

No início da história da web, era uma prática comum se fazer uma detecção do navegador usado, através da user-agent string, para enviar um código otimizado aos browsers mais modernos. Mas cada novo navegador que surgia também desejava esse código, e então começaram a se disfarçar de navegadores tidos como modernos na época, em efeito cascata. E assim começa o baile de máscaras.

Mosaic

Mosaic 1.0 para Windows

O primeiro browser, o NCSA Mosaic, se identificava por um user-agent string bem simples. Informando apenas seu nome seguido de sua versão e o sistema operacional em que estava rodando.

// Mosaic 0.9 user-agent string
NCSA_Mosaic/2.0 (Windows 3.1)

No exemplo acima, apenas pela user-agent string podemos saber que o navegador do usuário é o Mosaic, em sua versão 2.0 rodando no sistema operacional Windows 3.1. Até então não existia a mentira.

Netscape

Netscape

Logo depois a Netscape Communications iniciou o desenvolvimento de seu browser, o Mozilla. Seu nome é uma abreviação de Mosaic Killer. Houveram alguns problemas com o Mosaic devido ao nome, então o projeto Mozilla foi renomeado para Netscape e se identificava como Mozilla/1.0 (Win3.1).

O nome Mozilla é uma abreviação de Mosaic Killer

A Netscape usou um user-agent string similar ao do Mosaic, mas adicionou algumas informações como língua, plataforma e encriptação.

// Netscape 3.0 user-agent string
Mozilla/3.0 (Win95; U)

O exemplo acima é de um navegador Netscape rodando em sua versão 3.0 rodando no Windows 95 com uma encriptação de 128-bits (o último “U” na string).

O Netscape foi o primeiro a suportar frames, e esta tecnologia se tornou bastante popular. O Mosaic não suportava frames e, então, deu-se início ao “user agent sniffing”, a detecção do navegador do usuário no back-end. Para o Netscape eram enviados frames, e para o Mosaic não.

Internet Explorer

Internet Explorer 2.0

Logo depois surgiu o Internet Explorer. Ele suportava frames, mas não era o Netscape. A Microsoft queria matar o Netscape o mais rápido possível e não iria esperar que os webmasters (lembram dessa palavra?) detectassem o IE de forma correta e enviassem frames para ele. Então ela declarou que o IE era compatível com o Mozilla (Mozilla Compatible) e começou a se disfarçar de Netscape, recebendo assim frames.

// Internet Explorer 2.0 user-agent string
Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)

Gecko

Firefox 2.0

A Microsoft então começou a incluir o IE junto com o Windows, matando eventualmente o Netscape. O Netscape renasceu como Mozilla (o navegador). O Mozilla construiu o Gecko, seu motor de renderização open source. E para ele foi feito uma especificação de como o user-agent string deveria ser escrito a partir de agora, a tornando ainda mais complexa.

// Padrão de user-agent string do Gecko
Mozilla/MozillaVersion (Platform; Encryption; OS-or-CPU; Language; PrereleaseVersion)Gecko/GeckoVersion ApplicationProduct/ApplicationProductVersion

O Mozilla então se tornou o Firefox, e vários outros navegadores começaram a usar o Gecko como render engine. Abaixo temos exemplos de user-agent strings de navegadores baseados no Gecko. A versão do Mozilla nunca foi alterada da versão 5.0 desde o primeiro browser baseado no Gecko. E provavelmente nunca irá.

// SeaMonkey 1.1a no Linux
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1b2) Gecko/20060823 SeaMonkey/1.1a

// Firefox 2.0.0.11 no Windows XP
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11

// Camino 1.5.1 no Mac OS X
Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.6) Gecko/20070809 Camino/1.5.1

Konqueror

Konqueror 3.5

No mundo Linux a equipe do KDE estava trabalhando no Konqueror. Seu nome é uma referência ao Netscape e IE, os dois grandes browsers da história até o momento. “First comes the Navigator, then Explorer, and then the Konqueror”.

First comes the Navigator, then Explorer, and then the Konqueror

Sua engine, a KHTML, era excelente. Mas não era o Gecko e por isso não recebia o código mais moderno. Então ele, também, começou a se apresentar como “Gecko like”.

// Konqueror 3.2 no FreeBSD
Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)

Opera

Opera

O Opera, um pouco de saco cheio do user-agent sniffing, achou justo dar poder ao usuário de decidir que navegador ele iria se disfarçar e criou um menu item que dava a opção de escolha entre uma de 3 diferentes user-agent string. Por que não bagunçar mais ainda?

// Opera
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51

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

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

Safari

Safari

A Apple começou o desenvolvimento do Safari e utilizou o KHTML como base, criando um fork do projeto conhecido como WebKit. Mas como era compatível com o KHTML, também se passava por tal. O KHTML por sua vez se passava por Gecko, e todos se passavam por Mozilla. Efeito cascata.

// Safari no OS X
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko)

Chrome

Chrome

Depois o Google decidiu fazer seu próprio navegador, e utilizou o WebKit como base. Mas como era um navegador novo e muito compatível com o Safari, se passava por tal. O WebKit por sua vez se passava por KHTML, o KHTML se passava por Gecko e, todos os outros se passavam por Mozilla. Então o Chrome foi batizado com esta enorme e complexa user-agent string.

// Chrome no OS X
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.26 Safari/537.22

E é por isso que hoje temos essa string gigantesca e aparentemente sem lógica nos browsers modernos.

#31