TRACIO의 봇 탐지 시스템은 클라이언트 측 신호 수집과 서버 측 분석이라는 2계층 아키텍처를 사용해 자동화된 브라우저, 헤드리스 도구, 스크립트 기반 공격을 식별합니다. 주요 자동화 프레임워크, 헤드리스 브라우저, AI 브라우징 에이전트, 안티디텍트 브라우저를 거의 제로에 가까운 오탐률로 탐지하는 동시에, 정당한 검색 엔진 크롤러는 자동으로 허용 목록에 등록합니다.
브라우저 에이전트는 서버 측 결정에 반영되는 다양한 봇 전용 신호와 교차 검증 신호를 수집합니다. 아래의 신호 ID는 예시일 뿐이며, 내부 ID는 안정적인 공개 계약이 아닙니다:
| Signal | Description |
|---|---|
s300 (webdriver) | navigator.webdriver 플래그 — 자동화 프레임워크가 true로 설정 |
s301 (eval length) | eval.toString().length — Chrome/Edge: 33, Firefox: 37. 다른 값은 계측을 의미합니다. |
s305 (bot composite) | window/document에서 14개의 자동화 프레임워크 아티팩트를 스캔 |
s97 (headless markers) | CDP 아티팩트, 알림 권한, 플러그인 수, 외부 크기 |
s157 (automation scan) | Selenium, Puppeteer, PhantomJS, Playwright 및 10개 이상에 대한 포괄적 스캔 |
s158 (iframe webdriver) | 숨겨진 iframe을 생성하고 그 안에서 navigator.webdriver를 읽습니다. 메인 프레임은 패치하지만 iframe은 놓치는 도구를 잡아냅니다. |
s159 (native function) | Function과 Object를 삭제하고, getter가 진짜 네이티브인지 테스트합니다. Proxy 기반 계측을 탐지합니다. |
s155 (window CRC32) | 주입된 자동화 전역 변수를 탐지하기 위해 모든 window 속성에 대한 CRC32 해시 스캔 |
s163 (devtools trap) | 콘솔 getter 트랩 — DevTools가 활성으로 열려 있는지 탐지 |
서버는 일련의 탐지기를 실행하며, 그 가중 출력이 결합되어 봇 점수가
됩니다. 이 점수는 임계값을 통해 판정에 매핑됩니다 — 0.70 이상이면 bot,
0.30 이상이면 suspicious, 그 외에는 human — 그리고 하드 페일 신호(예:
navigator.webdriver)는 즉시 bot 판정을 강제합니다. 봇 판정에는
자유 형식의 bot_type 레이블이 함께 붙습니다.
대표적인 탐지기와 그 효과:
| Detector | Effect |
|---|---|
| Webdriver flag | Hard-fail → bot (type webdriver) |
| Composite automation / framework scan | High weight → bot (type {framework}) |
| Headless markers | Weighted → bot (type headless) |
| Eval-length anomaly | Weighted → bot (type unknown) |
| Bad-bot UA pattern | Weighted → bot (type {label}) |
| Verified good bot (reverse DNS) | Allowlist → human |
| Behavioral (rate / entropy / interaction) | Weighted → bot (type rateBot) |
| VM (Enterprise) · Emulator · DevTools (Business+) | Weighted device/tamper signals |
요금제 및 제공 여부. DevTools 탐지는 Business 및 Enterprise에서 실행되고, VM 탐지는 Enterprise에서, 에뮬레이터 탐지는 모든 요금제에서 실행됩니다. 이 모든 기능은 웹 에이전트에서 작동합니다. 루트, 탈옥, 복제/듀얼 앱, Frida, 공장 초기화 탐지는 네이티브 모바일 신호에 의존하므로 웹 전용 배포에서는 효과가 없습니다 (개발 중). 웹에서 완전히 활성화되어 있는 자동화, 헤드리스, AI 에이전트, 안티디텍트, VM/에뮬레이터, 행동 기반 판정에 의존하십시오.
봇 탐지는 모든 이벤트에 bot_result 필드를 기록합니다(그리고 웹훅
페이로드에서는 bot.result).
bot_result는 세 가지 표준 값 중 하나입니다:
| Result | Description |
|---|---|
human | 자동화 지표가 발견되지 않음. 검증된 검색 엔진 크롤러도 human으로 해석됩니다. |
bot | 자동화 또는 스크립트 기반 접근이 탐지됨. 자유 형식의 bot_type 레이블이 함께 붙습니다. |
uncertain | 혼합되거나 약한 신호 — 명확히 사람도 아니고 명확히 자동화도 아님. |
이는 대시보드 전반에서 사용되는 비즈니스 decision 필드(real, fake,
suspicious)와 웹훅 페이로드의 bot.result에
매핑됩니다.
"bot"일 때)bot_type은 자유 형식의 문자열입니다. 아래 값들은 탐지기가 출력하는 것에 대한
예시일 뿐이며, 전체 열거형이 아닙니다:
| Type | Detection Method |
|---|---|
webdriver | navigator.webdriver가 true |
selenium | Selenium 전용 window/document 속성 탐지 |
puppeteer | Puppeteer/Chromium 헤드리스 지표 일치 |
playwright | Playwright 전용 마커 또는 UA 문자열 탐지 |
headless | 11개 중 2개 이상의 헤드리스 마커 발동 |
phantomjs | PhantomJS 전역 변수 탐지(callPhantom, _phantom) |
nightmare | NightmareJS 전역 변수 탐지 |
unknown | Eval 길이 이상 또는 기타 비특정 자동화 지표 |
rateBot | 행동 기반 속도 분석이 임계값을 초과함 |
가장 직접적인 탐지입니다. 모든 주요 자동화 프레임워크는 WebDriver 사양에 따라 navigator.webdriver = true를 설정합니다. 이는 메인 프레임만 패치하는 도구를 잡기 위해 메인 프레임(s300)과 숨겨진 iframe(s158) 양쪽에서 확인됩니다.
프레임워크 전용 아티팩트를 찾기 위해 window 및 document 속성을 포괄적으로 스캔합니다:
| Framework | Properties Detected |
|---|---|
| Selenium | _Selenium_IDE_Recorder, _selenium, calledSelenium, __selenium_evaluate, $cdc_* (ChromeDriver) |
| Puppeteer | domAutomation, domAutomationController, HeadlessChrome UA |
| Playwright | __playwright, automation-controlled flag |
| PhantomJS | callPhantom, _phantom |
| NightmareJS | __nightmare, nightmare |
| CefSharp | CefSharp |
| Awesomium | awesomium |
| WebDriverIO | wdioElectron |
| Cypress | __cypress window property |
스캔은 또한 Selenium이 주입한 헬퍼 전역 변수를 탐지하기 위해 정규식 패턴 /^([a-z]){3}_.*_(Array|Promise|Symbol)$/을 사용합니다.
11개의 마커가 평가되며, 분류 임계값은 2개 이상입니다:
| Marker | Signal | Condition |
|---|---|---|
| webdriver | s300 | = "true" |
| missing vendor flavors | s28 | window에 chrome/safari 객체 없음 |
| CDP headless chrome | s305 | headlessChrome = true |
| notification denied | s88 | 첫 방문 시 Notification.permission = "denied" |
| chrome no runtime | s89 | window.chrome은 존재하나 chrome.runtime이 없음 |
| single language | s90 | navigator.languages.length <= 1 |
| default screen 800x600 | s5 | 헤드리스 Chrome 기본 해상도 |
| HeadlessChrome UA | UA | User-Agent에 "HeadlessChrome" 포함 |
| zero outer dimensions | s97 | outerWidth = 0 및 outerHeight = 0 |
| WebGL SwiftShader | s70 | 렌더러에 "swiftshader" 포함(소프트웨어 GPU) |
| WebGL llvmpipe | s70 | 렌더러에 "llvmpipe" 포함(소프트웨어 GPU) |
알려진 정상 봇은 User-Agent 패턴으로 인식됩니다. 각각은 스푸핑을 방지하기 위해 리버스 DNS로 검증됩니다:
.googlebot.com)| Bot | Allowed Domains |
|---|---|
.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 |
어떤 요청이 Googlebot이라고 주장하지만 해당 IP의 리버스 DNS가 외부 도메인으로 해석되는 경우(단순히 누락되거나 시간 초과된 조회가 아니라, 확인된 PTR 불일치), 이는 bot(유형 spoofed:google)으로 분류됩니다.
엔트로피 점수를 사용한 속도 기반 탐지:
| Rate (req/min) | Entropy Threshold | Action |
|---|---|---|
| 120+ | < 0.1 | bot (type: rateBot) |
| 60-120 | < 0.3 | bot (type: rateBot) |
| 45-60 | < 0.1 | bot (type: rateBot) |
| < 45 | Any | Normal |
추가 규칙: 세션 경과 시간이 30초 이상일 때 마우스/키보드 이벤트가 없으면 해당 방문을 유형 noInteraction의 bot으로 분류합니다.
eval.toString().length는 엔진마다 일관된 값을 생성합니다:
다른 값은 eval 함수가 자동화 프레임워크에 의해 후킹되었음을 의미하며, 해당 방문을 유형 unknown의 bot으로 분류합니다.
클라이언트 SDK는 편의용 불리언 result.bot.detected를 제공합니다:
const result = await tracio.getResult()
if (result.bot.detected) { // Log and block console.warn(`Bot detected (confidence ${result.bot.confidence})`) showCaptcha() return}
// Proceed with loginawait 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")})TRACIO의 봇 탐지는 거의 제로에 가까운 오탐률을 목표로 설계되었습니다. 그러나 예외 사례가 발생할 수 있습니다:
| Scenario | Risk | Mitigation |
|---|---|---|
navigator를 수정하는 브라우저 확장 프로그램 | 낮음 | 다중 신호 교차 검증으로 단일 신호에 의한 발동을 방지 |
| 기업용 보안 소프트웨어 | 매우 낮음 | 헤드리스 탐지는 2개 이상의 마커를 요구 |
| 접근성 도구 | 없음 | 접근성 API는 어떤 탐지 신호도 발동하지 않음 |
| VPN/프록시 사용자 | 없음 | VPN 사용은 봇 탐지와 별도로 추적됨 |
오탐이 발생하면 bot.type 필드를 확인하여 어떤 탐지기가 발동했는지 파악하고, 그에 따라 정책을 조정하십시오.