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 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)Când este apelat tracio.getResult(), clientul colectează peste 130 de semnale distincte din browser, organizate pe niveluri (tiers). Colectarea folosește un pipeline multifazic cu Web Workers și iframe-uri partajate pentru performanță.
| Categorie | Număr de semnale | Exemple |
|---|---|---|
| Canvas & WebGL | 9 | Canvas fingerprint, WebGL renderer, parametri WebGL, WebGPU |
| Audio | 3 | AudioContext fingerprint, base latency, DRM timing |
| Fonturi & Rendering | 10 | Detecția fonturilor, preferințe de fonturi, MathML, randare emoji |
| Navigator & Platformă | 25 | User-Agent, limbi, screen, hardware concurrency, fus orar |
| Storage & Cookie-uri | 10 | localStorage, sessionStorage, cookie-uri, cotă de storage |
| CSS & Media Queries | 10 | Schema de culori, HDR, reduced motion, forced colors |
| Rețea & WebRTC | 3 | Sondă TURN, RTT conexiune, versiune aplicație |
| Bot Detection | 15 | Flag webdriver, framework-uri de automatizare, eval length |
| Tamper Detection | 8 | Introspecția getterilor de proprietăți, lanțuri de prototip, integritatea funcțiilor native |
| Custom Extensions | 14 | Math fingerprint, detecția arhitecturii, caracteristici WASM |
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, încrederea este maximă.Motorul de detecție a boților rulează mai mulți detectori ale căror rezultate ponderate sunt combinate într-un bot score (praguri: bot ≥ 0.70, suspicious ≥ 0.30; un semnal de tip hard-fail forțează un verdict de bot). Printre detectorii care contribuie se numără:
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": "X7fh2Hg9LkMn3pQr", "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 și 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 | Durată | Descriere |
|---|---|---|---|
| 1 | Browser | ~5ms | Inițializarea agentului, crearea iframe-ului partajat |
| 2 | Browser | ~50-150ms | Colectarea a 130+ semnale (paralel, multifazic) |
| 3 | Browser | ~5ms | Criptarea și comprimarea payload-ului |
| 4 | Rețea | ~10-50ms | POST către server |
| 5 | Server | ~5-20ms | Decriptare, extracția semnalelor, calculul ID-ului de vizitator |
| 6 | Server | ~5-15ms | Rularea bot detection și smart signals |
| 7 | Server | ~5ms | Construirea răspunsului |
| 8 | Rețea | ~10-50ms | Returnarea răspunsului JSON |
| 9 | Browser | ~1ms | Stocarea cookie-ului de vizitator |
Round-trip total: De obicei 80-300ms, în funcție de condițiile de rețea și de capacitățile browserului.