DataDome 탐지 원리 완전 분해 — 레지덴셜 프록시로 합법적 자동화 통과하기

DataDome이 스크래퍼를 탐지하는 TLS·브라우저·행동 지문 기술을 분해하고, 레지덴셜 프록시와 스텔스 브라우저로 합법적 자동화를 구성하는 실전 가이드.

DataDome 탐지 원리 완전 분해 — 레지덴셜 프록시로 합법적 자동화 통과하기

DataDome을 만난 스크래핑 엔지니어의 현실

웹 스크래핑 파이프라인을 구축한 경험이 있다면, 어느 순간 응답 본문이 빈 페이지이거나 403 Forbidden과 함께 datadome 쿠키가 세팅된 것을 발견한 적이 있을 것이다. DataDome은 전 세계 주요 퍼블리셔, 이커머스, 항공사 사이트에 배포된 사실상 가장 공격적인 봇 탐지 시스템 중 하나다. 단순 IP 차단을 넘어, TLS 핑거프린트부터 브라우저 캔버스·행동 패턴까지 다층 신호를 결합해 스크래퍼를 식별한다.

이 글에서는 DataDome detection 스택의 각 레이어가 구체적으로 어떤 신호를 수집하는지, 왜 데이터센터 프록시로는 통과할 수 없는지, 그리고 합법적 자동화 관점에서 DataDome residential proxies와 스텔스 브라우저를 어떻게 구성해야 하는지를 다룬다.

DataDome 탐지 스택 4계층

DataDome의 탐지는 단일 신호가 아니라 네 계층의 신호를 실시간으로 융합한다. 각 계층이 어떤 지문을 수집하는지 구체적으로 분해한다.

1계층 — IP 평판 (IP Reputation)

요청이 도달하는 순간 가장 먼저 평가되는 것이 IP 주소다. DataDome은 상용 IP 평판 데이터베이스(예: IP2Location, MaxMind, 자체 크롤링 데이터)와 ASN 정보를 결합해 다음을 판별한다.

  • ASN 분류: AWS, GCP, Azure, OVH, Hetzner 등 클라우드·호스팅 ASN은 즉시 '데이터센터'로 분류된다. 이 분류는 대부분의 경우 자동 차단으로 이어진다.
  • IP 레인지 평판: 특정 /24나 /16 레인지에서 과도한 요청이 감지되면, 해당 레인지 전체가 신뢰도 점수 하락을 겪는다.
  • 지역 일관성: IP의 지리적 위치와 요청의 Accept-Language, Time-Zone 헤더가 불일치하면 의심 신호가 누적된다.

이것이 DataDome residential proxies가 필수인 이유다. 레지덴셜 IP는 ISP ASN을 가지며, 실제 가정용 인터넷 연결에서 할당된 IP이므로 IP 평판 1계층을 자연스럽게 통과한다.

2계층 — TLS 핑거프린트 (JA3/JA4)

TLS 핸드셰이크는 암호화가 시작되기 전에 일어나므로, 프록시가 중간에 있더라도 클라이언트의 TLS 특성이 서버 측(또는 DataDome 엣지 노드)에 노출된다.

JA3은 다음 필드를 해시한 것이다:

  • TLS 버전
  • 지원하는 Cipher Suites 목록 (순서 포함)
  • 확장(Extensions) 목록
  • 지원하는 Elliptic Curves
  • Elliptic Curve Point Formats

예를 들어, Python requests 라이브러리의 기본 TLS 스택은 Cipher Suite 순서가 Chrome과 다르다. DataDome은 이 차이를 즉시 감지한다. JA4는 JA3의 개선판으로, ALPN(Application-Layer Protocol Negotiation)과 SNI 순서까지 포함해 더 정밀하게 클라이언트를 식별한다.

실제 감지 예시를 들자면:

  • Python requests + urllib3: Cipher 순서가 TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:...로 고정되어 있어, Chrome의 순서와 불일치
  • curl 기본 빌드: ALPN에 h2,http/1.1을 보내지만, 확장 순서가 브라우저와 다름
  • Go net/http: Cipher 순서가 알파벳순으로 정렬되어 브라우저 패턴과 완전히 상이

핵심: 프록시는 IP를 바꿀 뿐 TLS 핑거프린트는 바꾸지 않는다. JA3/JA4를 통과하려면 진짜 브라우저 엔진 위에서 요청을 보내야 한다.

3계층 — 브라우저 핑거프린트

