TRACIO의 봇 탐지는 브라우저 에이전트의 클라이언트 측 수집과 서버 측 분석이라는 2계층 아키텍처를 사용해 자동화된 브라우저, 헤드리스 도구, 스크립트 기반 공격을 식별합니다. 주요 자동화 프레임워크, 헤드리스 브라우저, AI 브라우징 에이전트, 안티디텍트 브라우저를 거의 제로에 가까운 오탐률로 다루면서, 정당한 검색 엔진 크롤러는 자동으로 허용 목록에 등록합니다.
브라우저 에이전트는 광범위한 검사를 수행하고 그 결과를 보고합니다. 서버에서는 이
결과들이 가중치를 거쳐 봇 점수가 되고, 점수는 판정으로 매핑됩니다. 소수의 명백한
지표는 그 자체만으로 결정적이며, 나머지 결과와 무관하게 bot 판정을 강제합니다.
어떤 검사가 실행되는지, 어떻게 가중되는지, 임계값이 어디에 있는지는 어떤 요금제에서도 공개되지 않습니다. 이를 문서화하는 것은 보호를 통과하려면 무엇을 바꿔야 하는지 봇 운영자에게 정확히 알려주는 일입니다. 대신 제공되는 것은 판정, 봇 유형 레이블, 그리고 Business 이상에서는 결정의 배경이 된 관찰의 분류를 알려주는 이유 코드입니다.
모든 식별에는 봇 판정이 함께합니다. 웹훅 페이로드에서는
bot.result로, 클라이언트 SDK에서는 result.bot으로 전달됩니다.
| 결과 | 설명 |
|---|---|
human | 자동화 징후가 발견되지 않았습니다. 검증된 검색 엔진 크롤러도 human으로 해석됩니다. |
bot | 자동화 또는 스크립트 기반 접근이 탐지되었습니다. bot.type 레이블이 함께 붙습니다. |
uncertain | 혼재되었거나 약한 신호 — 명확히 사람도, 명확히 자동화도 아닙니다. |
이는 대시보드와 웹훅 페이로드 전반에서 사용되는 비즈니스 필드 decision.action
(real, fake, suspicious)에 매핑됩니다.
판정에는 bot.score가 함께 옵니다. 웹훅 페이로드 버전 2에서는 0..100 소수이며,
해당 방문에 대해 대시보드가 보여주는 것과 동일한 숫자입니다. (동결된 버전 1
스키마에서는 0..1 비율입니다. Webhooks를 참고하세요.)
bot.type은 결과가 bot일 때 존재합니다. 인식된 봇 또는 런타임의 이름이거나,
구체적인 검사 이름을 밝히면 탐지기 내부가 드러나는 경우에는 계열 레이블입니다:
bot.type | 의미 |
|---|---|
playwright, jsdom, electron | 명시된 자동화 런타임이 식별되었습니다 |
browser_use, claude_computer_use, skyvern, genspark, fellou | 명시된 AI 브라우징 에이전트가 식별되었습니다 |
automation | 자동화 도구. 구체적인 검사 이름은 밝히지 않습니다 |
headless | 사용자 인터페이스 없이 실행되는 브라우저 |
antidetect | 안티디텍트 / 핑거프린트 위조 빌드 |
extension | 자동화, 프록시 또는 VPN을 수행하는 브라우저 확장 |
privacy_browser | 프라이버시 강화 브라우저 빌드(예: Mullvad Browser) |
other | 탐지되었으나 공개된 어휘 범위 밖입니다 |
이 목록은 의도적으로 닫혀 있습니다: 내일 탐지기에 추가되는 검사는 내부 이름을
흘리는 대신 other로 나타납니다. bot.type은 분기용 레이블로 다루고, 검증해야 할
완전한 enum으로 취급하지 마세요 — 명명된 런타임은 시간이 지나며 추가됩니다.
Business 및 Enterprise 요금제에서는 웹훅 페이로드에 reasons 배열이 포함됩니다 —
최대 8개이며 중요도 순으로 정렬됩니다. 코드는 관찰의 분류를 알려줄 뿐, 그 뒤에
있는 검사를 알려주지는 않습니다:
| 코드 | 의미 |
|---|---|
automation_signature | 자동화 도구의 흔적 |
headless_browser | 사용자 인터페이스가 없는 브라우저 |
anonymous_browser | 평범해 보이도록 만든 프라이버시 강화 또는 안티디텍트 빌드 |
privacy_hardening | 공격적인 프라이버시 설정 |
behavior_anomaly | 사람답지 않은 상호작용 패턴 |
fingerprint_tampering | 서로 일치해야 할 값들이 일치하지 않습니다 |
environment_anomaly | 런타임 환경이 내부적으로 일관되지 않습니다 |
identity_mismatch | 선언된 정체성이 관찰된 내용과 어긋납니다 |
virtual_environment | 물리 하드웨어가 아닌 에뮬레이터 |
strong_automation_evidence | 명백한 봇 지표 — 그 자체로 결정적 |
detection_signal | 발화한 그 밖의 검사 |
severity는 high, medium, low 중 하나이며, 이번 방문에서 해당 분류가 판정에서
차지하는 비중이지 코드에 고정된 속성이 아닙니다. 같은 코드가 어떤 방문에서는
high로, 다른 방문에서는 low로 도착할 수 있으므로 상수로 캐시하지 마세요.
privacy_hardening은 특히 주의가 필요합니다: 회피 목적만큼이나 평범한 프라이버시
중시 방문자에게도 발화합니다. 단독으로 조치하지 말고 나머지와 함께 평가하세요.
virtual_environment는 에뮬레이터 탐지에서 나옵니다. 웹에는 "하이퍼바이저 위에서
실행 중"이라는 별도 판정이 없습니다. 브라우저가 볼 수 있는 단서(범용 소프트웨어
렌더러, 비정상적으로 적은 코어 수)는 GPU 드라이버가 없는 평범한 컴퓨터나 원격 데스크톱
세션에서도 그만큼 자주 나타나므로, 다시 의심해야 하는 판정으로 만들지 않습니다.
| 기능 | 제공 범위 |
|---|---|
| 자동화, 헤드리스, AI 에이전트 탐지 | 모든 요금제 |
| 검증된 크롤러 허용 목록 등록 | 모든 요금제 |
| 에뮬레이터 탐지 | 모든 요금제 |
안티디텍트 지표(bot.antidetectScore, 0..100) | Pro 이상 |
| 이유 코드, 행동 블록 | Business 이상 |
| DevTools 탐지 | Business 이상 |
안티디텍트 점수는 아직 보정 중입니다.
bot.antidetectScore는 직접 관찰하고 정책을 조정할 수 있도록 제공됩니다. 단독으로 차단하는 근거가 아니라 위험 판단을 위한 입력으로 다루세요.
모바일 전용 검사는 웹에서 효과가 없습니다. 루팅, 탈옥, 복제/듀얼 앱, Frida 탐지는 브라우저가 수집할 수 없는 네이티브 신호에 의존합니다. TRACIO는 브라우저 SDK만 제공하므로, 웹에서 완전히 동작하는 자동화, 헤드리스, AI 에이전트, 안티디텍트, 에뮬레이터, 행동 판정을 활용하세요.
알려진 정상 봇은 user-agent로 인식된 뒤 접속 IP를 기준으로 검증됩니다 — 해당 IP에 대한 리버스 DNS 조회, 그 결과로 나온 호스트명이 운영사 도메인에 속하는지 확인, 그리고 그것이 같은 IP로 되돌아 해석되는지 확인하는 정방향 조회입니다. 이는 크롤러 운영사가 스스로 공개한 검증 절차입니다.
| 크롤러 | 검증 대상 도메인 |
|---|---|
.googlebot.com, .google.com | |
| Bing | .search.msn.com |
| Apple | .applebot.apple.com |
| Yahoo | .crawl.yahoo.net |
| Yandex | .yandex.com, .yandex.net, .yandex.ru |
| DuckDuckGo | .duckduckgo.com |
검증된 크롤러는 human으로 해석됩니다. Googlebot을 자처하면서 IP가 명백히 다른
주체에 속하는 요청은 봇으로 분류됩니다 — 조회가 단순히 없거나 타임아웃된 것만으로는
위조의 증거로 보지 않습니다.
상호작용 동역학 — 포인터 이동, 키보드 리듬, 스크롤 — 은 어떤 사람인지가 아니라
사람이 실제로 있는지에 대한 증거로 판정에 반영됩니다. Business 이상에서는 그
집계 결과가 웹훅의 behavior 블록으로 전달됩니다:
{ "behavior": { "score": 87, "verdict": "human", "confidence": 0.92 }}score는 0..100(높을수록 사람에 가까움), verdict는 human, uncertain, bot
중 하나이며, confidence(0..1)는 그 판정이 얼마나 많은 증거에 기반하는지를
나타냅니다 — 포인터 이동이 두 번뿐인 짧은 방문은 판정이 결정적으로 보여도 여기서는
낮은 값이 됩니다.
이 블록은 해당 방문에서 실제로 행동 점수 계산이 수행된 경우에만 존재합니다. 블록이 없다는 것은 "데이터 없음"을 뜻하며, "의심스러운 점이 없음"을 뜻하지 않습니다 — 부재를 깨끗한 신호로 읽지 마세요.
클라이언트 SDK는 편의를 위한 불리언 result.bot.detected와 0..100 스케일의
confidence를 제공합니다:
const result = await tracio.getResult()
if (result.bot.detected) { console.warn(`Bot detected (confidence ${result.bot.confidence})`) showCaptcha() return}
await login(credentials)서버에서는 웹훅 전달을 기준으로 조치하세요. 봇 판정은 bot 객체 —
bot.result와 bot.type에 있습니다:
// `event` is the webhook delivery body (/docs/webhooks)app.post("/webhook/tracio", async (req, res) => { const event = req.body
if (event.bot?.result === "bot") { await db.blockedRequests.insert({ visitorId: event.visitorId, botType: event.bot.type, ip: event.ip, timestamp: new Date(), }) }
res.status(200).send("OK")})0과 빈 값은 페이로드에서 생략되므로, bot.type은 스키마에서 필수로 두지 말고 방어적으로
읽으세요.
TRACIO의 봇 탐지는 거의 제로에 가까운 오탐률을 목표로 설계되었지만, 경계 사례는 존재합니다:
| 시나리오 | 위험 | 완화 방안 |
|---|---|---|
navigator를 수정하는 브라우저 확장 | 낮음 | 다수 검사에 걸친 교차 검증이 단일 검사 발화를 막습니다 |
| 기업용 보안 소프트웨어 | 매우 낮음 | 헤드리스 분류에는 뒷받침하는 증거가 필요합니다 |
| 접근성 도구 | 없음 | 접근성 API는 봇 탐지에 반영되지 않습니다 |
| VPN/프록시 사용자 | 없음 | 네트워크 플래그는 봇 판정과 별도로 관리됩니다 |
오탐이 보인다면 bot.type(및 Business 이상에서는 reasons)을 확인해 어떤 분류의
관찰이 발화했는지 파악한 뒤 정책을 조정하세요. 흔한 원인은
문제 해결을 참고하세요.