TRACIO เป็นระบบระบุตัวตนแบบ client-server ไคลเอนต์จะเก็บสัญญาณของเบราว์เซอร์แล้วส่งไปยังเซิร์ฟเวอร์ ซึ่งจะคำนวณตัวระบุผู้เยี่ยมชมที่เสถียร รันอัลกอริทึมการตรวจจับ และส่งผลลัพธ์ที่ถูกเสริมข้อมูลกลับมา ส่วนนี้จะอธิบายแต่ละขั้นตอนของ pipeline
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)เมื่อมีการเรียก tracio.getResult() ไคลเอนต์จะเก็บสัญญาณของเบราว์เซอร์ที่แตกต่างกันมากกว่า 130 สัญญาณ ซึ่งจัดระเบียบไว้เป็น tier การเก็บใช้ pipeline แบบหลายเฟสร่วมกับ Web Worker และ iframe ที่ใช้ร่วมกันเพื่อประสิทธิภาพ
| Category | Signal Count | Examples |
|---|---|---|
| Canvas & WebGL | 9 | Canvas fingerprint, WebGL renderer, WebGL parameters, WebGPU |
| Audio | 3 | AudioContext fingerprint, base latency, DRM timing |
| Fonts & Rendering | 10 | Font detection, font preferences, MathML, emoji rendering |
| Navigator & Platform | 25 | User-Agent, languages, screen, hardware concurrency, timezone |
| Storage & Cookies | 10 | localStorage, sessionStorage, cookies, storage quota |
| CSS & Media Queries | 10 | Color scheme, HDR, reduced motion, forced colors |
| Network & WebRTC | 3 | TURN probe, connection RTT, app version |
| Bot Detection | 15 | Webdriver flag, automation frameworks, eval length |
| Tamper Detection | 8 | Property getter introspection, prototype chains, native function integrity |
| Custom Extensions | 14 | Math fingerprint, architecture detection, WASM features |
Pipeline การเก็บสัญญาณทำงานเป็นสี่ขั้นตอนเพื่อลดการบล็อก main thread ให้น้อยที่สุด:
ขั้นตอนที่ 1 (Immediate): สัญญาณที่มีความสำคัญสูงและเก็บได้รวดเร็ว (คุณสมบัติของ navigator, screen, timezone) TURN probe ก็เริ่มทำงานที่นี่เช่นกันเพราะรันแบบคู่ขนาน
ขั้นตอนที่ 2 (Idle Callback): สัญญาณแบบ synchronous ที่ได้ประโยชน์จากช่วงที่ว่าง (CSS media query, storage probe, cookie test)
ขั้นตอนที่ 3 (Async): สัญญาณที่ต้องใช้ API แบบ asynchronous หรือการเรนเดอร์ (canvas, WebGL, audio fingerprint, การตรวจจับฟอนต์, emoji rendering)
Web Worker: การเก็บสัญญาณแบบแยกอิสระใน thread เฉพาะ (การตรวจจับฟีเจอร์ WASM, doNotTrack)
iframe ที่ซ่อนไว้และใช้ร่วมกันจะถูกสร้างขึ้นเพียงครั้งเดียวและนำกลับมาใช้ซ้ำโดย collector หลายตัว (emoji, MathML, สีของระบบ, ฟอนต์, screen frame) เพื่อหลีกเลี่ยง overhead ของการสร้าง iframe แยกต่อสัญญาณ
สัญญาณทุกตัวมีโครงสร้างที่สอดคล้องกัน:
interface Signal<T> { s: number // Status code v: T // Value (when successful)}Status code:
| Code | Meaning |
|---|---|
0 | Success |
-1 | Not available (property undefined) |
-2 | Secondary check failed |
-3 | Unexpected behavior |
-4 | Timeout |
-5 | Disabled |
-6 | CSP blocked |
-7 | Security error |
สัญญาณที่เก็บได้จะถูก serialize เป็น JSON จากนั้นเข้ารหัสและบีบอัดก่อนการส่ง:
JSON serialization: ค่าของสัญญาณทั้งหมดจะถูกแพ็กลงในออบเจ็กต์ JSON โดยใช้สัญญาณเป็น key พร้อมกับฟิลด์ metadata (c สำหรับ API key, t สำหรับ tag, lid สำหรับ linked ID)
การบีบอัด: หาก payload มีขนาดเกิน 1024 ไบต์ จะถูกบีบอัดด้วย CompressionStream("deflate-raw")
XOR Encryption: payload จะถูกห่อหุ้มไว้ในซองการเข้ารหัส:
Base64 encoding: payload ที่เข้ารหัสแล้วจะถูกเข้ารหัสแบบ Base64url และส่งเป็น POST body
คำขอจะถูกส่งไปยัง ingress endpoint พร้อม query parameter สำหรับเวอร์ชันของไคลเอนต์และ API key โดยมีการรวม CORS credentials ไว้ด้วยเพื่อส่ง first-party cookie
เซิร์ฟเวอร์รับ payload ที่เข้ารหัสไว้และประมวลผลผ่านหลาย subsystem:
เซิร์ฟเวอร์ถอดรหัสซอง XOR คลายการบีบอัดเมื่อจำเป็น และ parse ข้อมูลสัญญาณ JSON status code และค่าของสัญญาณแต่ละตัวจะถูกสกัดออกมาและตรวจสอบความถูกต้อง
Visitor ID คำนวณโดยใช้แนวทาง 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 identityแต่ละ tier จะสกัดสัญญาณที่กำหนดไว้ สร้าง string แบบ canonical แล้ว hash ด้วย MurmurHash3-x64-128 hash ของทั้งสาม tier จะถูกนำมาต่อกันและเข้ารหัสเป็น base62 เพื่อสร้าง visitor ID สุดท้าย
Confidence score (0.0 ถึง 1.0) บ่งบอกว่าระบบมั่นใจแค่ไหนว่าผู้เยี่ยมชมรายนี้ถูกระบุตัวตนอย่างถูกต้อง:
_vid_t ที่เข้ารหัสไว้ตรงกัน ค่า confidence จะสูงสุดเอนจิน bot detection รัน detector หลายตัวซึ่งผลลัพธ์แบบถ่วงน้ำหนักจะถูกรวมเข้าเป็น bot score (threshold: bot ≥ 0.70, suspicious ≥ 0.30; สัญญาณ hard-fail จะบังคับให้ผลตัดสินเป็น bot) detector ที่มีส่วนร่วมได้แก่:
สัญญาณเสริมข้อมูลฝั่งเซิร์ฟเวอร์คำนวณจากข้อมูลสัญญาณดิบและ IP intelligence ซึ่งรวมถึงการตรวจจับ VPN/proxy/Tor, การระบุตำแหน่งทางภูมิศาสตร์ของ IP, การวิเคราะห์การดัดแปลงเบราว์เซอร์ และ suspect scoring
Subsystem IP intelligence ให้บริการ:
เซิร์ฟเวอร์ส่ง JSON response กลับมาโดยมีเนื้อหา:
{ "visitorId": "X7fh2Hg9LkMn3pQr", "bot": { "detected": false, "confidence": 2, "reasons": [] }}นี่คือผลลัพธ์ที่ tracio.getResult() resolve ออกมาในเบราว์เซอร์ ส่วน
event ฉบับเต็มที่ถูกเสริมข้อมูล — รวมถึง bot_result แบบ canonical
(human / bot / uncertain), geolocation และ smart signal — จะถูก
ส่งฝั่งเซิร์ฟเวอร์ผ่าน webhook และแสดงใน
dashboard
ไคลเอนต์จัดเก็บ visitor token ทั้งใน first-party cookie (หมดอายุ 365 วัน, SameSite=Lax) และใน localStorage เพื่อความคงอยู่ข้ามเซสชัน
| Step | Location | Duration | Description |
|---|---|---|---|
| 1 | Browser | ~5ms | Initialize agent, create shared iframe |
| 2 | Browser | ~50-150ms | Collect 130+ signals (parallel, multi-phase) |
| 3 | Browser | ~5ms | Encrypt and compress payload |
| 4 | Network | ~10-50ms | POST to server |
| 5 | Server | ~5-20ms | Decrypt, extract signals, compute visitor ID |
| 6 | Server | ~5-15ms | Run bot detection and smart signals |
| 7 | Server | ~5ms | Build response |
| 8 | Network | ~10-50ms | Return JSON response |
| 9 | Browser | ~1ms | Store visitor cookie |
Round-trip ทั้งหมด: โดยทั่วไป 80-300ms ขึ้นอยู่กับสภาพเครือข่ายและความสามารถของเบราว์เซอร์