당신은 원시 HTTP에서 진짜 브라우저로 옮겨갔습니다. TLS 지문: 진짜 Chrome의 것. IP: 주거용. 그런데도 사이트는 알아챕니다. 2026년, 헤드리스 브라우저 탐지는 navigator.webdriver를 한참 넘어섰습니다 — 현 세대의 검사는 자동화 프로토콜 자체를 탐지하며, 대부분의 "stealth" 플러그인은 어제의 신호를 패치하면서 오늘의 신호를 요란하게 드러냅니다.
이 글은 사이트가 지금 실제로 무엇을 검사하는지를, 대체로 검사하는 순서대로, 그리고 각 계층에서 진짜 도움이 되는 것이 무엇인지 지도화합니다. 이는 JA3/JA4 TLS 지문(네트워크 계층)과 IP 평판 & ASN(주소 계층)으로 탐지 3부작을 완성합니다 — 이것은 브라우저 계층입니다.
navigator.webdriver — 자동화 하에서는 명세상 true여야 합니다. Playwright/Puppeteer stealth 설정은 이를 숨깁니다. Chrome의 --disable-blink-features=AutomationControlled는 이를 네이티브하게 처리합니다. 사이트가 여전히 검사하는 이유는 공짜이고 순진한 봇을 잡기 때문입니다.HeadlessChrome/. 진짜 Chrome 바이너리 경로를 사용하는 새 헤드리스 모드(headless=new)로 해결됩니다.navigator.plugins 0개, chrome.runtime 없음, 0×0 outerWidth. 구 헤드리스 모드는 이 모두에 실패했습니다. 새 헤드리스는 대부분 통과합니다.대상이 Tier 1만 검사한다면, headless=new를 사용한 현대 Playwright는 통과합니다. 진지한 대상은 수년 전에 넘어갔습니다.
Playwright와 Puppeteer는 Chrome DevTools Protocol을 통해 Chrome을 구동하며, CDP는 페이지 JavaScript가 관찰할 수 있는 런타임 부작용을 남깁니다:
// The classic CDP leak: serialization callbacks
const err = new Error();
Object.defineProperty(err, "stack", {
get() {
// This getter fires DURING console serialization -
// which only happens when DevTools/CDP is attached
window.__cdp_detected = true;
},
});
console.debug(err);
이것의 변종들 — console 직렬화 중 getter 부작용, Runtime.evaluate의 타이밍 이상, 패치된 네이티브 함수에 대한 toString()의 동작 — 은 모든 상용 안티봇 번들에 들어 있습니다. 결정적인 점: 이것은 헤드리스 모드가 아니라 프로토콜을 탐지합니다. 헤드, stealth 패치, 완벽하게 사람처럼 보이는 Chrome이라도 CDP를 통해 구동되면 여전히 실패합니다.
도움이 되는 것:
아티팩트를 넘어, 현대 시스템은 당신 브라우저의 이야기가 내부적으로 일관적인지를 검사합니다:
| 검사 | 봇 단서 |
|---|---|
| Canvas / WebGL 렌더 해시 | SwiftShader/llvmpipe 소프트웨어 렌더링 = 서버 GPU; 또는 1만 명의 "서로 다른 사용자"가 공유하는 해시 |
| 폰트 & 코덱 | Windows User-Agent 아래의 Linux 서버 폰트 세트 |
| 타임존 × 로케일 × IP geo | Intl은 UTC, IP는 텍사스, Accept-Language는 de-DE |
| 화면 지표 | 작업 표시줄 없는 1920×1080, devicePixelRatio 정확히 1, 창 크기 조정 안 됨 |
| 하드웨어 동시성 / 메모리 | 휴대폰이라 주장하는 페이지에 96코어 보고 |
| 행동 미세 신호 | 마우스 엔트로피 없음, 즉각적 폼 입력, 동일한 100px 단위 스크롤 |
여기서 DIY stealth는 죽습니다: 적용하는 모든 패치는 다른 모든 신호와 일치해야 합니다. Linux 컨테이너 위의 위조된 Windows UA는 폰트, GPU 문자열, TCP 지문을 동시에 모순시킵니다. 일관성이 완벽함을 이깁니다 — 정직한 헤드 Linux Chrome이 엉성하게 위조된 "Windows"보다 점수가 높습니다.
주소 계층이 불타버렸다면 이 모든 것은 무의미합니다: 데이터센터 ASN 위의 흠 없는 브라우저는 여전히 "데이터센터 속의 흠 없는 브라우저"입니다 — 그리고 헤드리스 탐지 임계값은 IP 평판에 적응적입니다. 같은 브라우저가 플래그된 IP에서는 더 많은 JavaScript 챌린지를 받습니다. 주거용 exit은 브라우저 계층이 살아남아야 할 정밀 검사를 효과적으로 낮춰줍니다:
browser = p.chromium.launch(
headless=False, # headed survives more checks
args=["--disable-blink-features=AutomationControlled"],
proxy={
"server": "us.jibaoproxy.com:913",
"username": "USERNAME", "password": "PASSWORD",
},
)
toString()은 그 자체로 신호입니다. 더 적고 일관된 패치가 이깁니다.신규 사용자는 가입 시 500MB를 받고, 첫 충전 시 추가 보너스를 받습니다. 기간 한정 혜택입니다.