reCAPTCHA v3 점수 산정 방식: 2026년 보이지 않는 리스크 엔진의 작동 원리와 합법적 자동화 전략

reCAPTCHA v3의 0.0-1.0 연속 리스크 점수 모델, 11개 점수 구간, Google이 융합하는 신호 체계, 그리고 레지덴셜 프록시로 합법적 자동화에서 통과 점수를 얻는 방법을 기술적으로 분해한다.

How reCAPTCHA v3 Scoring Works: A Technical Deep Dive for 2026

QA 자동화 스크립트를 실행했더니 어느 순간부터 reCAPTCHA v3 점수가 0.1로 떨어지며 모든 요청이 차단되기 시작했다. 코드는 바뀐 게 없는데, IP만 바꿨을 뿐이다. 이런 경험을 한 적이 있다면, 여러분은 혼자가 아니다. 2026년 현재 reCAPTCHA v3는 단순한 챌린지-응답 시스템이 아니라, 행동 분석과 IP 평판, 브라우저 지문, 쿠키 그래프를 융합하는 머신러닝 기반 리스크 엔진이다. 이 글에서는 reCAPTCHA v3 점수 산정 방식을 기술적으로 분해하고, 합법적인 자동화 시나리오에서 어떻게 통과 점수를 안정적으로 얻을 수 있는지 실전 가이드를 제공한다.

reCAPTCHA v3 점수 산정 방식: 리스크 엔진의 핵심

reCAPTCHA v3의 핵심은 사용자에게 보이지 않는 연속 점수 모델이다. 이전 버전(v2)이 이미지 선택이나 체크박스 같은 명시적 챌린지를 제시했다면, v3는 페이지 로드 시 백그라운드에서 grecaptcha.execute()를 호출하여 0.0부터 1.0까지의 부동소수점 점수를 반환한다. 점수가 1.0에 가까울수록 인간 트래픽일 확률이 높고, 0.0에 가까울수록 봇일 확률이 높다.

Google의 공식 문서에 따르면, 이 점수는 단일 신호가 아니라 다양한 신호의 융합으로 산정된다 (Google reCAPTCHA v3 개발자 문서). 각 신호는 가중치가 다르며, Google은 정확한 가중치를 공개하지 않는다 — 이는 역설적으로 공격자가 시스템을 역설계하기 어렵게 만드는 의도적 설계다.

중요한 점은 점수가 액션(action) 단위로 발급된다는 것이다. 로그인 버튼 클릭 시 action: 'login', 회원가입 시 action: 'signup'처럼, 각 사용자 행동마다 별도의 토큰과 점수가 생성된다. 서버 사이드에서 토큰을 검증할 때 이 액션이 일치해야 한다.

점수 모델 상세: 0.0-1.0 연속 점수와 11개 점수 구간

reCAPTCHA v3는 0.0부터 1.0까지의 연속 값을 반환하지만, Google 내부에서는 이를 11개의 이산적 구간(bucket)으로 분류하여 처리한다. 각 구간은 0.1 단위로 나뉘며, 사이트 관리자는 관리 콘솔에서 어느 구간부터 차단할지 설정할 수 있다.

일반적인 사이트 임계값

점수 구간일반적 조치해석
0.0 - 0.3차단 (Block)봇으로 간주, 요청 거부
0.3 - 0.6챌린지 (Challenge)추가 검증 필요 — v2 챌린지 또는 2FA
0.6 - 1.0허용 (Allow)인간으로 간주, 요청 통과

recaptcha v3 score가 0.3 미만으로 떨어지면 대부분의 사이트는 요청을 자동으로 차단한다. 0.3에서 0.6 사이는 '회색 지대'로, 사이트 정책에 따라 추가 챌린지를 요구하거나 속도 제한을 적용한다. 0.6 이상이어야 대부분의 사이트에서 제한 없이 통과할 수 있다.

핵심 인사이트: 점수는 절대값이 아니라 상대값이다. Google은 사이트별로 트래픽 패턴을 학습하므로, 동일한 행동이라도 사이트 A에서 0.7을 받을 수 있고 사이트 B에서 0.4를 받을 수 있다.

