TRACIO är ett identifieringssystem av klient-server-typ. Klienten samlar in webbläsarsignaler och skickar dem till servern, som beräknar en stabil besökaridentifierare, kör detekteringsalgoritmer och returnerar berikade resultat. Det här avsnittet förklarar varje steg i pipelinen.
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)När tracio.getResult() anropas samlar klienten in 130+ olika webbläsarsignaler organiserade i nivåer (tiers). Insamlingen använder en flerfasig pipeline med Web Workers och delade iframes för prestandan.
| Kategori | Antal signaler | Exempel |
|---|---|---|
| Canvas & WebGL | 9 | Canvas-fingeravtryck, WebGL-renderer, WebGL-parametrar, WebGPU |
| Audio | 3 | AudioContext-fingeravtryck, baslatens, DRM-timing |
| Typsnitt & rendering | 10 | Typsnittsdetektering, typsnittsinställningar, MathML, emoji-rendering |
| Navigator & plattform | 25 | User-Agent, språk, skärm, hardware concurrency, tidszon |
| Storage & cookies | 10 | localStorage, sessionStorage, cookies, lagringskvot |
| CSS & media queries | 10 | Färgschema, HDR, reduced motion, forced colors |
| Nätverk & WebRTC | 3 | TURN-probe, anslutnings-RTT, appversion |
| Bot Detection | 15 | Webdriver-flagga, automatiserings-frameworks, eval-length |
| Tamper Detection | 8 | Introspektion av property-getters, prototypkedjor, native-funktionsintegritet |
| Custom Extensions | 14 | Math-fingeravtryck, arkitekturdetektering, WASM-funktioner |
Insamlings-pipelinen körs i fyra steg för att minimera blockering av huvudtråden:
Steg 1 (Omedelbart): Högprioriterade signaler som är snabba att samla in (navigator-egenskaper, skärm, tidszon). TURN-proben startar också här eftersom den körs samtidigt.
Steg 2 (Idle Callback): Synkrona signaler som drar nytta av en inaktiv period (CSS media queries, storage-probes, cookie-tester).
Steg 3 (Async): Signaler som kräver asynkrona API:er eller rendering (canvas, WebGL, audio-fingeravtryck, typsnittsdetektering, emoji-rendering).
Web Worker: Isolerad signalinsamling i en dedikerad tråd (WASM-funktionsdetektering, doNotTrack).
En delad, dold iframe skapas en gång och återanvänds av flera collectors (emoji, MathML, systemfärger, typsnitt, skärmram) för att undvika omkostnaden med att skapa separata iframes per signal.
Varje signal följer en enhetlig struktur:
interface Signal<T> { s: number // Status code v: T // Value (when successful)}Statuskoder:
| Kod | Betydelse |
|---|---|
0 | Lyckades |
-1 | Inte tillgänglig (egenskap undefined) |
-2 | Sekundärkontroll misslyckades |
-3 | Oväntat beteende |
-4 | Timeout |
-5 | Inaktiverad |
-6 | Blockerad av CSP |
-7 | Säkerhetsfel |
Insamlade signaler serialiseras till JSON och krypteras sedan och komprimeras före överföring:
JSON-serialisering: Alla signalvärden packas in i ett JSON-objekt nycklat per signal, plus metadatafält (c för API-nyckel, t för tagg, lid för länkat ID).
Komprimering: Om nyttolasten överstiger 1024 byte komprimeras den med CompressionStream("deflate-raw").
XOR-kryptering: Nyttolasten lindas in i ett krypteringskuvert:
Base64-kodning: Den krypterade nyttolasten Base64url-kodas och skickas som POST-body.
Begäran skickas till ingress-endpointen med query-parametrar för klientversion och API-nyckel. CORS-credentials inkluderas för att skicka first-party-cookies.
Servern tar emot den krypterade nyttolasten och bearbetar den genom flera delsystem:
Servern avkodar XOR-kuvertet, dekomprimerar vid behov och parsar JSON-signaldatan. Varje signals statuskod och värde extraheras och valideras.
Besökar-ID:t beräknas med en metod för tiered hashing (nivåindelad hashning) (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 identityVarje nivå extraherar sina tilldelade signaler, bygger en kanonisk sträng och hashar den med MurmurHash3-x64-128. De tre nivåhasharna sammanfogas och kodas i base62 för att producera det slutliga besökar-ID:t.
Konfidensvärdet (0.0 till 1.0) anger hur säkert systemet är på att den här besökaren har identifierats korrekt:
_vid_t-cookien matchar är konfidensen maximal.Bot-detekteringsmotorn kör flera detektorer vars viktade utdata kombineras till ett bot-score (tröskelvärden: bot ≥ 0.70, suspicious ≥ 0.30; en hard-fail-signal tvingar fram ett bot-utfall). Bland de bidragande detektorerna finns:
Berikningssignaler på serversidan beräknas från de råa signaldata och IP intelligence. Dessa inkluderar VPN-/proxy-/Tor-detektering, IP-geolokalisering, analys av webbläsarmanipulering och suspect-scoring.
Delsystemet för IP intelligence tillhandahåller:
Servern returnerar ett JSON-svar som innehåller:
{ "visitorId": "X7fh2Hg9LkMn3pQr", "bot": { "detected": false, "confidence": 2, "reasons": [] }}Detta är resultatet som tracio.getResult() returnerar i webbläsaren. Den
fullständiga, berikade händelsen — inklusive det kanoniska bot_result
(human / bot / uncertain), geolokalisering och smart signals — levereras
på serversidan via webhooks och visas i
dashboarden.
Klienten lagrar en besökartoken både i en first-party-cookie (365 dagars giltighet, SameSite=Lax) och i localStorage för persistens över sessioner.
| Steg | Plats | Varaktighet | Beskrivning |
|---|---|---|---|
| 1 | Browser | ~5ms | Initiera agent, skapa delad iframe |
| 2 | Browser | ~50-150ms | Samla in 130+ signaler (parallellt, flerfasigt) |
| 3 | Browser | ~5ms | Kryptera och komprimera nyttolast |
| 4 | Nätverk | ~10-50ms | POST till servern |
| 5 | Server | ~5-20ms | Dekryptera, extrahera signaler, beräkna besökar-ID |
| 6 | Server | ~5-15ms | Kör bot detection och smart signals |
| 7 | Server | ~5ms | Bygg svar |
| 8 | Nätverk | ~10-50ms | Returnera JSON-svar |
| 9 | Browser | ~1ms | Lagra besökar-cookie |
Total round-trip: Vanligtvis 80-300ms beroende på nätverksförhållanden och webbläsarens kapacitet.