Jestem Agent, User Agent
User Agent z założenia ma pozwalać na identyfikację narzędzia, które wykorzystuje technologie internetowe. Gdy go projektowano miał być wsparciem dla bezpieczeństwa i tożsamości np. przeglądarek. Czym jest i jak działa dzisiaj? O tym w poniższym artykule.
Z tego artykułu dowiesz się:
Co to jest User Agent?
Dlaczego wszystkie przeglądarki przedstawiają się jako Mozilla?
Kto wprowadził ramki HTML i do czego to doprowadziło?
Do czego służy Modernizr?
Każde szanujące się mocarstwo ma swoje służby specjalne. Któż z nas nie słyszał chociażby o MI6 i najsłynniejszym agencie - James’ie Bondzie. Błyskotliwy, skuteczny, doskonały, zabójczo przystojny i w dodatku gentleman. Ian Flaming wykreował świetną postać. Dlaczego więc w świecie webdevelopmentu nie mielibyśmy mieć swojego agenta specjalnego?
Agent specjalny
Otóż - moi drodzy - mamy go. Może nie jest błyskotliwy, skuteczny i zabójczo przystojny, może nie jest też najlepszy w zdobywaniu kobiecych serc, ale … jest. I tutaj jego zalety chyba się kończą. Nazywa się Agent, User Agent.
Zacznijmy od technicznego spojrzenia na temat. Z definicji User Agent to oprogramowanie, które w imieniu użytkownika pobiera, renderuje i ułatwia korzystanie z zasobów stron internetowych. Innymi słowy jego głównym zadaniem jest wsparcie użytkownika w łatwiejszym i przyjemniejszym surfowaniu po sieci. Tego agenta posiada każde oprogramowania, które zostało zaimplementowane w technologiach webowych. Gdzie go spotkamy? Przede wszystkim w przeglądarkach internetowych, odtwarzaczach multimedialnych i wszelkiego rodzaju wtyczkach, które wykorzystują treści internetowe.
Skoro w tego agenta wyposażone jest każde oprogramowanie działające w oparciu o technologie internetowe, to jak można go wykorzystać. To pytanie zadano sobie już w pierwszej połowie lat 90.
Coś w nagłówku HTTP
User Agent jako nagłówek HTTP, został opisany w dokumencie RFC-1945 z maja 1996 roku. W zasadzie został tam określony jako specjalny nagłówek HTTP, który odpowiada za przesłanie informacji o user agencie, który inicjuje zapytanie. Cel jego powstania to przede wszystkim kwestie związane z bezpieczeństwem i statystykami. Wprowadzając go chciano uzyskać więcej informacji na temat naruszeń protokołu HTTP, a także poprzez odpowiednią identyfikację pytającego lepiej dostosować udzielaną odpowiedź. Takie dostosowanie może mieć sporą wartość, gdy pytający ma narzucone pewne ograniczenia związane ze obsługą odpowiedzi. De facto dawało to szanse na lepsze dopasowanie technologii do możliwości odbiorcy.
W ramach wysyłanego nagłówka są przesłane specjalne tokeny produktów, które są po prostu oznaczeniem aplikacji wysyłających zapytanie. Zawierają ich nazwy lub nazwy kodowe, opcjonalny slash oraz wersje. Oprócz tokenów w nagłówku znajdziemy także komentarze, które mają pomóc w identyfikacji oraz wszelkie produkty zależne, stanowiące istotną część aplikacji wysyłającej.
Podstawowa struktura nagłówka wygląda w następujący sposób:
User-Agent: <product> / <product-version> <comment>
Wspólny szablon dla technologii webowych wygląda następująco:
User-Agent: Mozilla/5.0 (<system-information>) <platform> (<platform-details>) <extensions>
Zwróćmy uwagę, że oprócz podstawowej struktury znajdziemy tutaj taże informacje o systemie operacyjnym, wersji silnika oraz rozszerzeniach, które zostały dodane do User-Agenta. Sporo informacji, prawda?
Po prostu cześć
Pierwotne założenie przesyłania nagłówka User-Agent było związane z identyfikacją. W zasadzie sprowadzało się to do prostego przywitania, np: „Cześć, jestem Mozilla Firefox, pracuję na Windowsie”. Wiedza, którą otrzymujemy z takiego nagłówka daje nam spore możliwości. Możemy poinformować użytkownika o używaniu starej wersji przeglądarki, a nawet wymusić jej aktualizację. Możemy zastosować inne stylowanie i skryptowanie w zależności od przeglądarki. Możemy ograniczyć pewne funkcjonalności w zależności od wersji i silnika przeglądarki czy nawet systemu operacyjnego. Tylko, że User-Agent nie jest przyjazny i na pierwszy rzut oka to nie jest po prostu „cześć”. Przeanalizujmy kilka nagłówków:
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0
Powyższy przykład wskazuje nam na przeglądarkę Mozilla Firefox w wersji 12, która została uruchomiona na systemie operacyjnym Windows 7 w wersji 64bitowej. Windows 7 ma nazwę kodową Windows NT 6.1, WOW64 oznacza 64bitową wersję systemu. Dobrze, zatem spojrzmy na User-Agenta dla Internet Explorera:
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
MSIE 9.0 oznacza, że mamy do czynienia z Internet Explorerem w wersji 9. Trident/5.0 to nazwa i wersja silnika do renderowania. Całość jest uruchomiona na systemie Windows 7 w wersji 64bitowej. Zaraz, zaraz … IE przedstawiło się jako Mozilla.
Jeszcze ciekawiej będzie z Chromem.
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5
Widzimy tutaj nie tylko Mozillę, Gecko (silnik renderujący Firefoxa), ale i Safari. Chyba musimy się temu przyjrzeć dokładniej.
Pierwsze przeglądarki
Opowiadając historię przeglądarek często zaczyna się od Netscape Navigator. Nie bez powodu. Netscape był prekursorem w wielu ważnych dla świata Internetu technologiach, takich jak frames (ramki), Javascript czy też DHTML. Miał też całkiem pokaźną liczbę użytkowników - do połowy 1995 roku korzystało z niego ponad 80% użytkowników Internetu. Kiedy pod koniec 2007 roku ogłaszano koniec wsparcia i zaprzestanie dalszego rozwijania tej przeglądarki oświadczono również, że pozostałości rodziny Netscape Navigator zostaną przekazane na rzecz Fundacji Mozilla.
Dlaczego akurat Mozilla? Mozilla to nazwa kodowa przeglądarki Netscape Navigator. Kiedy na początku lat 2000 firma AOL zwolniła wszystkich programistów Netscape Communications Corporation pracujących nad tą przeglądarką, konieczne było stworzenie podmiotu, który mógłby dalej rozwijać i utrzymywać ten projekt. Tak też powołano do życia fundację Mozilla, której głównym zadaniem było dbanie o projekt Mozilla (czyli przede wszystkim wyżej wymienioną przeglądarkę).
Netscape nie był jednak pierwszą przeglądarką na rynku. Zbudowano go na podstawie przeglądarki o nazwie Mosaic. Jej User Agent to NCSA_Mosaic/2.0
. Mosaic istniałby dłużej, gdyby nie fakt, że powstała przeglądarka Mozilla (która później została przemianowana na Netscape). User Agent dla nowej przeglądarki to Mozilla/1.0
. Ok, czyli już wiemy co Mozilla znaczy, ale dlaczego stała się tak popularna i wszechobecna?
Dla ciekawskich dopowiem, że Mozilla to również imię zielonej jaszczurki, która była maskotką firmy Netscape.
Jak już wcześniej wspomniałem Netscape wprowadził obsługę ramek HTMLowych. I to był przełom...
Ramki - początek chaosu
Ramki okazały się game changer'em. Przed ich wprowadzeniem strony www budowało się tylko w czystym HTMLu, z pominięciem serwera i bez preprocesorów HTMLowych. Zmiany w elementach wspólnych, takich jak nagłówki czy stopki, należało wykonać we wszystkich plikach, w których te elementy występowały. W przypadku witryn z dużą ilością podstron było to bardzo męczące i wymagało dużego nakładu pracy. Wprowadzenie ramek bardzo ułatwiło ten proces, ponieważ pozwalały na zagnieżdżanie różnych dokumentów HTML w sobie. Ramki stały się tak popularne, że zostały oficjalnie wprowadzone do specyfikacji HTML w roku 1998. Dobrze rozumiesz, Netscape wprowadził ramki zanim zostały one opisane w specyfikacji języka HTML. Taki kozak.
Serwery zaczęły sprawdzać czy User Agent zawiera hasło Mozilla i na tej podstawie decydowały, jaką stronę wysłać do użytkownika - zbudowaną na ramkach (nowocześniejszą) czy bez. Rynek się rozwijał, a graczy było coraz więcej. Kolejną przeglądarką, która wprowadziła obsługę ramek był Internet Explorer. Niestety serwery nie wysyłały do IE nowocześniejszej strony, ponieważ jej User Agent nie zawierał magicznego słowa Mozilla.
Co zrobił Microsoft w tej sytuacji? To, co było najłatwiejsze. Zmienił swojego User Agenta i dodał do niego hasło Mozilla. W komentarzach dodano natomiast informację o kompatybilności i o samej IE. Kolejne przeglądarki poszły dokładnie tą samą drogą.
Serwery co do zasady zwracały strony w nowocześniejszej wersji na Netscape’a i później Firefoxa. Szukały zatem w User Agentach haseł związanych z tymi narzędziami, takimi jak np. Gecko. Gecko to silnik renderujący Firefoxa. Inni twórcy silników zaczęli dokładać swoje określenia do komentarzy, które w zasadzie miały poinformować serwer, że chcemy nowocześniejszą wersję strony. Tak też zaczęto dodawać hasło: like Gecko
do opisu silnika KHTML (silnik dla przeglądarki Konquerer dostępnej pierwotnie na systemie Linux). Na bazie KHTML powstał natomiast WebKit, czyli silnik renderujący Chrome’a. WebKit zachował oryginalne oznaczenie z KHTML. Tak więc Chrome ma w swoim User Agencie hasła: Mozilla
, KHTML like Gecko
oraz Safari
, które nijak się mają do jego tożsamości.
Wniosek? Dla serwera nie ma znaczenia co się znajduje w User Agencie. Serwer szuka specyficznych słów i na tej podstawie decyduje co wysłać do użytkownika. Jednym słowem - chaos.
Mechanizm ramek nadal jest dostępny w każdej nowoczesnej przeglądarce, pomimo że już w XHTML 1.1 (w 2001 roku) został uznany za technologię przestarzałą.
Kwestia zaufania
Jak zatem sprawdzić czy dana przeglądarka obsługuje daną funkcjonalność? Nasz agent specjalny jest już tak zaśmiecony, że możemy mieć pewne problemy z zaufaniem mu. Innym rozwiązaniem może być skorzystanie z bibliotek do sprawdzania możliwości korzystania z danych funkcjonalności. Jedną z nich jest Modernizr, który testuje dostępność różnych funkcjonalności (CSS i JS) w ramach przeglądarki, a następnie tworzy globalny obiekt zawierający informacje o ich dostępności w przypadku JSa oraz dodaje odpowiednie klasy CSS do znacznika body dokumentu. Przydatne, w szczególności dlatego, że nie opiera się o naszego User Agenta.
Z zaufaniem związana jest jeszcze jedna kwestia. Google postanowił uznać User Agenta za przestarzałego. W styczniu 2020 roku Yoav Weiss (programista z Google) napisał:
On top of those privacy issues, User-Agent sniffing is an abundant source of compatibility issues, in particular for minority browsers, resulting in browsers lying about themselves ( generally or to specific sites ), and sites (including Google properties) being broken in some browsers for no good reason.
The above abuse makes it desirable to freeze the UA string and replace it with a better mechanism. There have been past attempts at UA string freezing from the Safari team, but without an alternative way to perform UA based content-negotiation, they had to be partially reverted.
No cóż. Skoro wszyscy kłamią i podszywają się pod inne przeglądarki to może rzeczywiście warto pomyśleć o znalezieniu innego mechanizmu do identyfikacji. Niestety, jak w cytacie powyżej - Safari poległo, Chrome od 2020 roku nadal sobie z tym nie poradził.
Podsumowanie
Ten agent specjalny narobił niezłego bałaganu. Są konflikty, wybuchy, kłamstwa i romanse. User Agent w formie w jakiej go przedstawiłem powyżej nadal występuje, a mamy rok 2022. Miał być czymś, co pomoże w identyfikacji poszczególnych graczy na rynku, zapewni dostępność najnowocześniejszych technologii oraz zadbać o bezpieczeństwo, a z powodu opieszałości twórców i chodzenia skrótami stał się czymś, z czym musimy żyć, a czego nie możemy się pozbyć, bo nie bardzo mamy pomysł jak i/lub kim go zastąpić.
Chociaż nowy agent już zmierza… Hints, Client Hints. Ciekawe czy będzie skuteczniejszy.
Komentarze (0)
Jeszcze nikt nic nie napisał, ale to znaczy że... możesz być pierwszy/pierwsza.