TRACIO adalah sistem identifikasi client-server. Klien mengumpulkan sinyal browser dan mengirimkannya ke server, yang menghitung identifikator pengunjung yang stabil, menjalankan algoritma deteksi, dan mengembalikan hasil yang telah diperkaya. Bagian ini menjelaskan setiap tahap dari pipeline.
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)Ketika tracio.getResult() dipanggil, klien mengumpulkan 300+ sinyal browser berbeda yang diorganisasi ke dalam beberapa tier. Pengumpulan menggunakan pipeline multi-fase dengan Web Worker dan iframe bersama untuk performa.
Agen ini membawa 300+ sinyal dalam 15 kategori:
| Kategori | Sinyal | Kategori | Sinyal |
|---|---|---|---|
| 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 mencakup WebGL dan WebGPU selain rendering 2D; Tamper menjadi kategori terbesar karena mengenali lingkungan yang telah dimodifikasi menuntut lebih banyak pemeriksaan daripada sekadar membaca lingkungan yang utuh.
Pipeline pengumpulan berjalan dalam empat tahap untuk meminimalkan pemblokiran main thread:
Tahap 1 (Immediate): Sinyal prioritas tinggi yang cepat dikumpulkan (properti navigator, layar, zona waktu). TURN probe juga dimulai di sini karena berjalan secara bersamaan.
Tahap 2 (Idle Callback): Sinyal sinkron yang diuntungkan oleh periode idle (CSS media query, storage probe, tes cookie).
Tahap 3 (Async): Sinyal yang memerlukan API asinkron atau rendering (canvas, WebGL, audio fingerprint, deteksi font, rendering emoji).
Web Worker: Pengumpulan sinyal terisolasi dalam thread khusus (deteksi fitur WASM, doNotTrack).
Sebuah iframe tersembunyi bersama dibuat sekali dan digunakan kembali oleh beberapa collector (emoji, MathML, warna sistem, font, screen frame) untuk menghindari overhead pembuatan iframe terpisah per sinyal.
Setiap sinyal mengikuti struktur yang konsisten:
interface Signal<T> { s: number // Status code v: T // Value (when successful)}Status code:
| Code | Arti |
|---|---|
0 | Sukses |
-1 | Tidak tersedia (properti undefined) |
-2 | Pemeriksaan sekunder gagal |
-3 | Perilaku tak terduga |
-4 | Timeout |
-5 | Dinonaktifkan |
-6 | Diblokir CSP |
-7 | Kesalahan keamanan |
Sinyal yang dikumpulkan diserialisasi ke JSON, lalu dienkripsi dan dikompresi sebelum transmisi:
Serialisasi JSON: Semua nilai sinyal dikemas ke dalam objek JSON yang dikunci berdasarkan sinyal, ditambah field metadata (c untuk API key, t untuk tag, lid untuk linked ID).
Kompresi: Jika payload melebihi 1024 byte, payload dikompresi menggunakan CompressionStream("deflate-raw").
Enkripsi XOR: Payload dibungkus dalam envelope enkripsi:
Encoding Base64: Payload terenkripsi di-encode dengan Base64url dan dikirim sebagai body POST.
Permintaan dikirim ke ingress endpoint dengan query parameter untuk versi klien dan API key. Credential CORS disertakan untuk mengirim cookie first-party.
Server menerima payload terenkripsi dan memprosesnya melalui beberapa subsistem:
Server men-decode envelope XOR, mendekompresi jika diperlukan, dan mem-parse data sinyal JSON. Status code dan nilai dari setiap sinyal diekstrak dan divalidasi.
Visitor ID dihitung menggunakan pendekatan 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 identitySetiap tier mengekstrak sinyal yang ditugaskan padanya, membangun string kanonik, dan meng-hash-nya dengan MurmurHash3-x64-128. Ketiga hash tier digabungkan dan di-encode dalam base62 untuk menghasilkan visitor ID final.
Skor confidence (0.0 hingga 1.0) menunjukkan seberapa yakin sistem bahwa pengunjung ini telah teridentifikasi dengan benar:
_vid_t cocok dengan pengunjung yang sudah dikenal, confidence bernilai maksimal.Engine deteksi bot menjalankan beberapa detektor dan menggabungkan keluaran tertimbangnya menjadi skor bot; sinyal hard-fail dengan sendirinya menetapkan verdict bot. Nilai publik bot.score berada pada skala 0..100 dan verdict sampai kepada Anda sebagai bot.result. Ambang batas persisnya tidak dipublikasikan — ambang yang bisa dibaca adalah ambang yang bisa disiasati. Detektor yang berkontribusi meliputi:
Detektor instrumentasi (Frida), root/jailbreak, dan aplikasi kloning memang ada di platform, tetapi slot masukannya khusus native — agen browser tidak mengumpulkannya, sehingga keduanya tidak ikut menentukan verdict di web. Lihat Deteksi Bot untuk apa saja yang sepenuhnya aktif di web.
Sinyal pengayaan di sisi server dihitung dari data sinyal mentah dan IP intelligence. Ini mencakup deteksi VPN/proxy/Tor, geolokasi IP, analisis tampering browser, dan penilaian suspect.
Subsistem IP intelligence menyediakan:
Server mengembalikan respons JSON yang berisi:
{ "visitorId": "X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y", "bot": { "detected": false, "confidence": 2, "reasons": [] }}Ini adalah hasil yang di-resolve oleh tracio.getResult() di browser. Event
lengkap yang telah diperkaya — termasuk bot_result kanonik
(human / bot / uncertain), geolokasi, dan smart signal — dikirim
di sisi server melalui webhook, dapat dibaca lewat
Data API, dan ditampilkan di dashboard.
Klien menyimpan token pengunjung baik dalam cookie first-party (masa berlaku 365 hari, SameSite=Lax) maupun localStorage untuk persistensi lintas sesi.
| Langkah | Lokasi | Deskripsi |
|---|---|---|
| 1 | Browser | Inisialisasi agen, buat iframe bersama |
| 2 | Browser | Kumpulkan 300+ sinyal (paralel, multi-fase) |
| 3 | Browser | Enkripsi dan kompresi payload |
| 4 | Jaringan | POST ke server |
| 5 | Server | Dekripsi, ekstrak sinyal, hitung visitor ID |
| 6 | Server | Jalankan bot detection dan smart signal |
| 7 | Server | Bangun respons |
| 8 | Jaringan | Kembalikan respons JSON |
| 9 | Browser | Simpan cookie pengunjung |
Total round-trip: hitungan milidetik. Porsi terbesarnya adalah pengumpulan sinyal — perjalanan jaringan dan pekerjaan di sisi server adalah bagian yang lebih kecil — dan lamanya bergantung pada perangkat serta koneksi pengunjung. Tidak ada satu pun dari ini yang memblokir rendering halaman: agen dimuat secara asinkron dan setiap pemeriksaan yang berpotensi lambat dibatasi oleh timeout-nya sendiri.