DataDome의 JavaScript 챌린지가 실행되면, 브라우저 환경에서 수십 가지 신호를 수집한다. 주요 신호는 다음과 같다.

  • Canvas 핑거프린트: <canvas>에 텍스트와 도형을 렌더링한 뒤 toDataURL() 결과의 해시. GPU·드라이버·폰트 렌더링 엔진에 따라 미세한 차이가 발생한다. Headless Chrome은 GPU 가속이 꺼져 있어 렌더링 결과가 일반 Chrome과 다르다.
  • WebGL 핑거프린트: 렌더러(WEBGL_debug_renderer_info)와 확장 목록. 가상 GPU나 소프트웨어 렌더러가 감지되면 의심 신호.
  • Audio 핑거프린트: OfflineAudioContext로 생성한 오디오 신호의 미세한 차이. 하드웨어 오디오 스택에 따라 달라진다.
  • Navigator 속성: navigator.webdriver, navigator.plugins, navigator.languages, navigator.platform. Headless 모드에서 navigator.webdriver === true가 되는 것이 대표적 탐지 신호.
  • 화면 속성: window.screencolorDepth, pixelDepth, devicePixelRatio. Headless 환경에서는 기본값(24비트, 비율 1.0)으로 고정되는 경우가 많다.

4계층 — 행동 신호 (Behavioral Signals)

DataDome은 페이지 로딩 이후에도 행동을 모니터링한다.

  • 마우스 역학: 마우스 이동 궤적의 곡률, 속도 분포, 가속도 패턴. 자동화된 스크립트는 직선 이동이거나 속도가 일정한 반면, 인간은 베지어 곡선에 가까운 궤적을 그린다.
  • 스크롤 패턴: 스크롤 이벤트의 간격과 가속도. window.scrollTo()를 즉시 호출하는 스크립트는 명백한 봇 신호다.
  • 키보드 타이밍: 키 입력 간격의 분포. 일정한 간격(sleep(100) 루프 등)은 기계적 패턴으로 분류된다.
  • 타이밍 이상: 페이지 로드 후 첫 상호작용까지의 시간이 비정상적으로 짧거나, 여러 단계의 폼을 인간보다 빠르게 완료하는 패턴.

DataDome 쿠키와 CAPTCHA 챌린지 흐름

DataDome의 핵심 인증 메커니즘은 datadome 쿠키다. 전체 흐름은 다음과 같다.

  1. 최초 요청: 브라우저가 페이지를 요청하면, DataDome 엣지 노드가 IP·TLS·헤더를 분석해 즉시 판정한다. 신뢰도가 충분하면 datadome 쿠키를 발급하고 원본 콘텐츠를 반환한다.
  2. JS 챌린지: 신뢰도가 중간이면, 응답에 DataDome JavaScript가 포함된다. 이 스크립트가 브라우저 핑거프린트를 수집해 DataDome 서버로 전송한다. 결과에 따라 쿠키 발급 또는 CAPTCHA로 이어진다.
  3. CAPTCHA 챌린지: 신뢰도가 낮으면 hCaptcha 또는 DataDome 자체 CAPTCHA가 표시된다. 해결하면 datadome 쿠키가 발급된다.
  4. 쿠키 기반 통과: 유효한 datadome 쿠키가 있으면 후속 요청에서 챌린지를 건너뛴다. 쿠키는 일정 시간(보통 24시간) 후 만료되며, 의심스러운 행동이 감지되면 즉시 무효화된다.

이 흐름이 의미하는 바는 명확하다: 단순히 IP를 바꾸는 것만으로는 DataDome을 통과할 수 없다. JS 챌린지를 통과하려면 진짜 브라우저 환경이 필요하고, CAPTCHA를 만나면 인간의 개입이 필요하다.

왜 데이터센터 프록시로는 안 되는가

DataDome은 데이터센터 IP를 극도로 공격적으로 차단한다. 그 이유를 이해하면 레지덴셜 프록시의 가치가 명확해진다.

구분데이터센터 프록시레지덴셜 프록시모바일 프록시
ASN 유형클라우드/호스팅 ASNISP ASN모바일 캐리어 ASN
DataDome 1차 판정즉시 차단 가능성 높음정상 트래픽과 동일가장 높은 신뢰도
IP 평판낮음 (대량 요청 이력)높음 (실제 사용자 IP)매우 높음
지역 일관성불일치 가능성자연스러움자연스러움
비용낮음중간높음
속도빠름중간변동 있음