점수 하락의 주요 패턴

실무에서 관찰되는 점수 하락 패턴은 다음과 같다:

  • 초기 요청: 새 IP + 새 브라우저 = 보통 0.4-0.6 (쿠키 그래프 부재)
  • 반복 후 안정화: 동일 IP + Google 쿠키 존재 = 0.7-0.9
  • 급격한 하락: 데이터센터 IP 전환 = 즉시 0.1-0.2
  • 행동 이상: 인간처럼 보이는 행동 부재 = 0.2-0.3

Google이 융합하는 신호 체계

reCAPTCHA v3의 점수를 구성하는 신호는 크게 5가지 카테고리로 나뉜다. 각 신호가 어떻게 작동하는지 이해해야 점수를 안정적으로 관리할 수 있다.

1. 행동 텔레메트리 (Behavioral Telemetry)

가장 중요한 신호 중 하나다. Google은 페이지 로드 후 마우스 이동 궤적, 스크롤 속도와 패턴, 키 입력 타이밍, 포커스 전환 빈도 등을 수집한다. 핵심은 단순히 '움직임이 있느냐'가 아니라 자연스러움이다.

예를 들어, 마우스가 픽셀 단위로 완벽한 직선으로 이동하거나, 스크롤이 등간격으로 발생하면 기계적 패턴으로 감지된다. 인간의 마우스 이동은 미세한 곡선과 가속/감속을 포함하며, 스크롤은 불규칙한 간격으로 발생한다. Selenium이나 Puppeteer의 기본 click() 메서드는 이러한 미세 패턴을 생성하지 않아 점수 하락의 원인이 된다.

2. Google 쿠키 그래프 (Cookie Graph)

사용자가 Google 서비스(Gmail, YouTube, Search 등)에 로그인한 적이 있다면, 브라우저에 __Secure-3PSID 및 관련 쿠키가 존재한다. reCAPTCHA v3는 이 쿠키 그래프를 참조하여 해당 브라우저의 '신뢰 역사'를 평가한다.

클린 브라우저(쿠키 없음)에서 reCAPTCHA v3를 실행하면, 초기 점수는 일반적으로 0.4-0.6 수준으로 시작된다. 반면 Google 쿠키가 존재하고 정상적인 검색 이력이 있는 브라우저에서는 0.7 이상을 기대할 수 있다. 이것이 헤드리스 브라우저가 점수가 낮은 핵심 이유 중 하나다.

3. 브라우저 특성 (Browser Characteristics)

Google은 User-Agent 외에도 다음 브라우저 신호를 수집한다:

  • Canvas fingerprint: GPU 렌더링 차이로 브라우저를 식별
  • WebGL renderer string: UNMASKED_RENDERER_WEBGL 값 — 헤드리스 환경에서는 SwiftShader로 노출되어 탐지됨
  • AudioContext fingerprint: 오디오 처리 차이
  • Screen resolution & color depth: 헤드리스의 기본값(800x600)은 강한 신호
  • Navigator properties: navigator.webdriver, navigator.plugins, navigator.languages

특히 navigator.webdrivertrue이면 즉시 0.1-0.2 점수 대역으로 떨어진다. Playwright와 Puppeteer는 최신 버전에서 이 값을 기본적으로 false로 설정하지만, 추가 스텔스 조치가 필요하다.

4. IP 평판 (IP Reputation)

이 부분이 프록시 사용자에게 가장 중요하다. Google은 IP 주소를 다음 기준으로 평가한다:

  • ASN 타입: 데이터센터 ASN(AWS, DigitalOcean, OVH 등)은 자동으로 리스크 가중치가 높음
  • 과거 행동: 해당 IP에서 발생한 의심스러운 활동 이력
  • 지리적 일관성: IP 지리적 위치와 Google 계정/쿠키의 지리적 패턴 일치 여부
  • 트래픽 볼륨: 단일 IP에서 비정상적으로 높은 요청 수

