TRACIO je identifikační systém typu klient–server. Klient sbírá signály prohlížeče a odesílá je na server, který vypočítá stabilní identifikátor návštěvníka, spustí detekční algoritmy a vrátí obohacené výsledky. Tato část vysvětluje každou fázi celého procesu.
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)Když je zavolána metoda tracio.getResult(), klient sesbírá více než 300 různých signálů prohlížeče uspořádaných do úrovní (tiers). Sběr využívá vícefázový proces s Web Workery a sdílenými iframy kvůli výkonu.
Agent obsahuje 300+ signálů v 15 kategoriích:
| Kategorie | Signálů | Kategorie | Signálů |
|---|---|---|---|
| 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 pokrývá vedle 2D renderingu i WebGL a WebGPU; Tamper je největší kategorie, protože rozpoznat upravené prostředí vyžaduje víc sond než přečíst prostředí nedotčené.
Proces sběru probíhá ve čtyřech fázích, aby se minimalizovalo blokování hlavního vlákna:
Fáze 1 (okamžitá): Signály s vysokou prioritou, které lze sesbírat rychle (vlastnosti navigatoru, obrazovka, časové pásmo). Zde se také spouští TURN probe, protože běží souběžně.
Fáze 2 (idle callback): Synchronní signály, které těží z období nečinnosti (CSS media queries, storage probes, testy cookies).
Fáze 3 (async): Signály vyžadující asynchronní API nebo rendering (canvas, WebGL, audio fingerprint, detekce písem, vykreslování emoji).
Web Worker: Izolovaný sběr signálů ve vyhrazeném vlákně (detekce funkcí WASM, doNotTrack).
Sdílený skrytý iframe je vytvořen jednou a znovu použit více kolektory (emoji, MathML, systémové barvy, písma, screen frame), aby se předešlo režii vytváření samostatných iframů pro každý signál.
Každý signál má konzistentní strukturu:
interface Signal<T> { s: number // Status code v: T // Value (when successful)}Stavové kódy:
| Kód | Význam |
|---|---|
0 | Úspěch |
-1 | Nedostupné (vlastnost undefined) |
-2 | Sekundární kontrola selhala |
-3 | Neočekávané chování |
-4 | Timeout |
-5 | Zakázáno |
-6 | Blokováno CSP |
-7 | Bezpečnostní chyba |
Sesbírané signály jsou serializovány do JSON a poté před přenosem zašifrovány a komprimovány:
Serializace do JSON: Všechny hodnoty signálů jsou zabaleny do objektu JSON s klíči podle signálu, plus metadatová pole (c pro API klíč, t pro tag, lid pro linked ID).
Komprese: Pokud payload přesáhne 1024 bajtů, je zkomprimován pomocí CompressionStream("deflate-raw").
XOR šifrování: Payload je zabalen do šifrovací obálky:
Kódování Base64: Šifrovaný payload je zakódován ve formátu Base64url a odeslán jako tělo POST požadavku.
Požadavek je odeslán na ingress endpoint s query parametry pro verzi klienta a API klíč. Zahrnují se CORS credentials, aby se odeslaly first-party cookies.
Server přijme šifrovaný payload a zpracuje jej prostřednictvím několika subsystémů:
Server dekóduje XOR obálku, v případě potřeby dekomprimuje a parsuje data signálů ve formátu JSON. Stavový kód a hodnota každého signálu jsou extrahovány a validovány.
ID návštěvníka se vypočítá pomocí přístupu víceúrovňového hashování (tiered hashing, 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 identityKaždá úroveň extrahuje své přidělené signály, sestaví kanonický řetězec a zahashuje jej pomocí MurmurHash3-x64-128. Tři hashe jednotlivých úrovní se zřetězí a zakódují do base62, čímž vznikne finální ID návštěvníka.
Skóre jistoty (confidence, 0.0 až 1.0) udává, jak jistě systém tohoto návštěvníka správně identifikoval:
_vid_t odpovídá známému návštěvníkovi, jistota je maximální.Engine pro detekci botů spouští několik detektorů a jejich vážené výstupy skládá do bot skóre; signál typu hard-fail vynutí verdikt bota sám o sobě. Veřejná hodnota bot.score je na škále 0..100 a verdikt přichází jako bot.result. Přesné prahové hodnoty nezveřejňujeme — práh, který si lze přečíst, je práh, kterému se lze přizpůsobit. Mezi přispívající detektory patří:
Detektory instrumentace (Frida), rootu/jailbreaku a klonovaných aplikací v platformě existují, ale jejich vstupní sloty jsou pouze nativní — prohlížečový agent je nesbírá, takže do webového verdiktu nevstupují. Co je na webu plně aktivní, popisuje Detekce botů.
Obohacovací signály na straně serveru se počítají ze surových dat signálů a z IP intelligence. Patří sem detekce VPN/proxy/Tor, IP geolokace, analýza manipulace s prohlížečem (browser tampering) a skórování podezřelosti.
Subsystém IP intelligence poskytuje:
Server vrátí odpověď ve formátu JSON obsahující:
{ "visitorId": "X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y", "bot": { "detected": false, "confidence": 2, "reasons": [] }}Toto je výsledek, na který se tracio.getResult() v prohlížeči rozhodne (resolve). Kompletní, obohacená událost — včetně kanonického bot_result
(human / bot / uncertain), geolokace a smart signals — je
doručena na straně serveru prostřednictvím webhooků, je čitelná přes
Data API a zobrazena v dashboardu.
Klient ukládá token návštěvníka jak do first-party cookie (platnost 365 dní, SameSite=Lax), tak do localStorage kvůli perzistenci napříč relacemi.
| Krok | Umístění | Popis |
|---|---|---|
| 1 | Browser | Inicializace agenta, vytvoření sdíleného iframu |
| 2 | Browser | Sběr 300+ signálů (paralelně, vícefázově) |
| 3 | Browser | Zašifrování a komprese payloadu |
| 4 | Síť | POST na server |
| 5 | Server | Dešifrování, extrakce signálů, výpočet ID návštěvníka |
| 6 | Server | Spuštění bot detection a smart signals |
| 7 | Server | Sestavení odpovědi |
| 8 | Síť | Vrácení odpovědi JSON |
| 9 | Browser | Uložení cookie návštěvníka |
Celkový round-trip: milisekundy. Většinu z nich zabere sběr signálů — síťové přenosy a práce na straně serveru tvoří menší část — a doba se liší podle zařízení a připojení návštěvníka. Nic z toho neblokuje vykreslování stránky: agent se načítá asynchronně a každá kontrola, která může být pomalá, je omezena vlastním timeoutem.