TRACIO는 클라이언트-서버 식별 시스템입니다. 클라이언트는 브라우저 신호를 수집하여 서버로 전송하고, 서버는 안정적인 방문자 식별자를 계산하고, 탐지 알고리즘을 실행하며, 보강된 결과를 반환합니다. 이 섹션에서는 파이프라인의 각 단계를 설명합니다.
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()가 호출되면 클라이언트는 계층(tier)으로 구성된 130개 이상의 개별 브라우저 신호를 수집합니다. 수집은 성능을 위해 Web Worker와 공유 iframe을 사용하는 다단계 파이프라인을 이용합니다.
| 카테고리 | 신호 개수 | 예시 |
|---|---|---|
| Canvas & WebGL | 9 | Canvas 지문, WebGL 렌더러, WebGL 파라미터, WebGPU |
| Audio | 3 | AudioContext 지문, 기본 지연 시간, DRM 타이밍 |
| 글꼴 & 렌더링 | 10 | 글꼴 탐지, 글꼴 환경설정, MathML, 이모지 렌더링 |
| Navigator & 플랫폼 | 25 | User-Agent, 언어, 화면, 하드웨어 동시성, 시간대 |
| 스토리지 & 쿠키 | 10 | localStorage, sessionStorage, 쿠키, 스토리지 할당량 |
| CSS & 미디어 쿼리 | 10 | 색상 구성표, HDR, 모션 감소, 강제 색상 |
| 네트워크 & WebRTC | 3 | TURN 프로브, 연결 RTT, 앱 버전 |
| Bot Detection | 15 | Webdriver 플래그, 자동화 프레임워크, eval 길이 |
| Tamper Detection | 8 | 속성 getter 인트로스펙션, 프로토타입 체인, 네이티브 함수 무결성 |
| Custom Extensions | 14 | 수학 지문, 아키텍처 탐지, WASM 기능 |
수집 파이프라인은 메인 스레드 차단을 최소화하기 위해 네 단계로 실행됩니다:
1단계(즉시): 수집이 빠른 고우선순위 신호(navigator 속성, 화면, 시간대). TURN 프로브는 동시에 실행되므로 여기서 함께 시작됩니다.
2단계(Idle Callback): 유휴 시간의 이점을 얻는 동기 신호(CSS 미디어 쿼리, 스토리지 프로브, 쿠키 테스트).
3단계(비동기): 비동기 API 또는 렌더링이 필요한 신호(canvas, WebGL, 오디오 지문, 글꼴 탐지, 이모지 렌더링).
Web Worker: 전용 스레드에서의 격리된 신호 수집(WASM 기능 탐지, doNotTrack).
공유된 숨김 iframe은 한 번만 생성되어 여러 수집기(이모지, MathML, 시스템 색상, 글꼴, 화면 프레임)에서 재사용되며, 이를 통해 신호마다 별도의 iframe을 생성하는 오버헤드를 방지합니다.
모든 신호는 일관된 구조를 따릅니다:
interface Signal<T> { s: number // Status code v: T // Value (when successful)}상태 코드:
| Code | 의미 |
|---|---|
0 | 성공 |
-1 | 사용 불가(속성이 undefined) |
-2 | 보조 검사 실패 |
-3 | 예기치 않은 동작 |
-4 | 타임아웃 |
-5 | 비활성화됨 |
-6 | CSP에 의해 차단됨 |
-7 | 보안 오류 |
수집된 신호는 JSON으로 직렬화된 다음, 전송 전에 암호화 및 압축됩니다:
JSON 직렬화: 모든 신호 값은 신호를 키로 하는 JSON 객체에 담기며, 여기에 메타데이터 필드(API 키를 위한 c, 태그를 위한 t, 연결 ID를 위한 lid)가 추가됩니다.
압축: 페이로드가 1024바이트를 초과하면 CompressionStream("deflate-raw")을 사용하여 압축됩니다.
XOR 암호화: 페이로드는 암호화 봉투로 감싸집니다:
Base64 인코딩: 암호화된 페이로드는 Base64url로 인코딩되어 POST 본문으로 전송됩니다.
요청은 클라이언트 버전과 API 키에 대한 쿼리 파라미터와 함께 ingress 엔드포인트로 전송됩니다. 퍼스트파티 쿠키를 보내기 위해 CORS 자격 증명이 포함됩니다.
서버는 암호화된 페이로드를 수신하여 여러 하위 시스템을 통해 처리합니다:
서버는 XOR 봉투를 디코딩하고, 필요 시 압축을 해제한 다음, JSON 신호 데이터를 파싱합니다. 각 신호의 상태 코드와 값이 추출되어 검증됩니다.
방문자 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각 계층은 지정된 신호를 추출하고, 정규 문자열을 구성한 후, MurmurHash3-x64-128로 해싱합니다. 세 개의 계층 해시는 연결된 후 base62로 인코딩되어 최종 방문자 ID를 생성합니다.
신뢰도 점수(0.0~1.0)는 이 방문자가 올바르게 식별되었다고 시스템이 얼마나 확신하는지를 나타냅니다:
_vid_t 쿠키가 일치하면 신뢰도는 최대가 됩니다.봇 탐지 엔진은 여러 탐지기를 실행하며, 그 가중된 출력값이 결합되어 봇 점수를 산출합니다(임계값: bot ≥ 0.70, suspicious ≥ 0.30; hard-fail 신호는 봇 판정을 강제합니다). 기여하는 탐지기는 다음과 같습니다:
서버 측 보강 신호는 원시 신호 데이터와 IP 인텔리전스로부터 계산됩니다. 여기에는 VPN/프록시/Tor 탐지, IP 지오로케이션, 브라우저 변조 분석, 의심 점수 산정이 포함됩니다.
IP 인텔리전스 하위 시스템은 다음을 제공합니다:
서버는 다음을 포함하는 JSON 응답을 반환합니다:
{ "visitorId": "X7fh2Hg9LkMn3pQr", "bot": { "detected": false, "confidence": 2, "reasons": [] }}이것이 브라우저에서 tracio.getResult()가 resolve하는 결과입니다. 정규 bot_result(human / bot / uncertain), 지오로케이션, 스마트 신호를 포함한 전체 보강 이벤트는 webhooks를 통해 서버 측으로 전달되고 대시보드에 표시됩니다.
클라이언트는 세션 간 지속성을 위해 방문자 토큰을 퍼스트파티 쿠키(365일 만료, SameSite=Lax)와 localStorage 양쪽에 저장합니다.
| 단계 | 위치 | 소요 시간 | 설명 |
|---|---|---|---|
| 1 | Browser | ~5ms | 에이전트 초기화, 공유 iframe 생성 |
| 2 | Browser | ~50-150ms | 130개 이상의 신호 수집(병렬, 다단계) |
| 3 | Browser | ~5ms | 페이로드 암호화 및 압축 |
| 4 | Network | ~10-50ms | 서버로 POST |
| 5 | Server | ~5-20ms | 복호화, 신호 추출, 방문자 ID 계산 |
| 6 | Server | ~5-15ms | 봇 탐지 및 스마트 신호 실행 |
| 7 | Server | ~5ms | 응답 구성 |
| 8 | Network | ~10-50ms | JSON 응답 반환 |
| 9 | Browser | ~1ms | 방문자 쿠키 저장 |
전체 왕복 시간: 네트워크 조건과 브라우저 기능에 따라 일반적으로 80~300ms입니다.