Google은 IP 평판 데이터를 자체 서비스(Google Search, Gmail 등)에서 수집한 글로벌 위협 인텔리전스와 결합한다. 데이터센터 IP 대역은 이미 알려진 봇 네트워크와 자주 연관되어 있어, 행동이 완벽해도 점수가 0.1-0.2를 벗어나지 못하는 경우가 많다.

5. JA3/JA4 TLS 지문

Google은 TLS 핸드셰이크의 ClientHello 메시지에서 암호 스위트 순서, 확장 목록, 타원 곡선 순서를 해시하여 JA3/JA4 지문을 생성한다. Python requests 라이브러리의 기본 TLS 스택은 브라우저와 다른 암호 스위트 순서를 사용하므로, 헤더를 완벽히 위장해도 TLS 레벨에서 비인간 트래픽으로 식별된다.

예를 들어, Chrome 120+의 일반적인 JA3 지문은 TLS_AES_128_GCM_SHA256을 첫 번째 암호 스위트로 제시하지만, Python의 ssl 모듈은 TLS_AES_256_GCM_SHA384를 우선시한다. 이 차이만으로도 점수가 0.2-0.3 하락할 수 있다. 자세한 내용은 Mozilla의 TLS 문서를 참조하라.

IP 평판이 점수를 붕괴시키는 이유: 데이터센터 vs 레지덴셜

reCAPTCHA v3 점수를 다루는 프록시 사용자에게 가장 큰 실수는 데이터센터 프록시를 사용하는 것이다. 행동 시뮬레이션이 완벽하고, 브라우저 지문이 정확하고, Google 쿠키가 존재하더라도, 데이터센터 IP에서는 점수가 0.1-0.2를 넘기 어렵다.

그 이유는 Google의 IP 평판 모델이 ASN 타입을 강한 신호로 사용하기 때문이다. AWS(us-east-1), DigitalOcean, OVH, Hetzner 같은 데이터센터 ASN은 전 세계 봇 트래픽의 상당 부분을 차지하며, Google은 이 대역에서 오는 모든 요청에 기본적인 리스크 가중치를 부과한다.

프록시 타입평균 reCAPTCHA v3 점수ASN 분류적합성
데이터센터0.1 - 0.2Cloud/Hosting Provider부적합
모바일 (4G/5G)0.5 - 0.8Mobile Carrier매우 적합
레지덴셜0.6 - 0.9ISP (가정용)적합
직접 접속 (가정)0.7 - 0.9ISP기준점

recaptcha v3 bypass를 시도하는 것이 아니라, 합법적인 자동화에서 정당한 점수를 받는 환경을 구성하려면 레지덴셜 프록시가 필수다. 레지덴셜 IP는 실제 ISP에서 할당된 가정용 대역이므로, Google의 IP 평판 모델에서 데이터센터 IP와 동일한 리스크 가중치를 받지 않는다.

모바일 프록시(4G/5G)는 레지덴셜보다 더 높은 점수를 기대할 수 있는데, 이는 이동통신사 ASN이 대규모 NAT 뒤에 수천 명의 실제 사용자를 가지고 있어 IP당 트래픽 다양성이 매우 높기 때문이다. 단, 모바일 프록시는 레지던셜에 비해 비용이 높고 세션 안정성이 떨어질 수 있다.

서버 사이드 토큰 검증: siteverify 작동 방식

클라이언트에서 grecaptcha.execute()로 얻은 토큰은 서버에서 Google의 siteverify 엔드포인트로 검증해야 한다. 이 과정에서 두 가지 중요한 매칭 검사가 수행된다.

siteverify 요청

POST https://www.google.com/recaptcha/api/siteverify
Content-Type: application/x-www-form-urlencoded

secret=YOUR_SECRET_KEY&response=TOKEN_FROM_CLIENT&remoteip=USER_IP</pre></pre>
<p>응답은 다음 필드를 포함한다:</p>
<pre><code>{
  "success": true,
  "score": 0.7,
  "action": "login",
  "challenge_ts": "2026-01-15T12:34:56Z",
  "hostname": "example.com",
  "error-codes": []
}

액션 매칭

