TRACIO — это клиент-серверная система идентификации. Клиент собирает сигналы браузера и отправляет их на сервер, который вычисляет стабильный идентификатор посетителя, запускает алгоритмы обнаружения и возвращает обогащённые результаты. В этом разделе описывается каждый этап конвейера.
Browser TRACIO Cloud | | |-- Tracio.init({ publicKey }) ---------> | (init, no network) | | |-- tracio.getResult() ----------------> | | 1. Collect 130+ browser signals | | 2. Encrypt (XOR + deflate + B64) | | 3. POST to ingress endpoint | | | | |-- Decrypt & extract signals | |-- Compute visitor ID (MurmurHash3-128) | |-- Run bot detection (weighted scoring) | |-- Run smart signals (server-side enrichment) | |-- Run IP intelligence (VPN/proxy/Tor) | |-- Store visit event | | |<-- JSON response ------------------- | | visitorId, confidence, | | bot detection, smart signals | | | |-- Store visitor cookie (_vid_t) -----> | (365-day persistence)Когда вызывается tracio.getResult(), клиент собирает 130+ различных сигналов браузера, организованных в уровни (tiers). Сбор использует многофазный конвейер с Web Workers и общими iframe для производительности.
| Категория | Кол-во сигналов | Примеры |
|---|---|---|
| Canvas и WebGL | 9 | Canvas-fingerprint, WebGL-рендерер, параметры WebGL, WebGPU |
| Audio | 3 | Fingerprint AudioContext, базовая задержка, тайминг DRM |
| Шрифты и рендеринг | 10 | Определение шрифтов, настройки шрифтов, MathML, рендеринг emoji |
| Navigator и платформа | 25 | User-Agent, языки, экран, hardware concurrency, часовой пояс |
| Storage и Cookies | 10 | localStorage, sessionStorage, cookies, квота хранилища |
| CSS и медиазапросы | 10 | Цветовая схема, HDR, reduced motion, forced colors |
| Сеть и WebRTC | 3 | TURN-проба, RTT соединения, версия приложения |
| Обнаружение ботов | 15 | Флаг webdriver, фреймворки автоматизации, длина eval |
| Обнаружение подмены | 8 | Интроспекция геттеров свойств, цепочки прототипов, целостность нативных функций |
| Кастомные расширения | 14 | Math-fingerprint, определение архитектуры, возможности WASM |
Конвейер сбора работает в четыре стадии, чтобы минимизировать блокировку основного потока:
Стадия 1 (Немедленно): Высокоприоритетные сигналы, которые собираются быстро (свойства navigator, экран, часовой пояс). TURN-проба также запускается здесь, так как выполняется параллельно.
Стадия 2 (Idle Callback): Синхронные сигналы, которые выигрывают от периода простоя (CSS-медиазапросы, пробы хранилища, тесты cookies).
Стадия 3 (Async): Сигналы, требующие асинхронных API или рендеринга (canvas, WebGL, audio-fingerprint, определение шрифтов, рендеринг emoji).
Web Worker: Изолированный сбор сигналов в выделенном потоке (определение возможностей WASM, doNotTrack).
Общий скрытый iframe создаётся один раз и повторно используется несколькими коллекторами (emoji, MathML, системные цвета, шрифты, кадр экрана), чтобы избежать накладных расходов на создание отдельных iframe для каждого сигнала.
Каждый сигнал имеет единообразную структуру:
interface Signal<T> { s: number // Status code v: T // Value (when successful)}Коды статуса:
| Код | Значение |
|---|---|
0 | Успех |
-1 | Недоступно (свойство undefined) |
-2 | Вторичная проверка не пройдена |
-3 | Неожиданное поведение |
-4 | Timeout |
-5 | Отключено |
-6 | Заблокировано CSP |
-7 | Ошибка безопасности |
Собранные сигналы сериализуются в JSON, затем шифруются и сжимаются перед передачей:
Сериализация в JSON: Все значения сигналов упаковываются в JSON-объект с ключами по сигналам, плюс поля метаданных (c для API-ключа, t для тега, lid для связанного ID).
Сжатие: Если payload превышает 1024 байта, он сжимается с помощью CompressionStream("deflate-raw").
XOR-шифрование: Payload оборачивается в шифровальный конверт:
Base64-кодирование: Зашифрованный payload кодируется в Base64url и отправляется в теле POST-запроса.
Запрос отправляется на ingress-эндпоинт с query-параметрами версии клиента и API-ключа. Учётные данные CORS включаются для отправки first-party cookies.
Сервер получает зашифрованный payload и обрабатывает его через несколько подсистем:
Сервер декодирует XOR-конверт, при необходимости распаковывает и парсит JSON-данные сигналов. Код статуса и значение каждого сигнала извлекаются и валидируются.
ID посетителя вычисляется с помощью подхода многоуровневого хеширования (V3):
Tier 1 (Frozen): 20 base62 characters - Stable hardware signals that rarely change - Canvas, WebGL renderer, audio fingerprint, fonts - Provides long-term visitor identity
Tier 2 (Semi-stable): 10 base62 characters - Signals that change with browser updates - User-Agent data, Client Hints, plugins - Extensible without breaking Tier 1
Tier 3 (Volatile): 10 base62 characters - Signals that change frequently - Screen resolution, timezone, language - Used for confidence scoring, not identityКаждый уровень извлекает назначенные ему сигналы, строит канонизированную строку и хеширует её с помощью MurmurHash3-x64-128. Три хеша уровней конкатенируются и кодируются в base62, образуя финальный ID посетителя.
Оценка достоверности (от 0.0 до 1.0) показывает, насколько система уверена, что этот посетитель идентифицирован верно:
_vid_t совпадает, достоверность максимальна.Движок обнаружения ботов запускает несколько детекторов, чьи взвешенные выходы объединяются в bot-score (пороги: bot ≥ 0.70, suspicious ≥ 0.30; сигнал жёсткого отказа принудительно выносит вердикт «бот»). В число участвующих детекторов входят:
Обогащающие сигналы на стороне сервера вычисляются из сырых данных сигналов и IP intelligence. Они включают обнаружение VPN/proxy/Tor, IP-геолокацию, анализ подмены браузера и скоринг подозрительности.
Подсистема IP intelligence предоставляет:
Сервер возвращает JSON-ответ, содержащий:
{ "visitorId": "X7fh2Hg9LkMn3pQr", "bot": { "detected": false, "confidence": 2, "reasons": [] }}Это результат, к которому разрешается tracio.getResult() в браузере. Полное,
обогащённое событие — включая канонический bot_result
(human / bot / uncertain), геолокацию и smart signals — доставляется
на стороне сервера через webhooks и отображается в
дашборде.
Клиент сохраняет токен посетителя как в first-party cookie (срок действия 365 дней, SameSite=Lax), так и в localStorage для персистентности между сессиями.
| Шаг | Расположение | Длительность | Описание |
|---|---|---|---|
| 1 | Browser | ~5ms | Инициализация агента, создание общего iframe |
| 2 | Browser | ~50-150ms | Сбор 130+ сигналов (параллельно, многофазно) |
| 3 | Browser | ~5ms | Шифрование и сжатие payload |
| 4 | Network | ~10-50ms | POST на сервер |
| 5 | Server | ~5-20ms | Расшифровка, извлечение сигналов, вычисление ID |
| 6 | Server | ~5-15ms | Запуск обнаружения ботов и smart signals |
| 7 | Server | ~5ms | Формирование ответа |
| 8 | Network | ~10-50ms | Возврат JSON-ответа |
| 9 | Browser | ~1ms | Сохранение cookie посетителя |
Полный round-trip: Обычно 80-300ms в зависимости от условий сети и возможностей браузера.