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-фінгерпринт, WebGL-рендерер, параметри WebGL, WebGPU |
| Audio | 3 | AudioContext-фінгерпринт, базова затримка, DRM-тайминг |
| Шрифти та рендеринг | 10 | Виявлення шрифтів, налаштування шрифтів, MathML, рендеринг emoji |
| Navigator та платформа | 25 | User-Agent, мови, screen, hardware concurrency, часовий пояс |
| Storage та cookies | 10 | localStorage, sessionStorage, cookies, квота сховища |
| CSS та Media Queries | 10 | Колірна схема, HDR, reduced motion, forced colors |
| Мережа та WebRTC | 3 | TURN-проба, RTT з'єднання, версія застосунку |
| Bot Detection | 15 | Прапорець webdriver, фреймворки автоматизації, довжина eval |
| Tamper Detection | 8 | Інтроспекція getter-ів властивостей, ланцюги прототипів, цілісність нативних функцій |
| Custom Extensions | 14 | Math-фінгерпринт, виявлення архітектури, можливості WASM |
Конвеєр збору виконується в чотири стадії, щоб мінімізувати блокування головного потоку:
Стадія 1 (Негайно): Високопріоритетні сигнали, які швидко збираються (властивості navigator, screen, часовий пояс). TURN-проба також запускається тут, оскільки виконується паралельно.
Стадія 2 (Idle Callback): Синхронні сигнали, яким корисний період простою (CSS media queries, проби сховища, тести cookie).
Стадія 3 (Async): Сигнали, що потребують асинхронних API або рендерингу (canvas, WebGL, аудіо-фінгерпринт, виявлення шрифтів, рендеринг emoji).
Web Worker: Ізольований збір сигналів у виділеному потоці (виявлення можливостей WASM, doNotTrack).
Спільний прихований iframe створюється один раз і повторно використовується кількома збирачами (emoji, MathML, системні кольори, шрифти, screen frame), щоб уникнути накладних витрат на створення окремих iframe для кожного сигналу.
Кожен сигнал має уніфіковану структуру:
interface Signal<T> { s: number // Status code v: T // Value (when successful)}Статус-коди:
| Code | Значення |
|---|---|
0 | Успіх |
-1 | Недоступно (властивість undefined) |
-2 | Вторинна перевірка не пройдена |
-3 | Неочікувана поведінка |
-4 | Timeout |
-5 | Вимкнено |
-6 | Заблоковано CSP |
-7 | Помилка безпеки |
Зібрані сигнали серіалізуються в JSON, потім шифруються та стискаються перед передачею:
JSON-серіалізація: Усі значення сигналів пакуються в JSON-об'єкт із ключами за сигналами, плюс поля метаданих (c для API-ключа, t для тега, lid для linked ID).
Стиснення: Якщо payload перевищує 1024 байти, він стискається за допомогою CompressionStream("deflate-raw").
XOR-шифрування: Payload загортається в шифрувальний конверт:
Base64-кодування: Зашифрований payload кодується у Base64url і надсилається як тіло POST-запиту.
Запит надсилається на ingress-ендпоінт із query-параметрами для версії клієнта та API-ключа. CORS-credentials включаються для надсилання first-party cookies.
Сервер отримує зашифрований payload і обробляє його через кілька підсистем:
Сервер декодує XOR-конверт, за потреби розпаковує та парсить JSON-дані сигналів. Статус-код і значення кожного сигналу витягуються та валідуються.
Visitor 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, щоб отримати фінальний Visitor ID.
Оцінка впевненості (від 0.0 до 1.0) показує, наскільки система впевнена, що цього відвідувача ідентифіковано правильно:
_vid_t збігається, впевненість максимальна.Рушій виявлення ботів запускає кілька детекторів, зважені виходи яких комбінуються в bot score (порогові значення: bot ≥ 0.70, suspicious ≥ 0.30; hard-fail сигнал примусово встановлює вердикт «бот»). До детекторів, що роблять внесок, належать:
Сигнали збагачення на боці сервера обчислюються з необроблених даних сигналів та IP intelligence. До них належать виявлення VPN/proxy/Tor, IP-геолокація, аналіз tampering браузера та suspect scoring.
Підсистема 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 | Браузер | ~5ms | Ініціалізація агента, створення спільного iframe |
| 2 | Браузер | ~50-150ms | Збір 130+ сигналів (паралельно, багатофазно) |
| 3 | Браузер | ~5ms | Шифрування та стиснення payload |
| 4 | Мережа | ~10-50ms | POST на сервер |
| 5 | Сервер | ~5-20ms | Розшифрування, витяг сигналів, обчислення Visitor ID |
| 6 | Сервер | ~5-15ms | Виконання bot detection та smart signals |
| 7 | Сервер | ~5ms | Побудова відповіді |
| 8 | Мережа | ~10-50ms | Повернення JSON-відповіді |
| 9 | Браузер | ~1ms | Збереження cookie відвідувача |
Загальний round-trip: Зазвичай 80-300ms залежно від умов мережі та можливостей браузера.