블로그로 돌아가기

프록시를 통한 Turnstile 및 hCaptcha 우회 방법

Turnstile과 hCaptcha의 작동 메커니즘을 분석하고, 지문 인식 방법을 살펴보며, 코드 예제를 통해 프록시를 통한 우회 방법을 공유합니다.

📅2025년 12월 19일
```html

Turnstile 및 hCaptcha 우회: 보호 기술 및 해결 방법

Cloudflare Turnstile 및 hCaptcha는 전통적인 reCAPTCHA를 대체하여 웹 서비스의 봇 보호 표준이 되었습니다. 이러한 시스템은 브라우저 및 네트워크 환경의 수십 가지 매개변수를 분석하여 프록시 사용을 자동화에 대한 심각한 도전으로 만듭니다. 이 기사에서는 이러한 기술이 기술적 수준에서 어떻게 작동하는지와 프록시를 통해 작업할 때 실제로 효과적인 우회 방법을 살펴보겠습니다.

Cloudflare Turnstile 작동 방식

Cloudflare Turnstile은 "보이지 않는 CAPTCHA 대안"으로 자리 잡은 차세대 보호 시스템입니다. 전통적인 reCAPTCHA와 달리 Turnstile은 사용자가 신호등이나 횡단보도를 선택할 필요가 없습니다. 대신 시스템은 브라우저의 행동적 및 기술적 특성을 백그라운드에서 분석합니다.

기술적으로 Turnstile은 세 단계로 작동합니다. 첫 번째 단계는 iframe을 통해 페이지에 삽입되는 JavaScript 위젯의 로드입니다. 두 번째 단계는 텔레메트리 수집: 시스템은 WebGL 지문, Canvas 지문, 글꼴 목록, 화면 해상도, 시간대, 시스템 언어 및 기타 여러 매개변수에 대한 브라우저 데이터를 수집합니다. 세 번째 단계는 Cloudflare 서버에서의 검증으로, 수집된 데이터는 알려진 봇 및 프록시 패턴과 비교됩니다.

Turnstile의 주요 특징은 IP 주소에 대한 평판 시스템을 사용하는 것입니다. Cloudflare는 DDoS 방어 및 CDN을 사용하는 수백만 개의 사이트에서 수집된 방대한 데이터베이스를 보유하고 있습니다. IP 주소가 의심스러운 활동에 연루되면 Turnstile을 통과할 확률이 급격히 감소합니다. 이는 프록시 사용자의 첫 번째 문제를 만듭니다. 심지어 깨끗한 주거용 IP도 이전 소유자 때문에 낮은 평판을 가질 수 있습니다.

중요: Turnstile은 세 가지 작동 모드—관리형(자동), 비대화형(상호작용 없음) 및 보이지 않는(완전히 숨김)—를 가지고 있습니다. 모드는 검증의 엄격성을 결정하며 우회 방법에 영향을 미칩니다.

hCaptcha 기술 및 탐지 방법

hCaptcha는 개인 정보 보호 및 기계 학습을 통한 수익 창출에 중점을 두고 Google reCAPTCHA의 경쟁자로 등장했습니다. 이 시스템은 웹사이트 소유자에게 사용자 데이터를 AI 모델 교육에 사용하는 대가로 지불하도록 제안합니다. 기술적으로 hCaptcha는 Turnstile보다 자동화 탐지에 더 공격적입니다.

hCaptcha의 기본 작동 메커니즘은 여러 보호 수준을 포함합니다. 첫 번째 수준은 네트워크 매개변수 확인입니다: 시스템은 패킷의 TTL, 네트워크 지연, IP 주소의 지리적 위치 일관성 및 브라우저의 선언된 시간대를 분석합니다. 두 번째 수준은 JavaScript 호출입니다: hCaptcha는 Web API, WebRTC, Battery API, Sensor API의 존재 및 작동을 확인합니다. 세 번째 수준은 마우스 움직임, 스크롤 속도, 클릭 패턴에 대한 행동 분석입니다.

hCaptcha의 특징은 챌린지 기반 검증을 사용하는 것입니다. 시스템이 봇을 의심하면 특정 객체가 있는 이미지를 선택하거나 퍼즐을 해결하거나 왜곡된 이미지에서 텍스트를 인식하는 시각적 작업을 표시합니다. 각 실패한 시도마다 작업의 난이도가 동적으로 증가합니다. 프록시 사용자에게는 올바른 지문이 있더라도 무한한 캡차 체인을 생성할 수 있다는 것을 의미합니다.

매개변수 Turnstile hCaptcha
보이지 않는 모드 예, 기본값 선택 사항
IP 평판 중요 중요
지문 인식 중간 공격적
행동 분석 기본 고급
캡차 빈도 낮음 중간-높음

브라우저 지문 인식 및 프록시

브라우저 지문 인식은 브라우저 및 장치의 고유한 특성 세트를 기반으로 사용자를 식별하는 기술입니다. IP 주소를 변경하기 위해 프록시를 사용하더라도 지문은 변하지 않으며 자동화 사용을 드러낼 수 있습니다. 현대의 보호 시스템은 지문 생성을 위해 50개에서 200개 이상의 매개변수를 수집합니다.

지문의 주요 구성 요소는 다음과 같습니다: Canvas 지문(그래픽 렌더링의 고유한 특성, GPU 및 드라이버에 따라 다름), WebGL 지문(그래픽 가속기의 매개변수), Audio Context 지문(오디오 처리의 특성), 설치된 글꼴 목록, 화면 매개변수(해상도, 색 깊이, 픽셀 비율), User-Agent 및 브라우저 헤더, 언어 설정, 시간대, 플러그인 및 확장 프로그램의 존재.

프록시 사용자에게는 불일치 문제가 있습니다. 예를 들어, IP 주소가 독일에 위치하고 있지만 브라우저의 시간대가 모스크바로 설정되어 있다면 이는 빨간 신호입니다. WebRTC 누출이 실제 IP 주소를 드러내면 시스템은 즉시 변조를 식별합니다. User-Agent가 Windows라고 주장하지만 Canvas 지문이 Linux에 해당하면 탐지가 보장됩니다.

// 기본 지문 수집 예제
const fingerprint = {
  canvas: getCanvasFingerprint(),
  webgl: getWebGLFingerprint(),
  fonts: getFonts(),
  screen: {
    width: screen.width,
    height: screen.height,
    colorDepth: screen.colorDepth,
    pixelRatio: window.devicePixelRatio
  },
  timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
  language: navigator.language,
  platform: navigator.platform,
  hardwareConcurrency: navigator.hardwareConcurrency,
  deviceMemory: navigator.deviceMemory,
  webrtc: await getWebRTCIPs()
};

function getCanvasFingerprint() {
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');
  ctx.textBaseline = 'top';
  ctx.font = '14px Arial';
  ctx.fillText('Browser fingerprint', 2, 2);
  return canvas.toDataURL();
}

프록시 서버 탐지 방법

보호 시스템은 프록시 탐지를 위해 여러 기술을 사용합니다. 첫 번째 방법은 알려진 프록시 및 VPN 데이터베이스를 확인하는 것입니다. IPHub, IP2Proxy, MaxMind GeoIP2와 같은 서비스는 프록시, VPN, 호스팅 제공업체로 분류된 수백만 개의 IP 주소를 포함하고 있습니다. Cloudflare 및 hCaptcha는 이러한 데이터베이스와 통합되어 의심스러운 IP에 대해 자동으로 검증 수준을 높입니다.

두 번째 방법은 ASN(자율 시스템 번호) 분석입니다. 데이터 센터 프록시는 일반적으로 호스팅 제공업체(AWS, DigitalOcean, OVH)에 속하므로 ASN을 통해 쉽게 식별할 수 있습니다. 주거용 프록시는 일반 인터넷 제공업체(Comcast, Verizon, Deutsche Telekom)의 ASN을 사용하므로 덜 의심스럽습니다. 그러나 심지어 주거용 네트워크도 프록시 판매로 알려진 제공업체에 의해 부분적으로 손상될 수 있습니다.

세 번째 방법은 네트워크 수준에서의 행동 분석입니다. 시스템은 비정상적인 패턴을 추적합니다: 너무 낮거나 높은 패킷 TTL, 비정상적인 지연, 비표준 포트 사용, 지리적 위치 및 라우팅 경로 불일치. 예를 들어, IP 주소가 미국에 지리적으로 위치하지만 traceroute가 유럽 서버를 통해 경로를 보여주면 이는 프록시의 징후입니다.

일반적인 실수: 서로 다른 지문으로 여러 세션에 동일한 IP 주소를 사용하는 것입니다. 시스템은 이러한 패턴을 추적하고 IP를 전체적으로 차단하며, 이는 고품질의 주거용 프록시일지라도 마찬가지입니다.

기본 솔루션으로서의 주거용 프록시

주거용 프록시는 Turnstile 및 hCaptcha를 우회하기 위한 기초입니다. 데이터 센터 프록시와 달리 주거용 프록시는 실제 장치의 IP 주소를 사용합니다: 가정용 라우터, 모바일 전화, IoT 장치. 이는 네트워크 인프라 측면에서 일반 사용자와 거의 구별할 수 없게 만듭니다.

캡차 우회를 위한 주거용 프록시의 주요 장점: 호스팅 제공업체가 아닌 ISP(인터넷 서비스 제공업체)에 속함; 대부분의 경우 IP 주소의 깨끗한 평판; 올바른 지리적 위치 및 라우팅; 블랙리스트에 올라갈 가능성이 낮음. 그러나 모든 주거용 프록시가 동일하게 효과적인 것은 아닙니다. 여러 요인이 중요합니다.

첫 번째 요인은 IP 주소의 회전입니다. 정적 주거용 프록시(스티키 세션)는 몇 분에서 몇 시간 동안 하나의 IP를 사용할 수 있습니다. 이는 세션 유지가 필요한 시나리오(인증, 양식 작성, 다단계 작업)에 최적입니다. 회전형 프록시는 각 요청마다 IP를 변경하거나 타이머에 따라 변경되므로 파싱에 유용하지만 자주 맥락이 변경되어 캡차 문제를 일으킬 수 있습니다.

두 번째 요인은 지리적 분포입니다. 캡차를 우회하기 위해서는 IP의 지리적 위치가 사이트의 타겟팅 및 브라우저 설정과 일치해야 합니다. 독일 사이트에서 작업하는 경우 독일 주거용 프록시를 사용하고 해당 시간대(Europe/Berlin), 언어(de-DE) 및 로케일을 브라우저에 설정해야 합니다.

세 번째 요인은 프록시 제공업체의 품질입니다. 저렴한 주거용 프록시는 종종 의심스러운 방법(무료 VPN 애플리케이션, 감염된 장치)을 통해 수집되어 IP 풀의 낮은 평판을 초래합니다. 전문 제공업체는 합법적인 SDK 파트너십을 통해 작업하며 네트워크 품질을 면밀히 모니터링합니다. 확장하기 전에 목표 사이트에서 제공업체의 성공률을 확인하세요.

자동화 도구: Selenium, Puppeteer, Playwright

자동화 도구의 선택은 캡차를 우회하는 능력에 중대한 영향을 미칩니다. Selenium, Puppeteer 및 Playwright는 각각 고유한 탐지 특성을 가진 세 가지 주요 솔루션입니다. 보호 시스템은 이러한 도구의 사용을 수십 가지 징후를 통해 식별할 수 있습니다.

Selenium은 가장 오래되고 가장 쉽게 탐지되는 도구입니다. Selenium으로 제어되는 브라우저는 명확한 마커를 가지고 있습니다: window.navigator.webdriver 변수가 true로 설정되어 있으며, 자동화에 특화된 navigator 객체의 일부 속성이 누락되고, 브라우저 창의 크기가 자동화에 특화된 특정 크기입니다. 프록시를 사용하더라도 Selenium은 추가적인 난독화 없이 Turnstile 및 hCaptcha 검사를 자주 통과하지 못합니다.

Puppeteer 및 Playwright는 Chrome DevTools Protocol을 기반으로 한 보다 현대적인 도구입니다. 이들은 탐지되지만 명확한 징후가 적습니다. 주요 탐지 방법: chrome.runtime 확인, permissions API 분석, 플러그인 부재 및 특정 viewport 크기를 통한 headless 모드 탐지, 타이밍 공격을 통한 DevTools 존재 확인.

// 프록시 및 안티탐지 설정을 가진 Puppeteer의 기본 설정
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');

puppeteer.use(StealthPlugin());

const browser = await puppeteer.launch({
  headless: false, // headless: true는 쉽게 탐지됩니다
  args: [
    '--proxy-server=http://your-proxy:port',
    '--disable-blink-features=AutomationControlled',
    '--disable-dev-shm-usage',
    '--no-sandbox',
    '--disable-setuid-sandbox',
    '--disable-web-security',
    '--disable-features=IsolateOrigins,site-per-process',
    `--window-size=1920,1080`,
    '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
  ]
});

const page = await browser.newPage();

// 프록시 인증
await page.authenticate({
  username: 'proxy_user',
  password: 'proxy_pass'
});

// webdriver 속성 재정의
await page.evaluateOnNewDocument(() => {
  Object.defineProperty(navigator, 'webdriver', {
    get: () => false
  });
  
  // headless용 플러그인 에뮬레이션
  Object.defineProperty(navigator, 'plugins', {
    get: () => [1, 2, 3, 4, 5]
  });
});

캡차를 심각하게 우회하려면 전문 안티탐지 브라우저를 사용하는 것이 좋습니다: Multilogin, GoLogin, AdsPower, Dolphin Anty. 이러한 솔루션은 고유한 지문을 가진 격리된 브라우저 프로필을 생성하고, 쿠키 및 세션 저장소를 관리하며, 프록시의 지리적 위치와 시간대를 자동으로 동기화하고, 사실적인 Canvas 및 WebGL 지문을 에뮬레이션합니다.

캡차 해결 서비스: 통합 및 효율성

기술적 방법이 부족할 때 캡차 해결 서비스가 도움이 됩니다. 이들은 두 가지 유형으로 나뉩니다: 인간(크라우드소싱) 및 자동(기계 학습). Turnstile 및 hCaptcha에 대한 효율성은 다릅니다.

인간 서비스(2Captcha, AntiCaptcha, CapSolver, CapMonster Cloud)는 분산 노동의 원칙에 따라 작동합니다: 귀하의 캡차는 실제 사람에게 전송되어 수동으로 해결됩니다. 장점: 높은 성공률(95-99% hCaptcha, 85-95% Turnstile), 복잡한 시각적 작업 지원, 상대적으로 안정적입니다. 단점: 해결 속도는 10-60초, 비용은 1000캡차당 $1-3, 운영자의 가용성에 의존합니다.

자동 서비스는 AI 모델을 사용하여 인식합니다. 이들은 더 빠르며(1-5초) 더 저렴하지만 현대 캡차에 대한 성공률이 낮습니다—일반적으로 hCaptcha에 대해 60-80%, Turnstile에 대해 50-70%입니다. 간단한 챌린지 기반 작업에 효과적이지만 보이지 않는 검증에서는 자주 실패합니다.

// hCaptcha 해결을 위한 2Captcha 통합
const axios = require('axios');

async function solveHCaptcha(sitekey, pageUrl, proxyConfig) {
  const API_KEY = 'your_2captcha_api_key';
  
  // 작업 제출
  const createTask = await axios.post('https://2captcha.com/in.php', null, {
    params: {
      key: API_KEY,
      method: 'hcaptcha',
      sitekey: sitekey,
      pageurl: pageUrl,
      proxy: `${proxyConfig.type}:${proxyConfig.host}:${proxyConfig.port}:${proxyConfig.user}:${proxyConfig.pass}`,
      json: 1
    }
  });
  
  const taskId = createTask.data.request;
  
  // 해결 대기
  let solution = null;
  for (let i = 0; i < 60; i++) {
    await new Promise(resolve => setTimeout(resolve, 3000));
    
    const result = await axios.get('https://2captcha.com/res.php', {
      params: {
        key: API_KEY,
        action: 'get',
        id: taskId,
        json: 1
      }
    });
    
    if (result.data.status === 1) {
      solution = result.data.request;
      break;
    }
  }
  
  return solution; // 양식에 삽입할 토큰
}

// Puppeteer에서 사용
const captchaToken = await solveHCaptcha(
  'site-key-from-page',
  'https://example.com',
  { type: 'http', host: 'proxy.example.com', port: 8080, user: 'user', pass: 'pass' }
);

await page.evaluate((token) => {
  document.querySelector('[name="h-captcha-response"]').value = token;
  document.querySelector('[name="g-recaptcha-response"]').value = token;
}, captchaToken);

캡차 해결 서비스에 올바른 프록시 매개변수를 전달하는 것이 매우 중요합니다. 만약 캡차가 하나의 IP에서 해결되고, 그 후 토큰이 다른 IP에서 사용된다면—검증이 실패할 것입니다. 현대 캡차는 토큰을 IP 주소, User-Agent 및 세션의 다른 매개변수에 바인딩합니다.

고급 기술: 장치 에뮬레이션 및 TLS 지문 인식

가장 보호된 시스템을 우회하기 위해서는 프록시 및 브라우저의 기본 설정을 넘어서는 고급 기술이 필요합니다. 두 가지 주요 영역은 모바일 장치 에뮬레이션과 TLS 지문 인식 관리입니다.

모바일 프록시와 모바일 브라우저 에뮬레이션의 조합은 캡차에 대한 높은 효율성을 제공합니다. 이유: 모바일 트래픽은 더 높은 신뢰 점수를 가지며, 모바일 IP 주소(특히 4G/5G)는 종종 동적이며 자연스럽게 변경되고, 모바일 장치는 다른 지문 매개변수 세트를 가지며, 많은 사이트는 모바일 사용자에 대한 검증을 단순화합니다.

모바일 장치를 올바르게 에뮬레이션하기 위해서는: 모바일 User-Agent(장치 모델과 정확히 일치), 올바른 viewport 및 devicePixelRatio 설정, mouse events 대신 touch events 에뮬레이션, 모바일 navigator.platform 및 navigator.maxTouchPoints 값 사용, 특정 장치 모델에 맞게 WebGL 및 Canvas 지문 설정이 필요합니다.

// Playwright에서 iPhone 13 Pro 에뮬레이션
const { chromium, devices } = require('playwright');

const iPhone13Pro = devices['iPhone 13 Pro'];

const browser = await chromium.launch({
  proxy: {
    server: 'http://mobile-proxy:port',
    username: 'user',
    password: 'pass'
  }
});

const context = await browser.newContext({
  ...iPhone13Pro,
  locale: 'en-US',
  timezoneId: 'America/New_York',
  geolocation: { latitude: 40.7128, longitude: -74.0060 },
  permissions: ['geolocation']
});

const page = await context.newPage();

// 지문 추가 설정
await page.addInitScript(() => {
  Object.defineProperty(navigator, 'hardwareConcurrency', {
    get: () => 6 // iPhone 13 Pro는 6코어입니다
  });
  
  Object.defineProperty(navigator, 'deviceMemory', {
    get: () => 6 // 6GB RAM
  });
});

TLS 지문 인식은 TLS/SSL 연결의 매개변수를 기반으로 클라이언트를 식별하는 방법입니다. 각 브라우저와 운영 체제는 HTTPS 연결을 설정할 때 전송되는 고유한 cipher suites, extensions, elliptic curves 조합을 가지고 있습니다. 보호 시스템은 TLS 지문을 분석하고 이를 선언된 User-Agent와 비교합니다.

표준 자동화 도구의 문제는 기본 Chromium의 TLS 지문을 사용하는 것입니다. 이는 완전한 Chrome과 다릅니다. 이러한 불일치는 탐지됩니다. 해결책: 특정 브라우저의 TLS 지문을 에뮬레이션하는 curl-impersonate 또는 Python의 tls-client와 같은 라이브러리 사용; TLS를 사용자 정의하는 HTTP 클라이언트 사용(예: Node.js의 cycletls); headless 모드 대신 완전한 브라우저 사용.

복합 접근법:

  • 깨끗한 IP를 위한 주거용 또는 모바일 프록시
  • 올바르게 설정된 Playwright 또는 안티탐지 브라우저로 정확한 지문
  • 모든 매개변수 동기화: IP 지리적 위치 = 시간대 = 언어 = 로케일
  • 인간 행동 에뮬레이션: 지연, 마우스 움직임, 스크롤
  • 복잡한 경우를 위한 캡차 해결 서비스

코드의 실제 예제

Turnstile을 우회하기 위한 Playwright, 주거용 프록시 및 안티탐지 기술을 사용한 전체 예제를 살펴보겠습니다. 이 코드는 문제 해결을 위한 종합적인 접근 방식을 보여줍니다.

const { chromium } = require('playwright-extra');
const stealth = require('puppeteer-extra-plugin-stealth')();

// 프록시 구성
const proxyConfig = {
  server: 'http://residential-proxy.proxycove.com:8080',
  username: 'your_username',
  password: 'your_password'
};

// 독일의 실제 사용자 에뮬레이션을 위한 설정
const userConfig = {
  viewport: { width: 1920, height: 1080 },
  userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
  locale: 'de-DE',
  timezoneId: 'Europe/Berlin',
  geolocation: { latitude: 52.5200, longitude: 13.4050 }, // 베를린
  permissions: ['geolocation']
};

async function bypassTurnstile(url) {
  const browser = await chromium.launch({
    headless: false, // 복잡한 캡차에 중요합니다
    proxy: proxyConfig,
    args: [
      '--disable-blink-features=AutomationControlled',
      '--no-sandbox',
      '--disable-dev-shm-usage'
    ]
  });

  const context = await browser.newContext({
    ...userConfig,
    // 추가 헤더
    extraHTTPHeaders: {
      'Accept-Language': 'de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7',
      'Accept-Encoding': 'gzip, deflate, br',
      'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
      'DNT': '1',
      'Connection': 'keep-alive',
      'Upgrade-Insecure-Requests': '1'
    }
  });

  const page = await context.newPage();

  // 안티탐지 스크립트 삽입
  await page.addInitScript(() => {
    // webdriver 숨기기
    Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    });

    // chrome 런타임 에뮬레이션
    window.chrome = {
      runtime: {}
    };

    // 권한 재정의
    const originalQuery = window.navigator.permissions.query;
    window.navigator.permissions.query = (parameters) => (
      parameters.name === 'notifications' ?
        Promise.resolve({ state: Notification.permission }) :
        originalQuery(parameters)
    );

    // Windows에 대한 더 현실적인 값
    Object.defineProperty(navigator, 'platform', {
      get: () => 'Win32'
    });

    Object.defineProperty(navigator, 'hardwareConcurrency', {
      get: () => 8
    });

    Object.defineProperty(navigator, 'deviceMemory', {
      get: () => 8
    });
  });

  // 인간 행동 에뮬레이션
  async function humanLikeDelay(min = 1000, max = 3000) {
    const delay = Math.random() * (max - min) + min;
    await page.waitForTimeout(delay);
  }

  async function humanLikeMouseMove() {
    const viewportSize = page.viewportSize();
    const x = Math.random() * viewportSize.width;
    const y = Math.random() * viewportSize.height;
    await page.mouse.move(x, y, { steps: 10 });
  }

  try {
    // 페이지로 이동
    await page.goto(url, { waitUntil: 'networkidle' });
    
    await humanLikeDelay(2000, 4000);
    await humanLikeMouseMove();

    // Turnstile 로딩 대기
    await page.waitForSelector('iframe[src*="turnstile"]', { timeout: 10000 });
    
    console.log('Turnstile 발견, 자동 해결 대기 중...');
    
    // 관리 모드에서 Turnstile은 종종 자동으로 해결됩니다
    // 토큰이 나타날 때까지 대기
    await page.waitForFunction(() => {
      const response = document.querySelector('[name="cf-turnstile-response"]');
      return response && response.value.length > 0;
    }, { timeout: 30000 });

    console.log('Turnstile 통과 성공!');
    
    // 사이트에서의 추가 작업
    await humanLikeDelay();
    
    // 예: 양식 작성
    await page.fill('#email', 'user@example.com');
    await humanLikeDelay(500, 1500);
    
    await page.fill('#password', 'SecurePassword123');
    await humanLikeDelay(500, 1500);
    
    await humanLikeMouseMove();
    await page.click('button[type="submit"]');
    
    await page.waitForNavigation({ waitUntil: 'networkidle' });
    
    console.log('인증 완료');

  } catch (error) {
    console.error('Turnstile 우회 중 오류 발생:', error.message);
    
    // 디버깅을 위한 스크린샷
    await page.screenshot({ path: 'turnstile_error.png', fullPage: true });
    
  } finally {
    await browser.close();
  }
}

// 실행
bypassTurnstile('https://example.com/login');

hCaptcha의 시각적 작업이 필요한 경우 해결 서비스 통합이 필요합니다. 다음은 2Captcha를 사용한 예입니다:

const axios = require('axios');

class HCaptchaSolver {
  constructor(apiKey) {
    this.apiKey = apiKey;
    this.baseUrl = 'https://2captcha.com';
  }

  async solve(sitekey, pageUrl, proxy = null) {
    // 작업 생성
    const params = {
      key: this.apiKey,
      method: 'hcaptcha',
      sitekey: sitekey,
      pageurl: pageUrl,
      json: 1
    };

    if (proxy) {
      params.proxy = `${proxy.type}:${proxy.host}:${proxy.port}:${proxy.username}:${proxy.password}`;
      params.proxytype = proxy.type.toUpperCase();
    }

    const createResponse = await axios.post(`${this.baseUrl}/in.php`, null, { params });
    
    if (createResponse.data.status !== 1) {
      throw new Error(`작업 생성 오류: ${createResponse.data.request}`);
    }

    const taskId = createResponse.data.request;
    console.log(`작업 생성됨: ${taskId}`);

    // 결과 폴링
    for (let attempt = 0; attempt < 60; attempt++) {
      await new Promise(resolve => setTimeout(resolve, 5000));

      const resultResponse = await axios.get(`${this.baseUrl}/res.php`, {
        params: {
          key: this.apiKey,
          action: 'get',
          id: taskId,
          json: 1
        }
      });

      if (resultResponse.data.status === 1) {
        console.log('hCaptcha 해결됨!');
        return resultResponse.data.request;
      }

      if (resultResponse.data.request !== 'CAPCHA_NOT_READY') {
        throw new Error(`해결 오류: ${resultResponse.data.request}`);
      }

      console.log(`시도 ${attempt + 1}/60: 캡차가 아직 해결되지 않았습니다...`);
    }

    throw new Error('타임아웃: 캡차가 5분 이내에 해결되지 않았습니다');
  }
}

// Playwright와 함께 사용
async function bypassHCaptcha(page, proxyConfig) {
  // 페이지에서 sitekey 가져오기
  const sitekey = await page.getAttribute('[data-sitekey]', 'data-sitekey');
  const pageUrl = page.url();

  const solver = new HCaptchaSolver('your_2captcha_api_key');
  
  const token = await solver.solve(sitekey, pageUrl, {
    type: 'http',
    host: 'residential-proxy.proxycove.com',
    port: 8080,
    username: 'your_username',
    password: 'your_password'
  });

  // 페이지에 토큰 삽입
  await page.evaluate((captchaToken) => {
    document.querySelector('[name="h-captcha-response"]').value = captchaToken;
    
    // 일부 사이트에서는 g-recaptcha-response도 필요합니다
    const gRecaptcha = document.querySelector('[name="g-recaptcha-response"]');
    if (gRecaptcha) {
      gRecaptcha.value = captchaToken;
    }
    
    // 콜백을 위한 이벤트 트리거
    const event = new Event('change', { bubbles: true });
    document.querySelector('[name="h-captcha-response"]').dispatchEvent(event);
  }, token);

  console.log('hCaptcha 토큰이 삽입되었습니다');
}

결론

Turnstile 및 hCaptcha를 프록시를 통해 우회하는 것은 보호 메커니즘을 이해하고 기술을 적절히 조합해야 하는 복합적인 작업입니다. 주요 결론: 데이터 센터 프록시 대신 고품질의 주거용 또는 모바일 프록시를 사용하세요; 모든 환경 매개변수를 동기화하세요 (IP 지리적 위치, 시간대, 언어, 로케일); 자동화를 숨기기 위한 안티탐지 기술을 적용하세요; 현실적인 인간 행동을 에뮬레이션하세요; 복잡한 경우를 대비해 캡차 해결 서비스를 추가 보호 수준으로 사용하세요.

방법의 효율성은 특정 사이트 및 보호 설정에 따라 다릅니다. 기본 구성으로 시작하고 점차 복잡하게 만들어 성공률을 모니터링하는 것이 좋습니다. IP 풀의 차단을 피하기 위해 대규모로 확장하기 전에 소규모로 테스트하세요. 지문 매개변수 및 User-Agent를 최신 브라우저 버전에 맞게 정기적으로 업데이트하세요.

캡차와 전문적으로 작업하기 위해서는 프록시, 안티탐지 브라우저 및 해결 서비스를 통합한 전문 자동화 플랫폼 사용을 고려하세요. 이는 통합의 복잡성을 줄이고 결과의 안정성을 높입니다. 고품질 프록시 테스트를 시작하여 성공적인 현대 보호 시스템 우회의 기초를 마련하세요.

```