클라이언트에서 grecaptcha.execute(siteKey, {action: 'login'})으로 생성한 토큰은 서버에서 검증 시 action 필드가 'login'과 일치해야 한다. 불일치 시 success: false가 반환되며, 이는 재생 공격(replay attack) 방어의 핵심 메커니즘이다.

호스트네임 매칭

hostname 필드는 토큰이 생성된 페이지의 도메인이어야 한다. example.com에서 발급된 토큰을 api.example.com에서 검증하면 실패한다. 서브도메인을 사용하는 경우 reCAPTCHA 관리 콘솔에서 도메인을 미리 등록해야 한다.

토큰 수명

reCAPTCHA v3 토큰은 약 120초간 유효하다. 이 윈도우를 넘기면 timeout-or-duplicate 에러 코드가 반환된다. 따라서 토큰을 생성한 후 즉시 서버로 전송하고 검증해야 한다.

ProxyHat 레지덴셜 프록시로 합법적 자동화 구현

이제 실전 구현을 살펴보자. 시나리오는 인가된 QA 자동화다 — 자사 웹사이트의 회원가입 플로우를 자동화하여 reCAPTCHA v3 점수가 임계값 이상을 유지하는지 확인하는 테스트를 작성한다.

필수 구성 요소

  • ProxyHat 레지덴셜 프록시 (프록시 가격 확인)
  • Playwright (실제 Chromium 브라우저 기반)
  • playwright-stealth 플러그인 또는 동등한 스텔스 설정

Python 구현 예시

from playwright.sync_api import sync_playwright
import time
import random

# ProxyHat 레지덴셜 프록시 설정
PROXY_CONFIG = {
    "server": "http://gate.proxyhat.com:8080",
    "username": "user-country-US",
    "password": "YOUR_PASSWORD"
}

def human_delay(min_s=0.5, max_s=2.0):
    """인간처럼 보이는 랜덤 지연"""
    time.sleep(random.uniform(min_s, max_s))

def human_mouse_move(page, target_x, target_y):
    """곡선을 포함한 자연스러운 마우스 이동"""
    current = page.evaluate("() => ({x: window.lastX || 0, y: window.lastY || 0})")
    steps = random.randint(15, 30)
    for i in range(steps):
        t = i / steps
        # 이차 곡선 보간
        ease = t * t * (3 - 2 * t)
        x = current['x'] + (target_x - current['x']) * ease
        y = current['y'] + (target_y - current['y']) * ease
        # 미세 노이즈 추가
        x += random.gauss(0, 1.5)
        y += random.gauss(0, 1.5)
        page.mouse.move(x, y)
        time.sleep(random.uniform(0.008, 0.025))
    page.evaluate(f"() => {{ window.lastX = {target_x}; window.lastY = {target_y}; }}")

with sync_playwright() as p:
    browser = p.chromium.launch(
        headless=False,  # 헤드리스 비활성화 권장
        proxy=PROXY_CONFIG,
        args=[
            "--disable-blink-features=AutomationControlled",
            "--window-size=1920,1080",
        ]
    )
    context = browser.new_context(
        viewport={"width": 1920, "height": 1080},
        locale="en-US",
        timezone_id="America/New_York",
    )
    
    # navigator.webdriver = false 설정
    context.add_init_script("""
        Object.defineProperty(navigator, 'webdriver', {
            get: () => false
        });
    """)
    
    page = context.new_page()
    
    # 1. 페이지 로드
    page.goto("https://your-site.com/signup")
    human_delay(2.0, 4.0)
    
    # 2. 자연스러운 스크롤
    page.mouse.wheel(0, random.randint(100, 300))
    human_delay(0.5, 1.5)
    page.mouse.wheel(0, random.randint(50, 200))
    human_delay(1.0, 2.0)
    
    # 3. 폼 필드 입력 (인간 타이밍)
    human_mouse_move(page, 960, 400)
    human_delay(0.3, 0.8)
    page.click("input[name='email']")
    human_delay(0.2, 0.5)
    
    # 타이핑 시뮬레이션 (키당 50-150ms)
    for char in "testuser@example.com":
        page.keyboard.type(char)
        time.sleep(random.uniform(0.05, 0.15))
    
    human_delay(0.5, 1.0)
    
    # 4. reCAPTCHA v3 토큰 가져오기
    token = page.evaluate("""
        async () => {
            await new Promise(r => setTimeout(r, 1000));
            return await grecaptcha.execute(
                'YOUR_SITE_KEY',
                {action: 'signup'}
            );
        }
    """)
    print(f"reCAPTCHA token: {token[:20]}...")
    
    # 5. 서버 사이드 검증 (별도 서비스에서)
    import requests
    verify_resp = requests.post(
        "https://www.google.com/recaptcha/api/siteverify",
        data={
            "secret": "YOUR_SECRET_KEY",
            "response": token,
        }
    )
    result = verify_resp.json()
    print(f"Score: {result.get('score')}")
    print(f"Action match: {result.get('action') == 'signup'}")
    print(f"Success: {result.get('success')}")
    
    browser.close()

