User Agent строки: чтение отпечатков браузера
Что эта странная строка говорит тебе о твоих посетителях и почему она часто вводит в заблуждение.
Каждый HTTP-запрос включает заголовок User-Agent. Что-то вроде:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
Это должно идентифицировать браузер. На практике это исторический беспорядок.
Почему каждый браузер лжёт
Этот user agent Chrome упоминает Mozilla, AppleWebKit, KHTML и Safari. Chrome не является ни одним из них.
Вот почему: сайты раньше проверяли user agents и подавали разный контент. Новые браузеры блокировались, потому что сайты их не распознавали.
Поэтому браузеры начали лгать. "Я совместим с Mozilla" стало стандартом. "Я совместим с AppleWebKit" было добавлено. Каждый браузер утверждает, что он каждый другой браузер.
Что ты можешь на самом деле узнать
Несмотря на хаос, user agents всё ещё содержат полезную информацию:
Имя и версия браузера: Фактический браузер обычно в конце. "Chrome/120" или "Firefox/121".
Операционная система: "Windows NT 10.0" или "Mac OS X 10_15_7" или "Linux".
Тип устройства: Мобильные user agents включают названия устройств или "Mobile".
Идентификация ботов: Googlebot, Bingbot и другие краулеры идентифицируют себя.
Частые паттерны обнаружения
Десктопный Chrome:
...Chrome/120.0.0.0 Safari/537.36
Мобильный Chrome на Android:
...Android 10; Pixel 4...Chrome/120.0.0.0 Mobile Safari/537.36
Safari на iPhone:
...iPhone; CPU iPhone OS 17_0 like Mac OS X...Safari/605.1.15
Firefox:
...Firefox/121.0
Edge, Opera, Brave и другие основаны на Chrome и выглядят похоже на Chrome.
Почему обнаружение возможностей лучше
Обнаружение user agent отвечает на "какой браузер?" Обнаружение возможностей отвечает на "может ли этот браузер делать X?"
// Обнаружение user agent (хрупкое)
if (navigator.userAgent.includes('Chrome')) {
// предполагай возможности Chrome
}
// Обнаружение возможностей (надёжное)
if ('serviceWorker' in navigator) {
// используй service workers
}
Браузеры меняются. User agent строки модифицируются. Обнаружение возможностей работает независимо.
Когда User Agents всё ещё важны
Аналитика. Понимание твоей аудитории: доля рынка браузеров, мобильные vs десктоп, распределение ОС.
Обнаружение ботов. Идентификация краулеров и корректировка поведения сервера.
Целевое тестирование. Воспроизведение проблем, о которых сообщают пользователи на конкретных браузерах.
Решения о поддержке унаследованного кода. Если 0.1% пользователей запускают IE11, может быть, ты прекращаешь его поддержку.
Подделка и приватность
User agents легко подделываются. Расширения приватности модифицируют их. Некоторые браузеры позволяют пользователям менять их вручную.
Не полагайся на user agents для безопасности. Это подсказки, а не аутентификация.
Фингерпринтинг браузера комбинирует user agent с другими сигналами (размер экрана, шрифты, плагины) для отслеживания. Это спорно и всё больше блокируется браузерами.
Client Hints: современная альтернатива
User-Agent Client Hints — более новый подход. Серверы запрашивают конкретную информацию:
Sec-CH-UA: "Chromium";v="120", "Google Chrome";v="120"
Sec-CH-UA-Platform: "Windows"
Sec-CH-UA-Mobile: ?0
Структурированные, надёжные, уважающие приватность. Но принятие всё ещё растёт.
Библиотеки парсинга
Не парси user agents с помощью regex. Крайние случаи победят тебя.
Используй устоявшиеся библиотеки, которые поддерживают базы данных паттернов:
- ua-parser-js (JavaScript)
- user-agents (Python)
- DeviceDetector (PHP)
Они обрабатывают исторический беспорядок и обновляются, когда появляются новые браузеры.
User agents полезны для аналитики и диагностики, но ненадёжны для решений о возможностях. Парси их библиотеками, предпочитай обнаружение возможностей для функциональности и помни, что любой пользователь может подделать свой user agent.