Smart Signals는 브라우저 지문, IP 인텔리전스, 행동 분석으로부터 계산되는 서버 측 강화 신호입니다. 개인 식별 정보를 전혀 수집하지 않으면서 모든 방문자에 대한 깊이 있는 컨텍스트를 제공합니다.
Smart Signals — 강화된 결정, 위험, 네트워크, 봇 신호 — 는 두 가지 경로로 서버에 도달합니다. 웹훅으로 푸시되며(자세한 내용은 Webhooks 참고), Data API를 통해 필요할 때 읽을 수도 있습니다. 또한 대시보드에도 표시됩니다. 아래 예제들은 웹훅 페이로드 형태를 사용하며, API로 세션을 읽을 때도 동일한 필드가 제공됩니다.
한 번의 방문은 네트워크, 브라우저, 디바이스, 행동 분석에 걸친 35+ 스마트 신호로 해석됩니다. 아래 레퍼런스는 가장 자주 사용하게 될 신호들을 정리한 것으로, 다음이 포함됩니다:
| Signal | 설명 | Response | 플랫폼 |
|---|---|---|---|
| VPN Detection | IP 인텔리전스를 기반으로 VPN 사용을 표시 | network.vpn: boolean | Web |
| Proxy Detection | 데이터센터 및 레지덴셜 프록시 사용을 식별 | network.proxy: boolean | Web |
| Tor Detection | IP를 알려진 Tor 출구 노드와 대조 | network.tor: boolean | Web |
| Datacenter | 알려진 클라우드/호스팅 제공업체에 속한 IP를 표시 | network.datacenter: boolean | Web |
| IP Geolocation | IP 주소로부터 도시 단위 지오로케이션 + ISP 및 ASN | geo.{ country, city, timezone }, network.{ isp, asn } | Web |
| Signal | 설명 | Response | 사용 가능 범위 |
|---|---|---|---|
| Browser Tampering | 위조된 User-Agent, 변조된 navigator, 확장 프로그램 주입을 탐지 | { result: boolean, anomalyScore: number } | Web |
| Antidetect Browsers | CSS 및 속성 프로브를 통해 지문을 위조하는 브라우저 빌드에 점수를 매김 | bot.antidetectScore: number (0–100, Pro+) | Web |
| Privacy Settings | 프라이버시 중심 브라우저 구성(Tor Browser, Brave, Firefox ETP, Safari ITP) 탐지 | { result: boolean } | Web |
| Developer Tools | 브라우저 DevTools가 열려 있는지 탐지 | { result: boolean } | Web — Business & Enterprise |
| Incognito | Chromium, Firefox, Safari에서 시크릿 브라우징을 추론 | identification.incognito: boolean | Web |
| Signal | 설명 | 사용 가능 범위 |
|---|---|---|
| Emulator | GPU 렌더러 및 UA 마커를 통해 Android 에뮬레이터(BlueStacks, Genymotion, Nox, Android SDK) 탐지 | Web — 모든 플랜 |
네이티브 전용 탐지. 루팅, 탈옥, 복제/듀얼 앱, Frida 인스트루멘테이션 탐지는 네이티브 모바일 SDK만 수집할 수 있는 신호에 의존합니다. TRACIO는 브라우저 SDK를 제공하므로 이러한 탐지는 웹 에이전트에서 효과가 없습니다 — 대신 자동화, 헤드리스, 안티디텍트, 에뮬레이터, 행동 판정에 의존하세요.
| Signal | 설명 | Response | 플랫폼 |
|---|---|---|---|
| Bot Detection | 자동화 프레임워크 및 헤드리스 브라우저를 식별 | bot.result: "human"|"bot"|"uncertain", bot.type: string, bot.score: number | Web |
| Risk Score | 웹훅 decision 객체에 담긴 요청에 대한 집계 위험 | decision.riskScore: number, decision.suspectScore: number, decision.action: "real"|"fake"|"suspicious" | Web |
VPN, 프록시, Tor, 데이터센터 플래그는 상용 IP 인텔리전스 데이터베이스
(IP2Location / MaxMind)를 사용하여 방문자의 IP로부터 서버 측에서 해석됩니다.
공개 웹훅 페이로드는 결합된 결과를 network 객체의 불리언 값 — network.vpn,
network.proxy, network.tor, network.datacenter — 으로 노출하며, 메서드별
세부 분석이나 신뢰도 문자열은 제공하지 않습니다. 자세한 내용은
IP Intelligence를 참고하세요.
시크릿 브라우징은 Chromium, Firefox, Safari에서 추론되어 identification.incognito
필드로 전달됩니다. 이를 알려주는 브라우저 API는 존재하지 않으므로, 판정은 시크릿
창에서 스토리지가 어떻게 동작하는지에 대한 가중 투표로 도출됩니다. origin private
file system 오류, 스토리지 지속성, 플랫폼별 특성이 각각 판정에 기여합니다.
이는 확실한 사실이 아니라 확률적 신호입니다. 단독으로 조치의 근거가 되는 사실이
아니라 여러 입력 중 하나로 다루세요. 시크릿 창에서는 _vid_t 쿠키도 설정되지
않으므로 시크릿 방문은 신호만으로 식별되며, 그만큼 identification.confidence도
낮아집니다.
변조 탐지기는 자신의 신원을 잘못 표현하기 위해 브라우저를 변조한 방문자를 식별합니다:
navigator 속성을 변조하는 확장 프로그램을 탐지PluginArray.prototype 및 MimeType.prototype 체인을 검증Function.prototype.toString, Object.getOwnPropertyDescriptor 및 기타 핵심 함수가 Proxy로 대체되었는지 테스트anomalyScore(0.0–1.0)는 불일치 정도를 정량화합니다. 0.5를 초과하는 값은 심각한 변조를 나타냅니다.
웹훅 decision 객체는 요청에 대한 집계 위험을 담습니다:
decision.riskScore(정수 0–100), decision.suspectScore(숫자),
decision.action(권장 조치). 이 점수는 smart signal 출력을 집계하며, 아래
구간은 riskScore가 위험 수준에 어떻게 매핑되는지 설명합니다:
| 점수 범위 | 위험 수준 | 일반적인 지표 |
|---|---|---|
| 0-10 | 정상 | 깨끗한 신호, 알려진 방문자, 레지덴셜 IP |
| 11-30 | 낮음 | 사소한 불일치, 데이터센터 IP 또는 첫 방문 |
| 31-60 | 중간 | VPN 탐지, 브라우저 변조 또는 비정상적인 속도 |
| 61-80 | 높음 | 다수의 위험 신호, 프록시 + 변조, 높은 활동량 |
| 81-100 | 심각 | 봇 탐지, Tor 출구 노드 또는 심각한 이상 |
이 점수는 활성화된 smart-signal 출력 — 주로 IP 인텔리전스 (VPN/프록시/Tor/데이터센터), 봇 판정, 브라우저 변조 — 를 집계합니다. 확인된 사람의 상호작용(마우스/키보드)은 점수를 낮춥니다.
네 가지 프라이버시 중심 브라우저 구성이 탐지됩니다:
| Browser | 탐지 방법 | 임계값 |
|---|---|---|
| Tor Browser | Canvas 차단 + WebGL 차단 + UTC 시간대 + 제한된 폰트 + 반올림된 화면 크기 | 마커 3개+ |
| Brave | Brave UA 또는 navigator.brave 또는 Client Hints "Brave" 브랜드 | 마커 1개+ |
| Firefox ETP (strict) | Storage 분할 또는 canvas 차단(Firefox UA 필요) | 마커 1개+ |
| Safari ITP | 쿠키 차단 또는 IndexedDB 제한(Safari UA 필요) | 마커 1개+ |
Smart Signals는 웹훅 페이로드를 통해(전체 형태와 서명 검증은 Webhooks 참고), 그리고 Data API로 세션을 읽을 때 서버에 도달합니다. 아래 예제들은 웹훅 페이로드에서 필드를 직접 읽으며, 필드 이름은 두 경로 모두 동일합니다.
// `payload` is the webhook delivery body (/docs/webhooks)const score = payload.decision.riskScoreconst isVPN = payload.network.vpnconst isBot = payload.bot.result === "bot"
if (isBot) { return block("Automated access")}
if (score > 60) { return requireMFA()}
if (isVPN && score > 30) { return requireCaptcha()}
return allow()// `payload` is the webhook delivery body (/docs/webhooks)function computeFraudRisk(payload: WebhookPayload): string { let risk = "low"
if (payload.decision.riskScore > 60) risk = "high" else if (payload.decision.riskScore > 30) risk = "medium"
// Escalate when multiple network signals agree if (payload.network.vpn && payload.network.proxy) risk = "high" if (payload.network.tor) risk = "high" if (payload.bot.result === "bot") risk = "high"
return risk}