핵심 구성 포인트

  1. 레지덴셜 프록시 사용: gate.proxyhat.com:8080user-country-US 사용자 이름으로 미국 레지덴셜 IP를 할당받는다. 이는 Google의 IP 평판 모델에서 데이터센터 리스크 가중치를 피한다.
  2. 헤드리스 비활성화: headless=False로 설정하면 WebGL 렌더러가 SwiftShader 대신 실제 GPU 문자열을 반환하여 캔버스/WebGL 지문이 자연스러워진다.
  3. 행동 시뮬레이션: 마우스 이동에 이차 곡선 보간과 가우시안 노이즈를 추가하고, 키 입력당 50-150ms의 랜덤 지연을 적용한다.
  4. 스텔스 설정: --disable-blink-features=AutomationControlled 플래그와 navigator.webdriver 오버라이드로 자동화 탐지 신호를 제거한다.

SOCKS5 대안

HTTP 프록시가 차단되는 환경에서는 SOCKS5를 사용할 수 있다:

PROXY_CONFIG = {
    "server": "socks5://gate.proxyhat.com:1080",
    "username": "user-country-US",
    "password": "YOUR_PASSWORD"
}

SOCKS5는 TLS 핸드셰이크를 더 투명하게 전달하므로, 특정 환경에서 JA3/JA4 지문이 더 자연스럽게 유지될 수 있다. ProxyHat 문서에서 최신 연결 가이드를 확인하라.

흔한 실수와 엣지 케이스

1. 점수 캐싱 오해

reCAPTCHA v3 점수는 토큰 단위로 발급되지만, 동일한 페이지 로드에서 여러 번 execute()를 호출하면 점수가 점진적으로 하락할 수 있다. Google은 짧은 시간 내 다수의 액션을 의심스럽게 간주한다. 실제 사용자는 한 페이지에서 1-2개의 액션만 수행한다.

2. recaptcha score 0.3 경계에서의 불안정성

점수가 0.3 근처에서 오르내리는 경우, 이는 IP 평판이 한계에 있거나 행동 신호가 불충분하다는 의미다. 이 경우 단일 신호 개선으로는 해결되지 않으며, IP + 행동 + 브라우저 지문을 동시에 개선해야 한다.

3. 세션 스티키니스와 점수

ProxyHat에서 sticky session을 사용하면 동일 IP를 유지할 수 있다:

# 세션 ID로 동일 IP 유지
username = "user-country-US-session-qa123:pass"
# 게이트웨이: gate.proxyhat.com:8080

세션을 유지하면 Google 쿠키 그래프와 IP 평판이 누적되어 점수가 안정화된다. 하지만 너무 오래 유지하면 단일 IP 트래픽 볼륨이 비정상적으로 증가할 수 있으므로, 50-100회 요청 후 세션을 교체하는 것이 권장된다.

4. 지리적 불일치

미국 IP(user-country-US)를 사용하면서 브라우저 timezone을 Asia/Seoul로 설정하면, 지리적 일관성 신호가 깨져 점수가 하락한다. ProxyHat의 프록시 위치 목록에서 선택한 국가와 브라우저 locale/timezone을 일치시켜야 한다.

