Browser Fingerprinting
Browser Fingerprinting
Browser fingerprinting (отпечаток браузера) — это способ идентифицировать пользователя не по логину и не по кукам, а по совокупности мелких технических признаков его браузера: версия, шрифты, разрешение экрана, поведение видеокарты, звук, часовой пояс и десятки других. По отдельности каждый признак ничего не значит, но их набор часто оказывается уникальным на миллионы людей.
История
Идея, что «браузер выдаёт себя сам», старше, чем её осознанное применение. Ещё в конце девяностых веб-сервер получал от каждого посетителя User-Agent — строку с названием браузера и ОС; тогда её использовали, чтобы отдать правильную версию сайта. Но идея «сложить все такие крошки в отпечаток» стала громкой только в 2010 году.
- 2010, Питер Экерсли, EFF. Исследование «How Unique Is Your Web Browser?» и публичный проект Panopticlick. На выборке примерно 470 тысяч посетителей Экерсли показал: около 84% браузеров были уникальны в этой выборке (среди тех, у кого включён Flash или Java — почти 95%). До этого момента про идентификацию в вебе думали в основном через куки; после — стало ясно, что сам браузер утекает как решето. Panopticlick позже переименовали в Cover Your Tracks — до сих пор живой инструмент EFF, куда можно зайти и посмотреть свой отпечаток.
- 2012, Кит Моури и Ховав Шахам, «Pixel Perfect». Академическая статья, где авторы показали canvas fingerprinting (отпечаток по HTML5 Canvas — техника рисования 2D-графики в браузере): если попросить браузер отрисовать невидимую картинку с текстом и градиентом, а потом снять её пиксельный хеш, результат оказывается разным на разных связках «видеокарта + драйвер + шрифты + сглаживание». То есть уникальность утекает даже без активной телеметрии.
- 2014, «The Web Never Forgets». Массовое сканирование топ-100 000 сайтов от исследователей из KU Leuven и Принстона показало: canvas fingerprinting уже стоит на тысячах сайтов, в том числе на порталах СМИ и госсайтах. Это была первая большая огласка, что «редкая техника из статьи» стала индустриальной практикой.
- 2012–2017, коммерциализация. Появляются MaxMind DeviceInsight, ThreatMetrix, Iovine (позже — часть RSA), а к 2017-му — FingerprintJS: сначала open-source библиотека Валентина Васильева, потом коммерческий продукт Fingerprint.com. По их же оценкам, точность идентификации хорошо настроенного отпечатка держится около 99% при среднем времени жизни несколько месяцев. За точные цифры не поручусь — они меняются от версии к версии.
- 2018–2021, реакция браузеров. Apple Safari внедряет ITP (Intelligent Tracking Prevention) и добавляет «anti-fingerprinting»: сокращение точности API, единый шрифтовый набор, приглушённые ответы от canvas. Tor Browser идёт дальше — вводит letterboxing (браузер добавляет серые поля вокруг контента, чтобы окно всегда рапортовало одно из нескольких «стандартных» разрешений). Firefox добавляет флаг resistFingerprinting.
- 2019–настоящее, Google Privacy Sandbox. Google публично объявляет войну не только третьесторонним кукам, но и фингерпринтингу: User-Agent Client Hints (сокращение User-Agent до безопасного минимума), Topics API, Privacy Budget (ограниченный «бюджет» на запросы к API, чтобы сайт физически не мог собрать полный отпечаток).
- Текущий статус (2026). Фингерпринтинг никуда не делся: труднее в Safari и Tor, чуть труднее в Firefox, всё ещё довольно точен в Chrome. Законодательство и в ЕС (GDPR), и в РФ (152-ФЗ) относит отпечаток к персональным данным, если он используется для идентификации.
Что это такое
Разберём по слоям. Когда браузер открывает страницу, он общается с сервером и с JavaScript-кодом сайта. В этом общении он раскрывает про себя большое количество мелочей — часть по протоколу HTTP (заголовки), часть через JavaScript API (запросы к настройкам, к экрану, к видеокарте). Каждая такая мелочь называется сигналом (signal) или атрибутом отпечатка.
Отдельно ни один сигнал не идентифицирует. Разрешение 1920×1080 у миллионов людей. Часовой пояс «Europe/Moscow» — у десятков миллионов. Но если сложить: «Chrome 141 на macOS 15.2, разрешение 1920×1080, часовой пояс Europe/Moscow, 24 конкретных шрифта в конкретном порядке, canvas-хеш abc123, WebGL-рендерер Apple M2, аудиоконтекст с определённым уровнем шума» — комбинация может оказаться уникальной на всю выборку.
Ключевое понятие здесь — энтропия (entropy — мера различимости, буквально «сколько битов информации несёт признак»). Один бит энтропии делит аудиторию пополам, десять бит — на тысячу подмножеств, двадцать — на миллион. Panopticlick оценивал среднего пользователя примерно в 18–20 бит суммарной энтропии от совокупности сигналов, чего с запасом хватает, чтобы выделить его на фоне миллионов посетителей одного сайта.
Явные пары, которые важно различать:
- Fingerprinting vs cookies. Cookie (кука) — это идентификатор, который сайт сам вручает браузеру и просит его возвращать. Отпечаток — это идентификатор, который сайт извлекает из браузера сам, без спроса. Куки можно стереть; отпечаток стирается только заменой окружения (другой браузер, другой компьютер, другой профиль). Куки отваливаются в инкогнито; отпечаток — почти нет.
- Passive vs active fingerprinting. Пассивный отпечаток строится только на том, что сервер и так получает: HTTP-заголовки (User-Agent, Accept-Language, Accept-Encoding), IP-адрес, порядок TLS-сообщений (JA3-хеш). Активный отпечаток требует, чтобы на странице выполнился JavaScript, который специально опрашивает API браузера: Canvas, WebGL, AudioContext, список шрифтов. Пассивный дешевле и незаметнее, но менее точен; активный — точнее, но заметнее антифрод-детекторам и блокировщикам.
- Fingerprinting vs device ID. В мобильных приложениях есть выданные ОС идентификаторы устройства (IDFA в iOS, GAID в Android). Пользователь может их сбросить или запретить. Отпечаток браузера — это способ работать в вебе, где таких идентификаторов нет вообще, и работать в мобильных приложениях, когда пользователь запретил IDFA.
Аналогии из жизни
Голос по телефону. Ты звонишь в банк и говоришь «здравствуйте». Собеседник, если он тебя когда-то слышал, узнаёт тебя по тембру, темпу речи, микроакценту, паузам — не по имени, которое ты ещё не назвал. Ты не давал согласия быть узнанным; узнавание произошло из того, что ты и так вынужденно раскрыл, чтобы говорить. Где работает: аналогия хорошо ложится на пассивный фингерпринтинг — узнают из того, что уже утекает. Где ломается: голос — один непрерывный сигнал; отпечаток браузера — это десятки независимых атрибутов, из которых считают статистику. И голос сравнительно устойчив по годам; отпечаток «стареет» за недели-месяцы, потому что браузеры обновляются, ты меняешь монитор, ставишь новый шрифт.
Почерк в подписи на чеке. Кассир не идентифицирует тебя по почерку — но если ты приходишь в магазин каждый день и подписываешь чеки, продавец начинает узнавать «эту закорючку» и уже потом соотносит её с твоей внешностью. Совокупность мелких особенностей письма (наклон, нажим, форма Т и Р) — это буквально сигналы отпечатка. Где работает: аналогия показывает, что один признак ничего не значит, а сумма — уже идентификатор. Где ломается: почерк принадлежит человеку и стабилен; отпечаток браузера принадлежит связке «человек + устройство + версия ПО». Если ты купил новый ноутбук, «почерк» полностью сменился, а ты — прежний.
Отпечаток шин на дороге. Криминалисты по глубине протектора, износу и колее могут сказать: «это, вероятно, та же машина, что проезжала здесь три дня назад». Ни одна деталь сама по себе — не улика; их сумма — да. Где работает: хорошо иллюстрирует статистический характер идентификации: не «да/нет», а «с высокой вероятностью тот же». Где ломается: следы шин остаются на дороге, а отпечаток браузера собирается на сервере в момент визита — сравнить старый и новый след может только тот, кто заранее хранил базу отпечатков.
Как это работает
Технически процесс делится на три этапа: сбор сигналов, нормализация и хеширование, сопоставление.
1. Сбор сигналов
Что именно собирают. Разделим на пассивные (сервер получает сам) и активные (нужен JavaScript).
Пассивные:
- User-Agent — строка вроде
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36. Раскрывает браузер, версию, ОС. - Accept-Language — список языков в порядке предпочтения (
ru-RU,ru;q=0.9,en;q=0.8). Отдельный признак, часто уникальный. - Accept-Encoding — какие сжатия поддерживаются.
- IP-адрес и его геопринадлежность.
- TLS-фингерпринт (JA3/JA4) — порядок и набор параметров, которые браузер посылает при установлении шифрованного соединения. Разные браузеры и даже разные версии одного браузера дают разные JA3-хеши.
Активные (JavaScript):
- Screen —
screen.width,screen.height,devicePixelRatio, глубина цвета. - Timezone —
Intl.DateTimeFormat().resolvedOptions().timeZone→ например,Europe/Moscow. - Navigator —
navigator.hardwareConcurrency(число ядер CPU),navigator.deviceMemory(объём памяти в округлённом виде),navigator.platform, список плагинов. - Fonts — сайт создаёт скрытый DOM-элемент, пытается отрисовать текст разными шрифтами и измеряет ширину. Если ширина отличается от «шрифта по умолчанию» — значит, шрифт установлен. Так собирают список из сотен возможных шрифтов.
- Canvas — тот самый Mowery & Shacham 2012. Скрипт рисует на невидимом холсте фразу с эмодзи, градиентом и специфическим текстом, потом вызывает
canvas.toDataURL()— получает base64-строку из пикселей. Из-за различий в GPU, драйверах, антиалиасинге и рендеринге шрифтов эта строка стабильно разная у разных устройств. - WebGL — то же самое, но для 3D: рисуется сцена, снимается хеш. Дополнительно можно узнать
WEBGL_debug_renderer_info(например,Apple M2илиNVIDIA GeForce RTX 3060). - AudioContext — браузер запускает виртуальный аудио-осциллятор, обрабатывает сигнал через FFT (быстрое преобразование Фурье) и снимает пиковые значения. Из-за различий в звуковых стеках эти значения отличаются.
- Touch/pointer — есть ли сенсорный экран, сколько одновременных касаний поддерживается.
- WebRTC — при неправильной настройке может утечь настоящий IP даже через VPN.
2. Нормализация и хеш
Собранные значения приводят к общему виду: строки в нижний регистр, списки шрифтов сортируются, версии обрезаются до мажорной. Потом всё склеивается в одну длинную строку и от неё считается хеш (обычно SHA-1 или SHA-256, реже что-то специализированное). Иногда хеш не один, а несколько — по группам сигналов, чтобы один изменённый признак не ломал всё сравнение.
Схема примерно такая:
[browser] ─────────────► [сигналы: UA, canvas, шрифты, ...]
│
▼
[нормализация: сортировка,
обрезание версий, унификация]
│
▼
[конкатенация в одну строку]
│
▼
[SHA-256 → fingerprint hash]
│
▼
[сравнение с базой отпечатков
→ вероятность «это тот же»]
3. Сопоставление
Ключевой момент: серьёзные системы (FingerprintJS, ThreatMetrix) не сравнивают отпечатки как строгие равенства. Они используют fuzzy matching (нечёткое сопоставление): считают, сколько сигналов совпало, сколько поменялось, и на этой основе выдают вероятность «это тот же посетитель». Это принципиально: браузер обновился с версии 140 на 141 — старый жёсткий хеш перестал совпадать, но отпечаток «это тот же ноут» уверенно узнаётся.
Server-side vs client-side. Пассивные сигналы обрабатываются на сервере (там уже есть заголовки и TLS-параметры). Активные — на клиенте: JavaScript собирает их и отправляет POST-запросом. Многие защитные системы делают гибрид: часть сигналов считают на клиенте, часть на сервере, а решение принимают в облаке провайдера антифрода.
Где встречается в обычной жизни
- Реклама, которая догоняет в инкогнито. Классика: посмотрел кроссовки на маркетплейсе → закрыл вкладку → открыл инкогнито → тебе снова показывают те же кроссовки. Куки в инкогнито стираются, но отпечаток — тот же, и рекламная сеть сопоставляет.
- Банковские приложения. Заходишь в интернет-банк с непривычного устройства — система просит SMS-подтверждение. «Непривычное устройство» банк узнаёт по отпечатку: этого сочетания браузера, ОС и параметров экрана он раньше не видел. Так устроена часть антифрод-логики почти у всех крупных банков.
- Антибот-капча. Cloudflare Turnstile, reCAPTCHA v3, Yandex SmartCaptcha в фоне снимают отпечаток и оценивают «человек или бот». У живого человека сигналы согласуются; у бота часть противоречит или подделана слишком «чисто».
- Ограничение бесплатного контента. «Первые пять статей бесплатно» после лимита не пускают тебя даже в инкогнито — лимит привязан к отпечатку, а не к куке.
Где встречается в IT и бизнесе
- Антифрод в e-commerce и финтехе. Основной сценарий. Отпечаток помогает ловить кражу сессии (session hijacking): злоумышленник украл cookies и логин, но отпечаток его устройства не совпадает с историческим отпечатком владельца — блокировка. Крупнейшие игроки: ThreatMetrix (LexisNexis), Sift, Riskified, Signifyd, у нас — «Антифрод» ЦБ, антифрод у крупных банков.
- Борьба с мультиаккаунтами. Букмекеры и маркетплейсы вычисляют, что «100 разных аккаунтов с бонусами для новичков» открыты с одного и того же браузера. Аналогично — при регистрации в промо-акциях.
- Реклама и атрибуция. Определить, что клик из TikTok и последующая покупка на сайте — это тот же человек, если он не залогинен и куки третьей стороны блокируются. Отпечаток становится «мостиком» между кампаниями. Именно это направление сейчас под самым сильным давлением регуляторов.
- Персонализация без логина. Медиа-сайты запоминают твои интересы по отпечатку, чтобы показывать релевантный контент, даже если ты не зарегистрирован. Легально — если сайт честно уведомляет.
- Платёжные системы и 3-D Secure. Отпечаток входит в набор сигналов, которые эмитент карты учитывает при решении, показывать ли пользователю подтверждение платежа. Согласованный с историей отпечаток — «свой», без 3DS. Незнакомый — 3DS-код.
Кто пользуется
Реально работающие продукты и компании, о которых я уверен:
- FingerprintJS / Fingerprint.com (США, с 2017). Начиналось как open-source библиотека Валентина Васильева, стало коммерческим SaaS. По их собственным данным — обслуживают тысячи клиентов, включая крупные e-commerce и SaaS-компании. Основной продукт — визитор-идентификатор с заявленной точностью около 99% в течение месяцев.
- ThreatMetrix — часть LexisNexis Risk Solutions, один из старейших игроков в антифроде. По собственным заявлениям, их сеть «Digital Identity Network» насчитывает миллиарды устройств.
- MaxMind minFraud — известны в первую очередь GeoIP-базой, но также предоставляют антифрод с элементами фингерпринтинга.
- Sift, Riskified, Signifyd — SaaS-антифрод для e-commerce, обслуживают в том числе крупные ритейлеры.
- Cloudflare — их антибот-стек Turnstile и Bot Management используют пассивный и активный отпечаток на фронте огромной части интернета.
- Google reCAPTCHA v3 и Yandex SmartCaptcha — оценивают «человечность» посетителя в том числе через фингерпринтинг.
- Крупные банки и платёжные системы — почти все, но публично о применяемых техниках говорят мало.
Точные объёмы (сколько сайтов, сколько миллиардов запросов в день) я приводить не буду — цифры расходятся у разных источников, и у меня нет уверенности в конкретных значениях.
Альтернативы и конкуренты
- Cookies (сторонние и первосторонние).
Плюсы: простые, стандартные, законодательно понятные, поддаются согласию пользователя.
Минусы: сторонние куки стираются, блокируются по умолчанию в Safari и Firefox, в Chrome прошли частичное сворачивание в 2024–2025. - Логин-идентификация (Sign-in with Google/Apple, единый ID).
Плюсы: точная (человек назвался сам), юридически чистая при согласии, работает кроссдевайсно.
Минусы: работает только для залогиненных, не решает задачу антифрода для анонимных сессий. - Local storage / IndexedDB / device IDs (в приложениях).
Плюсы: точные, стабильные внутри одного устройства.
Минусы: тоже стираются в инкогнито и при переустановке; в мобильных ОС управляются пользователем (IDFA, GAID). - Google Privacy Sandbox: Topics API, FLEDGE/Protected Audience, Attribution Reporting.
Плюсы: реклама без индивидуальной идентификации, вписывается в GDPR, поддерживается по умолчанию в Chrome.
Минусы: снижает точность таргетинга, работает только внутри Chrome, требует переработки всей рекламной цепочки, вызывает регуляторные споры (расследование CMA в Великобритании). - Server-side probabilistic matching (сшивание сессий по IP + времени + поведению).
Плюсы: не требует ничего от клиента.
Минусы: низкая точность на общедоступных Wi-Fi, вечно на грани нарушения приватности.
Когда НЕ стоит использовать
- Массовая идентификация анонимных пользователей для рекламы без явного согласия. GDPR (ЕС) и 152-ФЗ (Россия) относят «уникальные идентификаторы, позволяющие выделить пользователя» к персональным данным. Отпечаток без явного согласия и без прописанной в политике обработки цели — это, по консервативной интерпретации, обработка ПДн без основания. Штрафы GDPR доходят до 4% глобального оборота; в РФ штрафы ниже, но растут, и практика Роскомнадзора идёт в ту же сторону.
- Единственный источник истины в критичных решениях. Отпечаток — вероятностный сигнал. Блокировать пользователя, отказывать в платеже или отменять транзакцию только потому, что «отпечаток не совпал», — плохая идея. Он должен быть одним из факторов в модели, а не решающим голосом. Реальная история из отрасли: банк заблокировал клиента, потому что тот сменил ноутбук — потом извинялись.
- Ситуации с частой сменой окружения. Если твои пользователи — журналисты, разработчики, консультанты, часто меняющие устройства и браузеры, — отпечаток будет постоянно «ломаться». Уровень ложных срабатываний (false positive) окажется неприемлемым.
- Долгосрочная идентификация «навсегда». Отпечаток стареет: браузеры обновляются раз в месяц, шрифты добавляются, экраны меняются. Строить бизнес-процессы на предположении «этот отпечаток будет тем же через год» — наивно.
Юридический контекст
Если ты внедряешь фингерпринтинг в продукт для рынка ЕС или РФ, обязательно посоветуйся с юристом по ПДн. В ЕС отпечаток при определённой связке с целями идентификации считается персональными данными; в РФ разъяснения Роскомнадзора двигаются в ту же сторону. Cookie-баннер тебя не спасает, потому что фингерпринтинг может идти в обход прямо в момент загрузки страницы.
Связанные понятия
- Cookie-sync — обмен идентификаторами между рекламными сетями через кросс-доменные редиректы. Хрупкий предшественник фингерпринтинга в задаче «связать посетителя между сайтами».
- Canvas — HTML5 API для 2D-графики; используется как источник отпечатка через невидимый рендер.
- Энтропия (entropy) — мера различимости; в контексте фингерпринтинга — сколько бит информации несёт совокупность сигналов.
- User Agent — HTTP-заголовок с самоопределением браузера; исторически главный сигнал, сейчас урезается через Client Hints.
- ITP (Intelligent Tracking Prevention) — политика Apple Safari против трекинга; включает и меры против фингерпринтинга.
- Tor Browser и letterboxing — браузер, стремящийся к тому, чтобы все его пользователи выглядели одинаково; letterboxing — приём округления размера окна до «стандартного», чтобы не выдавать точное разрешение.
- Privacy Sandbox — набор инициатив Google для замены сторонних кук и снижения возможностей фингерпринтинга без разрушения рекламы.
- JA3 / JA4 — способ считать хеш от порядка TLS-параметров, чтобы идентифицировать клиента ещё до установления HTTPS-сессии.
Литература и источники
- Peter Eckersley. How Unique Is Your Web Browser? EFF, 2010. Стабильная версия — на сайте EFF, ищи по запросу «How Unique Is Your Web Browser EFF».
- Cover Your Tracks — https://coveryourtracks.eff.org. Живой инструмент, потомок Panopticlick.
- AmIUnique — https://amiunique.org. Аналог Cover Your Tracks от исследователей INRIA.
- Wikipedia (en): Device fingerprint — обзорная статья с историей и ссылками.
- Wikipedia (ru): Отпечаток устройства — русская обзорная статья.
- Google Privacy Sandbox — https://privacysandbox.google.com. Официальная документация инициативы.
- Mozilla Developer Network — раздел про resistFingerprinting и Anti-tracking в Firefox: искать по запросу «MDN Firefox privacy resistFingerprinting».
- Про Mowery & Shacham «Pixel Perfect» (2012) — искать по запросу «Mowery Shacham Pixel Perfect canvas fingerprinting».
Где встретилось у меня
Вчера в задаче аудита рекламных пикселей на сайте выяснилось, что цепочка редиректов рекламной сети включает отдельные эндпойнты сбора отпечатков браузера, из-за чего мониторинг переписали так, чтобы фиксировать весь каскад запросов, а не только первый хит. По ходу разбора всплыло, что часть «лишних» вызовов на сторонние домены — это именно активный фингерпринтинг, а не аналитика; это меняет отношение к их согласованию с юристами.
Краткое резюме
- Отпечаток браузера — статистический идентификатор из десятков технических сигналов; работает без кук и переживает инкогнито.
- Родился в исследовательской работе EFF (Panopticlick, 2010), стал промышленной практикой к 2014 году, продолжает жить несмотря на противодействие браузеров.
- Ключевые сигналы: User-Agent, TLS-фингерпринт, screen, timezone, canvas, WebGL, audio, шрифты; ключевая метрика — энтропия.
- Основные применения — антифрод, антибот-защита, кросс-сессионная атрибуция в рекламе, борьба с мультиаккаунтами.
- Ограничения: юридические (GDPR, 152-ФЗ), технические (стареет за недели-месяцы), этические (тайная идентификация без согласия). Использовать — только как один из факторов в модели, никогда как единственный источник истины.