TRACIO — это клиент-серверная система идентификации. Клиент собирает сигналы браузера и отправляет их на сервер, который вычисляет стабильный идентификатор посетителя, запускает алгоритмы обнаружения и возвращает обогащённые результаты. В этом разделе описывается каждый этап конвейера.
Browser TRACIO Cloud | | |-- Tracio.init({ publicKey }) ---------> | (init, no network) | | |-- tracio.getResult() ----------------> | | 1. Collect 300+ 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(), клиент собирает 300+ различных сигналов браузера, организованных в уровни (tiers). Сбор использует многофазный конвейер с Web Workers и общими iframe для производительности.
Агент поставляет 300+ сигналов в 15 категориях:
| Категория | Сигналов | Категория | Сигналов |
|---|---|---|---|
| Tamper | 82 | Fonts | 15 |
| Navigator | 72 | Network | 15 |
| Bot | 32 | Persistence | 14 |
| Canvas | 26 | Intl | 13 |
| CSS | 19 | Audio | 12 |
| Privacy | 17 | Storage | 12 |
| Crypto | 16 | Behavioral | 5 |
| Display | 15 |
Canvas покрывает WebGL и WebGPU наравне с 2D-рендерингом; Tamper — самая большая категория, потому что распознавание изменённого окружения требует больше проб, чем чтение неизменённого.
Конвейер сбора работает в четыре стадии, чтобы минимизировать блокировку основного потока:
Стадия 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 совпадает с известным посетителем, достоверность максимальна.Движок обнаружения ботов запускает несколько детекторов и складывает их взвешенные выходы в оценку бота; сигнал жёсткого отказа (hard-fail) сам по себе задаёт вердикт «бот». Публичное значение bot.score — это шкала 0..100, а вердикт приходит как bot.result. Точные пороги не публикуются: порог, который можно прочитать, — это порог, под который можно подстроиться. В число участвующих детекторов входят:
Детекторы инструментирования (Frida), root/jailbreak и клонированных приложений в платформе есть, но их входные слоты нативные — браузерный агент их не собирает, поэтому в веб-вердикт они не попадают. О том, что полностью работает в вебе, — в разделе Обнаружение ботов.
Обогащающие сигналы на стороне сервера вычисляются из сырых данных сигналов и IP intelligence. Они включают обнаружение VPN/proxy/Tor, IP-геолокацию, анализ подмены браузера и скоринг подозрительности.
Подсистема IP intelligence предоставляет:
Сервер возвращает JSON-ответ, содержащий:
{ "visitorId": "X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y", "bot": { "detected": false, "confidence": 2, "reasons": [] }}Это результат, к которому разрешается tracio.getResult() в браузере. Полное,
обогащённое событие — включая канонический bot_result
(human / bot / uncertain), геолокацию и smart signals — доставляется
на стороне сервера через webhooks, читается через
Data API и отображается в дашборде.
Клиент сохраняет токен посетителя как в first-party cookie (срок действия 365 дней, SameSite=Lax), так и в localStorage для персистентности между сессиями.
| Шаг | Расположение | Описание |
|---|---|---|
| 1 | Browser | Инициализация агента, создание общего iframe |
| 2 | Browser | Сбор 300+ сигналов (параллельно, многофазно) |
| 3 | Browser | Шифрование и сжатие payload |
| 4 | Network | POST на сервер |
| 5 | Server | Расшифровка, извлечение сигналов, вычисление ID |
| 6 | Server | Запуск обнаружения ботов и smart signals |
| 7 | Server | Формирование ответа |
| 8 | Network | Возврат JSON-ответа |
| 9 | Browser | Сохранение cookie посетителя |
Полный round-trip: миллисекунды. Основную часть занимает сбор сигналов — сетевые перелёты и серверная работа меньше, — и время зависит от устройства и соединения посетителя. Рендеринг страницы это не блокирует: агент грузится асинхронно, а каждая потенциально долгая проверка ограничена собственным таймаутом.