5. 헤드리스 모드의 한계

헤드리스 Chrome은 HeadlessChrome User-Agent, SwiftShader WebGL 렌더러, 빈 navigator.plugins 등 여러 탐지 신호를 생성한다. headless=False를 사용하거나, Xvfb 같은 가상 디스플레이에서 실행하는 것이 바람직하다.

적절한 사용 영역과 법적 고려사항

이 기술은 명확한 윤리적 경계 내에서 사용되어야 한다. 적절한 사용 사례는 다음과 같다:

  • 인가된 QA 자동화: 자사 웹사이트의 reCAPTCHA v3 통합이 정상 작동하는지 검증
  • 접근성 테스트: 스크린 리더 사용자를 위한 폼 검증 자동화
  • 보안 연구: 학술적 anti-bot 연구, 책임 있는 공개(responsible disclosure)
  • SERP 추적: 합법적인 검색 결과 모니터링 (SERP 추적 사용 사례 참조)
  • 웹 스크래핑: robots.txt를 준수하는 공개 데이터 수집 (웹 스크래핑 사용 사례 참조)

절대 해서는 안 되는 것:

  • 타인의 계정에 무단 접근
  • 대량 계정 생성 (account abuse)
  • 결제 시스템 우회
  • 타사 사비스의 reCAPTCHA를 사전 인가 없이 우회

법적 프레임워크

미국에서는 Computer Fraud and Abuse Act(CFAA, 18 U.S.C. § 1030)가 '인가 없는 접근'을 범죄로 규정한다. 타사 웹사이트의 reCAPTCHA를 우회하여 접근하는 것은 CFAA 위반으로 해석될 수 있다. EU에서는 GDPR이 데이터 수집의 합법적 근거를 요구하며, 스크래핑 대상 사이트의 ToS 위반은 계약법상 책임을 초래할 수 있다.

따라서, 이 글의 기술적 지침은 인가된 테스트 환경에서만 적용해야 한다. 자사 시스템을 테스트하거나, 서면 허가를 받은 타사 시스템을 테스트하는 경우에만 합법적이다.

핵심 요약

Key Takeaways:

  • reCAPTCHA v3는 0.0-1.0 연속 점수를 반환하며, 0.3 미만은 차단, 0.6 이상이 허용 임계값이다.
  • 점수는 행동 텔레메트리, Google 쿠키 그래프, 브라우저 지문, IP 평판, TLS 지문의 융합으로 산정된다.
  • 데이터센터 IP는 행동이 완벽해도 점수를 0.1-0.2로 붕괴시킨다 — 레지덴셜 프록시가 필수다.
  • 서버 사이드에서 action과 hostname 매칭을 검증해야 하며, 토큰 수명은 약 120초다.
  • ProxyHat 레지덴셜 프록시(gate.proxyhat.com:8080, user-country-US) + 실제 브라우저 + 인간 행동 시뮬레이션이 합법적 자동화의 기본 구성이다.
  • 모든 사용은 CFAA/GDPR/ToS 경계 내에서 인가된 환경에서만 수행해야 한다.

reCAPTCHA v3는 보이지 않는 리스크 엔진이지만, 그 작동 원리를 이해하면 합법적인 자동화에서 안정적으로 통과 점수를 얻을 수 있다. 핵심은 단일 트릭이 아니라 — IP, 브라우저, 행동, 지리적 일관성 — 모든 신호가 자연스럽게 정렬되는 환경을 구성하는 것이다. ProxyHat 레지덴셜 프록시로 IP 평판 문제를 해결하고, Playwright로 실제 브라우저 환경을 구성하며, 인간 행동 시뮬레이션으로 행동 신호를 채우면, 0.6 이상의 점수를 안정적으로 달성할 수 있다.

시작할 준비가 되셨나요?

AI 필터링으로 148개국 이상에서 5천만 개 이상의 레지덴셜 IP에 액세스하세요.

가격 보기레지덴셜 프록시
← 블로그로 돌아가기