Stealth 플러그인을 넘어: Clark-Browser로 진정한 브라우저 익명성 달성
브라우저 자동화 에이전트를 개발하는 개발자들에게, 봇 탐지의 ‘고양이와 쥐’ 게임은 점점 더 정교해지고 있습니다. Puppeteer와 Playwright와 같은 도구가 업계 표준이지만, 기본 헤드리스 모드는 현대 보안 서비스가 탐지하기에 너무 쉽습니다. 대부분의 개발자는 이러한 신호를 가리기 위해 JavaScript 수준의 ‘스텔스’ 플러그인에 의존하지만, 탐지 엔진이 진화함에 따라 이러한 쉼은 숨기려는 봇만큼이나 탐지되기 쉬워지고 있습니다.
JS 수준 스텔스의 실패
Clark-Browser가 왜 필요한지 이해하려면 봇 탐지가 어떻게 작동하는지 알아야 합니다. 표준 chromium --headless는 명백한 신호들을 남깁니다:
navigator.webdriver가true로 설정됩니다.- 플러그인 목록이 비어 있습니다.
- User-Agent에
HeadlessChrome이 명시적으로 포함됩니다. - WebGL 문자열이 물리적 GPU가 아닌 소프트웨어 렌더러를 드러냅니다.
많은 개발자는 puppeteer-extra-plugin-stealth나 playwright-stealth와 같은 라이브러리를 사용합니다. 이러한 도구는 JavaScript를 주입해 해당 속성을 재정의함으로써 작동합니다. 그러나 FingerprintJS, BrowserScan, Cloudflare Turnstile와 같은 고급 탐지 스위트는 종종 스텔스 플러그인 자체의 존재를 감지할 수 있습니다. 웹사이트가 속성이 JS 프록시나 getter 재정의를 통해 수정되었음을 감지하면 고위험 플래그가 트리거됩니다.
C++ 접근법: 소스 패치
Clark-Browser는 근본적으로 다른 접근 방식을 취합니다. 브라우저가 시작된 후 증거를 숨기려는 대신, blink, v8, net의 소스 코드를 바이너리가 컴파일되기 전에 수정합니다.
C++ 수준에서 안티‑핑거프린팅을 구현함으로써 JavaScript 환경에 반환되는 값은 전통적인 의미의 “스푸핑”이 아니라 브라우저 엔진이 실제로 가지고 있다고 믿는 값입니다. 이는 JS 수준 쉼이 만들던 불일치를 제거하여 브라우저가 전체 JS‑가시 지문 표면에서 원래 Chrome 설치와 구분되지 않게 합니다.
스텔스 표면
Clark-Browser는 --fingerprint-* 일련의 명령줄 스위치를 도입해 개발자가 브라우저 인스턴스에 대한 결정론적 아이덴티티를 정의할 수 있게 합니다. 이를 통해 다음을 정밀하게 제어할 수 있습니다:
- Hardware Profiles: GPU 공급업체, 렌더러, 디바이스 메모리 및 하드웨어 동시성을 스푸핑합니다.
- Environmental Data: IANA 시간대, BCP 47 로케일 및 지리 위치 좌표를 설정합니다.
- Network Identity: WebRTC IP 주소를 스푸핑해 누수를 방지합니다.
- Visual Noise: 캔버스와 오디오 노이즈를 구현해 결정론적 지문화를 방지합니다 (Brave 인프라를 계승).
성능 및 검증
프로젝트 문서에 따르면, 출시된 바이너리는 이미 여러 핵심 테스트를 통과했습니다. 올바른 Accept-Language 헤더를 사용하면 SannySoft WebDriver 테스트와 Antoine Vastel 헤드리스 테스트를 성공적으로 우회합니다. 또한 BrowserLeaks Client Hints와 WebGL 테스트를 통과해 헤드리스 환경에서 흔히 보이는 SwiftShader 또는 llvmpipe 표시를 피합니다.
하지만 커뮤니티는 여전히 신중합니다. Hacker News 토론에서 사용자들이 지적했듯이, 현대 탐지는 특히 Cloudflare에서 단순 속성 검사 이상으로 진화했습니다.
"이제는 navigator 속성만 보는 것이 아니라 캔버스 연산 시간을 측정하고 렌더링 파이프라인의 불일치를 확인합니다."
Clark-Browser가 정적 지문을 해결하긴 하지만, 동적 행동(타이밍 공격 및 렌더링 파이프라인 분석)은 여전히 봇 탐지 전쟁의 최전선에 남아 있습니다.
시작하기
Clark-Browser는 MIT 라이선스를 갖고 있으며 Playwright와 함께 사용하기 쉬운 Python 래퍼를 제공합니다:
from clarkbrowser import launch
browser = launch()
page = browser.new_page()
page.goto("https://bot.sannysoft.com")
print(page.title())
browser.close()
최대 투명성이나 맞춤 구성을 필요로 하는 경우, 프로젝트는 Linux와 macOS용 전체 빌드 스크립트를 제공하지만, 빌드 과정은 리소스를 많이 소모합니다. 약 80 GB의 디스크 공간과 32 GB 이상의 RAM이 필요합니다.
결론
Clark-Browser는 보다 전문적인 수준의 브라우저 자동화로의 전환을 의미합니다. 탐지 회피 로직을 바이너리로 옮김으로써, 제한이 심한 환경에서도 작동해야 하는 에이전트에게 보다 견고한 기반을 제공합니다. 가장 진보된 AI 기반 탐지 시스템에 대해 100 % 보이지 않음을 보장할 수 있는 도구는 없지만, 소스를 패치하는 것이 DOM을 패치하는 것보다 객관적으로 더 효과적입니다.