데이터센터 IP는 이미 상용 IP 평판 데이터베이스에 '호스팅'으로 등록되어 있다. DataDome은 이 데이터를 실시간으로 조회하므로, 아무리 잘 위장해도 IP 레벨에서 이미 탐지된다. 반면 레지덴셜 IP는 실제 ISP 고객이 사용하는 IP이므로, DataDome의 1계층을 자연스럽게 통과한다.

모바일 프록시는 셀룰러 캐리어 ASN을 사용해 가장 높은 신뢰도를 가진다. 항공사나 티켓팅 사이트처럼 모바일 트래픽 비율이 높은 사이트에서 특히 효과적이다.

합법적 자동화로 DataDome 통과하기

여기서 '합법적 자동화'가란, 공개적으로 접근 가능한 데이터를 대량으로 수집하되, 대상 사이트의 서비스에 영향을 주지 않는 속도와 방식으로 작업하는 것을 의미한다. DataDome이 존재하는 이유는 악의적 봇으로부터 서비스를 보호하기 위함이며, 합법적 스크래핑은 이 보호를 우회하려는 것이 아니라 정상적인 접근 환경을 구성하는 것이다.

핵심 원칙

  • 수정되지 않은 브라우저 사용: Playwright Stealth나 Puppeteer Extra Stealth를 사용해 브라우저 핑거프린트를 자연스럽게 유지한다.
  • 레지덴셜 프록시로 지역 일치: 대상 사이트의 주요 사용자 지역과 동일한 국가의 레지덴셜 IP를 사용한다.
  • 인간 속도 준수: 요청 간격을 인간의 탐색 패턴에 맞춘다. CAPTCHA 솔버를 사용해 강제 통과하지 않는다.

구현 1 — Python Playwright Stealth + 레지덴셜 프록시

가장 권장되는 방식은 Playwright Stealth 플러그인과 레지덴셜 프록시를 결합하는 것이다.

from playwright.sync_api import sync_playwright
from playwright_stealth import stealth_sync
import random, time

PROXY = {
    "server": "http://gate.proxyhat.com:8080",
    "username": "user-country-US-session-r1",
    "password": "YOUR_PASSWORD"
}

def scrape_with_datadome(url: str):
    with sync_playwright() as p:
        browser = p.chromium.launch(
            headless=True,
            proxy=PROXY
        )
        context = browser.new_context(
            viewport={"width": 1920, "height": 1080},
            locale="en-US",
            timezone_id="America/New_York",
            user_agent=(
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                "AppleWebKit/537.36 (KHTML, like Gecko) "
                "Chrome/125.0.0.0 Safari/537.36"
            ),
        )
        page = context.new_page()
        stealth_sync(page)

        # 인간처럼 페이지 탐색
        page.goto(url, wait_until="networkidle")
        time.sleep(random.uniform(2.0, 5.0))

        # 자연스러운 스크롤
        page.evaluate("""
            async () => {
                const delay = ms => new Promise(r => setTimeout(r, ms));
                for (let i = 0; i < 5; i++) {
                    window.scrollBy(0, 300 + Math.random() * 200);
                    await delay(800 + Math.random() * 1200);
                }
            }
        """)
        time.sleep(random.uniform(1.0, 3.0))

        content = page.content()
        browser.close()
        return content

이 설정에서 ProxyHat 레지덴셜 프록시는 country-US 플래그로 미국 ISP IP를 제공하고, session-r1으로 세션을 유지해 datadome 쿠키가 여러 요청에 걸쳐 유효하게 유지된다.

구현 2 — Node.js Puppeteer Extra Stealth + 레지덴셜 프록시

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());

async function scrapeWithDatadome(url) {
    const browser = await puppeteer.launch({
        headless: 'new',
        args: [
            '--proxy-server=http://gate.proxyhat.com:8080',
            '--disable-blink-features=AutomationControlled',
        ],
    });

    const page = await browser.newPage();
    await page.authenticate({
        username: 'user-country-FR-session-node1',
        password: 'YOUR_PASSWORD',
    });

    await page.setViewport({ width: 1920, height: 1080 });
    await page.setExtraHTTPHeaders({
        'Accept-Language': 'fr-FR,fr;q=0.9,en;q=0.8',
    });

    await page.goto(url, { waitUntil: 'networkidle2' });

    // 인간처럼 스크롤
    await page.evaluate(() => {
        return new Promise(resolve => {
            let total = 0;
            const step = () => {
                const dist = 250 + Math.random() * 300;
                window.scrollBy(0, dist);
                total += dist;
                if (total < 2000) {
                    setTimeout(step, 600 + Math.random() * 1400);
                } else {
                    resolve();
                }
            };
            step();
        });
    });

    await new Promise(r => setTimeout(r, 2000 + Math.random() * 3000));

    const content = await page.content();
    await browser.close();
    return content;
}

