TRACIO este un sistem de identificare client-server. Clientul colectează semnale din browser și le trimite către server, care calculează un identificator de vizitator stabil, execută algoritmi de detecție și returnează rezultate îmbogățite. Această secțiune explică fiecare etapă a pipeline-ului.
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)Când este apelat tracio.getResult(), clientul colectează peste 300 de semnale distincte din browser, organizate pe niveluri (tiers). Colectarea folosește un pipeline multifazic cu Web Workers și iframe-uri partajate pentru performanță.
Agentul livrează peste 300 de semnale în 15 categorii:
| Categorie | Semnale | Categorie | Semnale |
|---|---|---|---|
| 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 acoperă WebGL și WebGPU la fel ca randarea 2D; Tamper este cea mai mare categorie, pentru că recunoașterea unui mediu modificat cere mai multe sonde decât citirea unuia nemodificat.
Pipeline-ul de colectare rulează în patru etape pentru a minimiza blocarea firului principal (main thread):
Etapa 1 (Immediate): Semnale cu prioritate ridicată, rapid de colectat (proprietăți navigator, screen, fus orar). Sonda TURN pornește tot aici, deoarece rulează concomitent.
Etapa 2 (Idle Callback): Semnale sincrone care beneficiază de o perioadă de inactivitate (CSS media queries, sonde de storage, teste de cookie-uri).
Etapa 3 (Async): Semnale care necesită API-uri asincrone sau rendering (canvas, WebGL, audio fingerprint, detecția fonturilor, randare emoji).
Web Worker: Colectarea izolată a semnalelor într-un fir dedicat (detecția caracteristicilor WASM, doNotTrack).
Un iframe ascuns partajat este creat o singură dată și reutilizat de mai mulți colectori (emoji, MathML, culori de sistem, fonturi, screen frame) pentru a evita costul creării de iframe-uri separate pentru fiecare semnal.
Fiecare semnal urmează o structură consistentă:
interface Signal<T> { s: number // Status code v: T // Value (when successful)}Coduri de stare:
| Cod | Semnificație |
|---|---|
0 | Succes |
-1 | Indisponibil (proprietate undefined) |
-2 | Verificarea secundară a eșuat |
-3 | Comportament neașteptat |
-4 | Timeout |
-5 | Dezactivat |
-6 | Blocat de CSP |
-7 | Eroare de securitate |
Semnalele colectate sunt serializate în JSON, apoi criptate și comprimate înainte de transmitere:
Serializare JSON: Toate valorile semnalelor sunt împachetate într-un obiect JSON cu chei pe semnal, plus câmpuri de metadate (c pentru cheia API, t pentru tag, lid pentru linked ID).
Compresie: Dacă payload-ul depășește 1024 de octeți, este comprimat cu CompressionStream("deflate-raw").
Criptare XOR: Payload-ul este împachetat într-un plic de criptare:
Codare Base64: Payload-ul criptat este codat Base64url și trimis ca body al cererii POST.
Cererea este trimisă către endpoint-ul de ingress cu parametri de query pentru versiunea clientului și cheia API. Credențialele CORS sunt incluse pentru a trimite cookie-uri first-party.
Serverul primește payload-ul criptat și îl procesează prin mai multe subsisteme:
Serverul decodează plicul XOR, decomprimă dacă este necesar și parsează datele JSON ale semnalelor. Codul de stare și valoarea fiecărui semnal sunt extrase și validate.
ID-ul de vizitator este calculat folosind o abordare de hashing pe niveluri (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 identityFiecare nivel extrage semnalele care îi sunt atribuite, construiește un șir canonic și îl aplică hash cu MurmurHash3-x64-128. Cele trei hash-uri de nivel sunt concatenate și codate în base62 pentru a produce ID-ul final de vizitator.
Scorul de încredere (de la 0.0 la 1.0) indică cât de sigur este sistemul că acest vizitator a fost identificat corect:
_vid_t se potrivește cu un vizitator cunoscut, încrederea este maximă.Motorul de detecție a boților rulează mai mulți detectori și adună rezultatele lor ponderate într-un bot score; un semnal de tip hard-fail impune singur verdictul de bot. Valoarea publică bot.score este o scală 0..100, iar verdictul ajunge la tine ca bot.result. Pragurile exacte nu sunt publicate: un prag care poate fi citit este un prag la care te poți ajusta. Printre detectorii care contribuie se numără:
Detectorii de instrumentare (Frida), de root/jailbreak și de aplicații clonate există în platformă, dar sloturile lor de intrare sunt exclusiv native — agentul de browser nu le colectează, așa că nu intră într-un verdict pe web. Vezi Detectarea boților pentru ce este pe deplin activ pe web.
Semnalele de îmbogățire pe partea de server sunt calculate din datele brute ale semnalelor și din IP intelligence. Acestea includ detecția VPN/proxy/Tor, geolocalizarea IP, analiza tampering-ului browserului și suspect scoring.
Subsistemul IP intelligence oferă:
Serverul returnează un răspuns JSON care conține:
{ "visitorId": "X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y", "bot": { "detected": false, "confidence": 2, "reasons": [] }}Acesta este rezultatul la care se rezolvă tracio.getResult() în browser. Evenimentul
complet și îmbogățit — inclusiv bot_result-ul canonic
(human / bot / uncertain), geolocalizarea și smart signals — este
livrat pe partea de server prin webhooks, poate fi citit prin
Data API și este afișat în dashboard.
Clientul stochează un token de vizitator atât într-un cookie first-party (expirare la 365 de zile, SameSite=Lax), cât și în localStorage pentru persistență între sesiuni.
| Pas | Locație | Descriere |
|---|---|---|
| 1 | Browser | Inițializarea agentului, crearea iframe-ului partajat |
| 2 | Browser | Colectarea a 300+ semnale (paralel, multifazic) |
| 3 | Browser | Criptarea și comprimarea payload-ului |
| 4 | Rețea | POST către server |
| 5 | Server | Decriptare, extracția semnalelor, calculul ID-ului de vizitator |
| 6 | Server | Rularea bot detection și smart signals |
| 7 | Server | Construirea răspunsului |
| 8 | Rețea | Returnarea răspunsului JSON |
| 9 | Browser | Stocarea cookie-ului de vizitator |
Round-trip total: milisecunde. Cea mai mare parte o ocupă colectarea semnalelor — salturile de rețea și munca de pe server sunt partea mai mică — iar durata depinde de dispozitivul și conexiunea vizitatorului. Nimic din toate acestea nu blochează randarea paginii: agentul se încarcă asincron, iar fiecare verificare care poate dura este limitată de propriul timeout.