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, 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 збігається з відомим відвідувачем, впевненість максимальна.Рушій виявлення ботів запускає кілька детекторів і складає їхні зважені виходи в оцінку бота; сигнал жорсткої відмови (hard-fail) сам по собі задає вердикт «бот». Публічне значення bot.score — це шкала 0..100, а вердикт надходить як bot.result. Точні пороги не публікуються: поріг, який можна прочитати, — це поріг, під який можна підлаштуватися. До детекторів, що роблять внесок, належать:
Детектори інструментування (Frida), root/jailbreak і клонованих застосунків у платформі є, але їхні вхідні слоти нативні — браузерний агент їх не збирає, тому у веб-вердикт вони не потрапляють. Про те, що повністю працює у вебі, — у розділі Виявлення ботів.
Сигнали збагачення на боці сервера обчислюються з необроблених даних сигналів та IP intelligence. До них належать виявлення VPN/proxy/Tor, IP-геолокація, аналіз tampering браузера та suspect scoring.
Підсистема 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 | Браузер | Ініціалізація агента, створення спільного iframe |
| 2 | Браузер | Збір 300+ сигналів (паралельно, багатофазно) |
| 3 | Браузер | Шифрування та стиснення payload |
| 4 | Мережа | POST на сервер |
| 5 | Сервер | Розшифрування, витяг сигналів, обчислення Visitor ID |
| 6 | Сервер | Виконання bot detection та smart signals |
| 7 | Сервер | Побудова відповіді |
| 8 | Мережа | Повернення JSON-відповіді |
| 9 | Браузер | Збереження cookie відвідувача |
Загальний round-trip: мілісекунди. Основну частину займає збір сигналів — мережеві перельоти та серверна робота менші, — і час залежить від пристрою та з'єднання відвідувача. Рендеринг сторінки це не блокує: агент вантажиться асинхронно, а кожна потенційно довга перевірка обмежена власним таймаутом.