프랑스 IP(country-FR)와 Accept-Language: fr-FR 헤더를 일치시키는 것이 중요하다. DataDome은 IP 지역과 언어 헤더의 불일치를 강한 의심 신호로 처리한다.

구현 3 — curl로 DataDome JS 챌린지 우회는 불가능하다

이 점을 명확히 해야 한다. curl이나 requests는 JavaScript를 실행하지 않으므로, DataDome의 JS 챌린지를 통과할 수 없다.

# curl은 IP와 TLS만 전달 — JS 핑거프린트가 없어 DataDome 챌린지 불가
# 레지덴셜 프록시를 쓰더라도 DataDome JS 챌린지가 있는 사이트는 통과 불가

# 단, datadome 쿠키를 이미 획득한 상태라면 API 엔드포인트 호출에 활용 가능
curl -x http://user-country-DE:YOUR_PASSWORD@gate.proxyhat.com:8080 \
     -H "Cookie: datadome=이전에_획득한_쿠키값" \
     -H "Accept-Language: de-DE,de;q=0.9" \
     -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" \
     "https://target-site.com/api/data"

이 패턴은 브라우저에서 datadome 쿠키를 먼저 획득한 뒤, 후속 API 요청에만 curl을 사용하는 하이브리드 방식이다. 쿠키가 만료되면 다시 브라우저에서 갱신해야 한다.

TLS 핑거프린트 직접 확인하기

자동화 환경의 JA3 핑거프린트를 직접 확인해 보는 것이 디버깅의 첫 단계다.

# JA3 핑거프린트 확인 (Python)
# pip install ja3

import ssl
import hashlib

# Playwright 브라우저의 TLS 핑거프린트가
# 실제 Chrome과 일치하는지 확인하려면
# https://ja3er.com 에 접속해 결과를 비교

# 일반적인 Chrome JA3 해시:
# cd08e31494f9531f560d64c695473da9

# Python requests의 JA3 해시 (다름):
# 4d7a28d6f2269ed8b9d1ee71f2a58e6f

Playwright Stealth를 사용하면 Chromium 엔진의 TLS 스택이 그대로 사용되므로, JA3 핑거프린트가 실제 Chrome과 일치한다. 반면 requestshttpx는 Python의 TLS 스택을 사용하므로 핑거프린트가 완전히 다르다. 이것이 브라우저 기반 접근이 필수인 또 다른 이유다.

지역 매칭의 중요성

DataDome은 IP의 지리적 위치와 브라우저 환경의 일관성을 강하게 검사한다. 다음 조합이 자연스러워야 한다.

  • IP 지역Accept-LanguageTimezone
  • 미국 IP → en-US + America/New_York
  • 독일 IP → de-DE + Europe/Berlin
  • 프랑스 IP → fr-FR + Europe/Paris

ProxyHat에서는 사용자 이름에 국가 코드를 지정해 지역을 매칭할 수 있다.

# 미국 IP
http://user-country-US:PASSWORD@gate.proxyhat.com:8080

# 독일 베를린 IP
http://user-country-DE-city-berlin:PASSWORD@gate.proxyhat.com:8080

# 프랑스 파리 IP
http://user-country-FR-city-paris:PASSWORD@gate.proxyhat.com:8080

윤리적 관점 — DataDome이 존재하는 이유

DataDome은 스캘핑 봇, credential stuffing, DDoS, 광고 사기로부터 웹사이트를 보호하기 위해 존재한다. 합법적 스크래핑을 수행하는 엔지니어로서, 이 보호를 존중해야 한다.

  • 속도 제한 준수: 초당 수십 개의 요청은 대상 서버에 부하를 주고 DataDome의 속도 탐지를 트리거한다. 요청 간격을 3~10초로 유지하라.
  • CAPTCHA 존중: CAPTCHA를 만났다는 것은 해당 속도로 접근하는 것이 대상 사이트의 허용 범위를 벗어났다는 의미다. CAPTCHA 솔버로 강제 통과하는 것은 윤리적이지 않다.
  • robots.txt 확인: 스크래핑 전 robots.txt를 확인하고, 금지된 경로는 수집하지 않는다.
  • 개인정보 보호: GDPR, CCPA 등 관련 법규를 준수하고, 개인식별정보는 수집하지 않는다.

