본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 08. 20:52

Claude와 Playwright를 사용하여 CAPTCHA가 많은 가입 절차를 자동화하는 방법 (실제 코드 포함)

요약

CAPTCHA와 봇 방지 기술이 강력한 사이트에서 Playwright와 Claude를 활용해 브라우저 자동화를 구현하는 방법을 다룹니다. Claude를 추론 계층으로, Playwright를 실행 계층으로 분리하여 동적인 탐지 기술을 우회하는 아키텍처를 제안합니다.

핵심 포인트

  • Claude를 실행이 아닌 추론 계층으로 활용하여 복잡한 의사결정 수행
  • 핑거프린팅 및 마우스 패턴 분석 등 현대적 봇 탐지 기술의 이해
  • 전략 실행 결과를 SQLite에 기록하여 세션별로 학습하는 구조
  • CAPTCHA 유형별 우선순위 결정 트리 및 대응 전략 구축

대부분의 브라우저 자동화 (Browser Automation) 튜토리얼은 가장 어려운 부분, 즉 사이트가 저항할 때 어떻게 해야 하는지를 생략합니다.

깔끔한 Playwright 스크립트를 작성합니다. 로컬에서는 잘 작동합니다. 하지만 이를 프로덕션 (Prod) 환경에 배포하면 10분 이내에 ERR_ACCESS_DENIED, 무한 리다이렉트(Infinite Redirects), 또는 당신이 투입하는 모든 솔버 (Solver)를 무력화하는 CAPTCHA를 마주하게 됩니다.

저는 지난 두 달 동안 CAPTCHA가 많은 사이트에서 계정을 생성하고 양식을 채우는 AI 기반 브라우저 에이전트 (Browser Agent)를 구축하는 데 시간을 보냈습니다. 실제 코드가 포함된 실제 아키텍처 (Architecture)를 소개합니다.

전통적인 자동화의 문제점

대부분의 CAPTCHA 튜토리얼은 이 과제를 일회성 사건으로 취급합니다: 감지하고, 해결하고, 계속 진행한다. 하지만 현대적인 봇 방지 기술 (PerimeterX, DataDome, Cloudflare)은 동적입니다. CAPTCHA는 종종 표면적인 계층에 불과합니다. 진짜 핑거프린팅 (Fingerprinting)은 당신이 챌린지를 보기도 전에 발생합니다:

  • JavaScript 캔버스 핑거프린팅 (JavaScript canvas fingerprinting)
  • TLS 핑거프린트 불일치 (TLS fingerprint mismatch)
  • CDP Runtime.enable 감지
  • 마우스 움직임 패턴 분석 (Mouse movement pattern analysis)
  • 요청 타이밍 시그니처 (Request timing signatures)

CAPTCHA를 해결하더라도 자동화 핑거프린트가 이미 플래그 (Flagged) 처리되었기 때문에 여전히 차단될 수 있습니다.

아키텍처: Claude가 결정하고, Playwright가 실행한다

모든 것을 바꾼 통찰력은 이것입니다: Claude를 실행 계층 (Execution Layer)이 아닌 추론 계층 (Reasoning Layer)으로 취급하는 것입니다.

// stealth-patches.js — addInitScript를 통해 주입
async function patchBrowser(page) {
    await page.addInitScript(() => {
...

이것은 초기 탐지 (Initial Detection)를 처리합니다. 마우스 움직임 분석 (Mouse movement analysis)에는 ghost-cursor 또는 이와 유사한 도구가 필요합니다. 무작위 직선 이동은 즉각적인 탐지 대상이 됩니다.

CAPTCHA 결정 트리 (The CAPTCHA Decision Tree)

챌린지 (Challenge)가 감지되면, 에이전트는 우선순위 순서대로 전략을 실행하고 모든 결과를 SQLite에 기록합니다:

async def handle_captcha(page, captcha_type: str) -> bool:
    strategies = {
        'recaptcha_v2': [solve_2captcha, wait_and_retry, request_manual],
...

log_strategy_win / log_strategy_fail 호출은 browser_memory 테이블에 기록됩니다. 다음에 에이전트가 동일한 도메인에서 실행될 때, 이 기록을 읽어 실패가 확인된 전략은 건너뜁니다. 에이전트는 말 그대로 세션(Session)을 거쳐 학습합니다.

다음은 reCAPTCHA v2를 위한 2captcha 호출 코드입니다:

async def solve_2captcha(page) -> StrategyResult:
    site_key = await page.evaluate("""
        () => document.querySelector('[data-sitekey]')?.dataset.sitekey
...

약 40회 시도 후 결과

  • PerimeterX 사이트: 70% 우회율 (30%는 주거용 프록시 (Residential Proxy) 필요)
  • hCaptcha: 2captcha를 통한 85% 자동 해결률
  • Cloudflare Bot Management: 60% (IP에 따라 다름)
  • DataDome: 40% — 여전히 활발히 디버깅 중

가장 결정적인 돌파구는 주거용 프록시 (Residential Proxy)였습니다. IP 평판 (IP reputation)만으로도 모든 CAPTCHA 트리거의 약 절반을 차지합니다. 깨끗한 IP는 대부분의 챌린지가 로드되기도 전에 우회합니다.

패키징한 내용

저는 이것을 재사용 가능한 키트로 패키징했습니다 — 스텔스 브라우저 설정 (Stealth browser config), CAPTCHA 결정 트리, browser_memory SQLite 스키마, 프록시 로테이션 (Proxy rotation), 세션 지속성 (Session persistence), 그리고 미리 연결된 전체 Claude 에이전트 루프 (Claude agent loop)를 포함합니다.

만약 자동화 에이전트를 구축 중이며 PerimeterX 디버깅에 소요되는 두 달의 시간을 아끼고 싶다면, Claude Browser Agent Starter Kit을 확인해 보세요. 위의 코드는 실제 기반이 되는 코드이며, 키트는 여러분이 특정 작업에 집중할 수 있도록 배관 작업 (Plumbing)을 대신 처리해 줍니다.

아키텍처에 대한 질문이나 해결되지 않는 특정 CAPTCHA 유형이 있으신가요? 아래에 남겨주세요.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0