합법적 자동화의 핵심은 '탐지를 우회'하는 것이 아니라 '정상적인 사용자와 동일한 환경'에서 접근하는 것이다. 레지덴셜 프록시와 스텔스 브라우저는 이 환경을 구성하는 도구다.

공식 API를 사용해야 하는 경우

DataDome이 배포된 사이트 중 일부는 공식 API를 제공한다. 다음과 같은 경우에는 스크래핑 대신 공식 API를 사용해야 한다.

  • 주요 뉴스 퍼블리셔: Reuters, AP, Bloomberg 등은 대부분 공식 API를 제공한다. 스크래핑보다 API가 안정적이고 합법적이다.
  • 일부 이커머스: Amazon Product Advertising API, Shopify Storefront API 등은 가격·재고 데이터를 정식으로 제공한다.
  • 소셜 미디어: Twitter/X, Instagram, LinkedIn은 DataDome과 유사한 탐지를 사용하며, 공식 API가 존재한다.

공식 API가 요구하는 데이터를 제공하고, 가격이 합리적이며, 안정성이 보장된다면 항상 API를 우선순위로 두어야 한다. 스크래핑은 API가 없거나 API가 필요한 데이터를 제공하지 않을 때만 고려한다.

세션 관리 전략

DataDome의 datadome 쿠키는 세션 기반이다. 효율적인 스크래핑을 위해서는 세션을 적절히 관리해야 한다.

  • Sticky 세션: ProxyHat의 session- 플래그로 동일한 IP를 유지하면, 한 번 획득한 datadome 쿠키를 여러 요청에 재사용할 수 있다.
  • 세션 갱신: 쿠키가 만료되면 새 세션으로 브라우저를 재시작해야 한다. 자동화 파이프라인에서는 쿠키 만료 시간을 모니터링해 선제적으로 갱신한다.
  • 병렬 세션: 여러 세션을 병렬로 실행할 때는 각 세션에 다른 IP를 할당해야 한다. ProxyHat의 세션 ID를 다르게 지정하면 된다.

Key Takeaways

  • DataDome은 IP 평판, TLS 핑거프린트(JA3/JA4), 브라우저 핑거프린트, 행동 신호의 네 계층으로 스크래퍼를 탐지한다.
  • 데이터센터 IP는 ASN 분류에서 즉시 탐지되므로, 레지덴셜 또는 모바일 프록시가 필수다.
  • curl/requests는 JS 챌린지를 실행할 수 없으므로, Playwright Stealth나 Puppeteer Extra Stealth 같은 브라우저 기반 도구를 사용해야 한다.
  • IP 지역, Accept-Language, Timezone의 일관성이 중요하다. ProxyHat의 country-city- 플래그로 지역을 매칭하라.
  • 합법적 자동화는 속도 제한을 준수하고, CAPTCHA를 존중하며, 공식 API가 있으면 우선 사용한다.
  • 세션 관리로 datadome 쿠키를 재사용하면 효율을 높일 수 있다.

결론

DataDome detection은 단일 우회법으로 해결되지 않는다. IP 평판부터 행동 신호까지 다층 신호를 융합하기 때문에, bypass DataDome은 곧 '정상 사용자와 동일한 환경을 구성하는 것'과 같다. 레지덴셜 프록시로 IP 평판을 해결하고, 스텔스 브라우저로 TLS·브라우저 핑거프린트를 자연스럽게 유지하며, 인간 속도로 탐색하는 것이 합법적 자동화의 정석이다.

ProxyHat의 레지덴셜·모바일 프록시와 지역 타겟팅 기능은 DataDome 보호 사이트에 접근해야 하는 스크래핑 엔지니어에게 필수적인 인프라를 제공한다. ProxyHat 요금제를 확인하고, 지원 국가 목록에서 대상 사이트의 지역에 맞는 프록시를 구성하라.

DataDome이 보호하는 사이트의 스크래핑에 대한 더 넓은 맥락은 웹 스크래핑 모범 사례 가이드와 웹 스크래핑 유스케이스 페이지를 참고하라.

시작할 준비가 되셨나요?

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

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