차단당하지 않고 앱에서 데이터를 스크래핑하는 방법
요약
웹 스크래핑 시 차단을 방지하기 위한 모범 사례와 기술적 원칙을 설명합니다. robots.txt 준수, 요청 속도 조절, 오류 처리, 신원 교체 등 기본 원칙부터 현대적인 안티봇 시스템의 탐지 계층까지 다룹니다.
핵심 포인트
- robots.txt 및 서비스 약관을 준수하여 법적 리스크 방지
- 인간과 유사한 가변적 지연 시간을 추가하여 탐지 회피
- 429/403 오류 발생 시 즉각적인 재시도 대신 속도 조절
- IP 프록시 및 User-Agent 교체를 통한 신원 다양화
- TLS 및 네트워크 핑거프린팅 등 다층적 안티봇 시스템 이해 필요
스크래핑을 위한 모범 사례 (Best Practices)
우리는 몇 줄의 Python 코드를 작성하고 몇 번의 요청을 보냈고, 우리의 스크래핑 파이프라인 (scraping pipeline)은 완벽하게 작동하는 것처럼 보였습니다. 하지만 대규모로 스크래핑을 시작하자 상황이 빠르게 변했습니다. 갑자기 오류가 발생하거나, CAPTCHA에 직면하거나, 필요한 데이터 대신 빈 페이지를 받게 되었습니다. 그때 우리는 스크래핑이 보기보다 훨씬 어렵다는 것을 깨달았습니다. 그래서 수많은 고난과 실패를 거친 후, 스크래핑을 위한 모범 사례에 대한 우리의 플레이북 (playbook)을 공유하고자 합니다.
필수 기본 원칙 (Essential fundamentals)
대부분의 차단은 사람들이 기본을 무시하기 때문에 발생합니다. 이국적인 도구들을 찾기 전에, 이것들을 먼저 제대로 수행하세요.
robots.txt 및 서비스 약관 (Terms of Service) 확인
거의 모든 사이트는 루트 디렉토리(예: example.com/robots.txt)에 자동화된 클라이언트가 접근할 수 없는 경로를 알려주는 robots.txt를 게시합니다. 이를 무시하면 단순히 더 빨리 차단될 뿐만 아니라, 관할권과 데이터에 따라 법적 리스크를 초래할 수 있습니다. 만약 사이트에서 공식 API를 제공한다면 그것을 사용하세요. API는 데이터로 들어가는 승인된 구조화된 문이며, 이를 둘러싼 HTML을 스크래핑하는 것보다 항상 더 안정적일 것입니다.
속도 늦추기 (Slow down)
사람들이 탐지되는 가장 흔한 이유는 인간이 브라우징할 수 있는 속도보다 훨씬 빠르게 서버에 요청을 퍼붓기 때문입니다. 요청 사이에 지연 시간 (delays)을 추가하고, 고정된 1초 간격이 아닌 가변적인 간격을 두세요. 완벽하게 규칙적인 타이밍은 그 자체로 봇 (bot) 신호가 되기 때문입니다. 무작위화된 몇 초 범위의 간격이 예의 바른 스크래핑을 위한 합리적인 시작점입니다.
오류를 우아하게 처리하기 (Handle errors gracefully)
429 Too Many Requests 또는 403 오류를 받았을 때, 즉시 좁은 루프 내에서 재시도하지 마세요. 그것은 소프트 스로틀링 (soft throttle)을 하드 차단 (hard ban)으로 격상시키는 가장 빠른 방법입니다. 물러나서 기다리고, 요청 속도를 줄이세요. 서버가 당신에게 보내는 신호를 존중하세요.
적절한 경우 신원 교체 (Rotate your identity where appropriate)
이는 IP 주소(프록시를 통해)를 교체하고, User-Agent와 헤더(headers)를 다양화하여 수천 개의 동일한 요청을 보내는 단일 기기처럼 보이지 않도록 해야 함을 의미합니다. 주거용(Residential) 및 모바일 프록시는 대부분의 안티봇(anti-bot) 시스템이 알려진 차단 목록(blocklists)에 유지하는 데이터센터(datacenter) IP보다 탐지하기가 더 어렵습니다.
이러한 기본 원칙들은 방어 체계가 느슨한 사이트에서는 큰 도움이 될 것입니다. 문제는 웹의 점점 더 많은 부분이 더 이상 느슨하게 방어되지 않는다는 점입니다.
브라우저 기반 스크래퍼가 차단되는 이유
여기가 대부분의 사람들이 실수하는 부분입니다. 위의 모든 규칙을 따르고, 완벽한 주거용 프록시를 교체하며, 결점 없는 Chrome User-Agent를 설정하더라도, 스크래퍼가 단 한 줄의 HTML을 받기도 전에 차단될 수 있습니다. 그 이유를 이해하려면 현대적인 안티봇(anti-bot) 시스템(Cloudflare, DataDome, Akamai, Kasada, PerimeterX/HUMAN)이 단 하나의 신호에만 의존하지 않는다는 점을 이해해야 합니다. 이들은 여러 계층(layers)을 결합하며, 스크래퍼는 이 모든 계층을 동시에 통과해야 합니다.
계층 1: TLS 및 네트워크 핑거프린팅 (TLS and network fingerprinting)
웹사이트가 귀하의 요청을 확인하기도 전에, 요청을 보내는 소프트웨어에 대해 이미 많은 것을 알아낼 수 있습니다. 스크래퍼가 연결될 때, TLS 핸드셰이크(TLS handshake)라고 불리는 보안 단계를 거칩니다. 이 과정 동안 핑거프린트(fingerprint) 역할을 하는 기술적 세부 정보가 전송됩니다.
문제는 Python의 requests나 Node의 axios와 같은 일반적인 스크래핑 도구들은 실제 브라우저처럼 보이지 않는 핑거프린트를 가지고 있다는 점입니다. 웹사이트는 이 핑거프린트를 귀하가 주장하는 브라우저와 비교합니다. 따라서 요청은 Chrome에서 오는 것이라고 말하지만, 핑거프린트가 명백히 Python 스크립트처럼 보인다면, 이는 귀하가 봇이라는 강력한 신호가 되며 페이지가 로드되기도 전에 요청이 차단될 수 있습니다.
계층 2: 브라우저 및 장치 핑거프린팅 (Browser and device fingerprinting)
첫 번째 검사를 통과하더라도, 웹사이트에는 봇을 탐지하는 또 다른 방법이 있습니다. 웹사이트는 브라우저에서 JavaScript를 실행하여 사용자의 장치와 브라우저에 대한 정보를 수집합니다. 여기에는 화면 크기, 그래픽 카드, 설치된 글꼴, 브라우저 설정 및 기타 수많은 세부 정보가 포함되며, 이들이 모여 고유한 브라우저 핑거프린팅 (Browser fingerprinting)을 생성합니다.
스크래핑 (Scraping)에 흔히 사용되는 헤드리스 브라우저 (Headless browsers)는 실제 브라우저와 정확히 똑같이 동작하지 않기 때문에 눈에 띄는 경우가 많습니다. 예를 들어, 헤드리스 모드에서 실행 중임을 드러내거나 웹사이트가 자동화를 식별하는 데 사용하는 속성 (Properties)을 노출할 수 있습니다. 이러한 흔적을 숨기려는 도구들이 존재하지만, 현대의 안티 봇 (Anti-bot) 시스템은 수십 개의 신호를 종합적으로 분석합니다. 한두 가지를 수정하는 것만으로는 대개 충분하지 않은데, 실제 브라우저는 완전히 속이기 어려운 일관되고 자연스러운 핑거프린팅을 가지고 있기 때문입니다.
계층 3: 행동 분석 (Behavioral analysis)
브라우저가 실제처럼 보이더라도, 실제 사람처럼 행동해야 합니다. 웹사이트는 단순히 어떤 브라우저를 사용하는지만 보는 것이 아니라, 사용자가 페이지와 어떻게 상호작용하는지도 관찰합니다. 마우스 이동 방식, 스크롤 방식, 타이핑 속도, 클릭 위치, 페이지에 머무는 시간 등을 추적할 수 있습니다.
봇은 종종 사람과 다르게 행동합니다. 마우스를 완벽하게 직선으로 움직이고, 거의 즉각적으로 클릭하며, 완벽하게 일정한 속도로 타이핑합니다. 실제 사용자는 훨씬 덜 예측 가능합니다. 잠시 멈추기도 하고, 실수를 하기도 하며, 다양한 속도로 스크롤하고 자연스럽게 상호작용합니다. 현대의 안티 봇 (Anti-bot) 시스템은 머신러닝 (Machine learning)을 사용하여 이러한 패턴을 포착하므로, 하나의 신호가 정상적으로 보이더라도 여러 개의 의심스러운 신호가 모이면 봇이라는 사실이 드러날 수 있습니다.
이것이 바로 신뢰할 수 있는 브라우저 기반 스크래퍼 (browser-based scraper)를 구축하는 것이 매우 어려운 이유입니다. 브라우저를 실제처럼 보이게 만들고, 실제 사람처럼 행동하게 하며, 새로운 탐지 기술을 끊임없이 따라잡아야 합니다. 즉, 웹사이트들이 방어 체계를 계속해서 개선하는 동안 브라우저 핑거프린트 (browser fingerprints), 프록시 (proxies), 그리고 인간과 유사한 행동 (human-like behaviour)을 모두 관리해야 한다는 것을 의미합니다. 이는 복잡하면서도 비용이 많이 드는 지속적인 전쟁이 됩니다.
대안: 모바일 앱 레이어를 통한 스크래핑
많은 스크래퍼들이 놓치고 있는 관점의 전환이 여기 있습니다. 앞서 언급한 거의 모든 탐지 메커니즘은 웹상의 브라우저 자동화 (browser automation)를 잡아내기 위해 구축되었습니다. 하지만 전 세계 데이터의 엄청난 양이 현재 모바일 앱에 존재하며, 이는 종종 웹사이트에는 노출조차 되지 않는 데이터입니다. 그리고 모바일에서의 탐지 양상은 매우 다릅니다.
이 지점에서 Mobilerun이 등장합니다. Mobilerun은 헤드리스 브라우저 (headless browser)를 구동하는 대신, 클라우드 상의 실제 Android 및 iOS 기기에서 AI 에이전트 (AI agent)를 실행합니다. 이 에이전트는 화면을 보고, 앱의 UI 접근성 트리 (UI accessibility tree)를 읽으며, 사람이 하는 방식대로 탭하기, 스와이프하기, 스크롤하기, 타이핑하기 등을 통해 상호작용합니다. 그리고 앱으로부터 직접 구조화된 데이터 (structured data)를 추출합니다.
이것이 왜 탐지 문제를 대폭 피할 수 있는가
브라우저 스크래퍼가 적발되는 이유는 합성된 환경 (synthetic environment)을 제시하기 때문이며, 탐지 시스템은 바로 그러한 흔적 (artifacts)을 찾아내도록 특수 제작되었습니다. Mobilerun은 여러 측면에서 상황을 변화시킵니다.
에뮬레이터나 헤드리스 브라우저가 아닌 실제 기기입니다.
실제 휴대폰에는 브라우저 기반 봇이 가진 많은 식별 요소들이 없습니다. navigator.webdriver 플래그가 없으며, 헤드리스 브라우저 식별자도 없고, 기기와 일치하지 않는 브라우저 핑거프린트도 없습니다. 하드웨어와 운영 체제(OS)부터 센서와 설치된 앱에 이르기까지 모든 것이 실제 사람의 휴대폰에서 기대할 수 있는 것과 정확히 일치합니다.
이는 매우 큰 장점입니다. 안티 봇 (anti-bot) 시스템은 일관성을 탐색하기 때문입니다. 실제 기기는 자연스럽게 일관성을 제공하는 반면, 에뮬레이터 (emulator)와 가상 기기 (virtual devices)는 인위적인 하드웨어 세부 정보나 실제가 아님을 나타내는 미묘한 징후들을 노출하는 경우가 많습니다. 물리적인 휴대폰은 단순히 일반적인 휴대폰처럼 동작하므로, 실제 사용자와 구별하기가 훨씬 더 어렵습니다.
실제 센서 및 네트워크 특성.
물리적인 휴대폰은 가짜로 만들기 매우 어려운 노이즈가 포함된 가속도계 (accelerometer) 및 자이로스코프 (gyroscope) 데이터, 그리고 통신사 네트워크 (carrier-network) 및 지연 시간 (latency) 패턴을 생성합니다. 일부 플랫폼은 합성된 제어 (synthetic control)를 잡아내기 위해 센서 텔레메트리 (sensor telemetry)를 UI 제스처와 교차 검증하기도 합니다. OS를 통해 구동되는 실제 기기에서 발생하는 텔레메트리는 진본입니다.
구조적으로 설계된 인간과 유사한 상호작용.
에이전트 (agent)가 기기의 일반적인 입력 레이어 (input layer)를 통해 동작하기 때문에, 그 행동은 수천 개의 동일한 HTTP 요청을 발사하는 스크립트보다 실제 사용자의 행동에 훨씬 더 가깝습니다.
진정한 기기와 진정한 상호작용 모델에서 시작함으로써, 여러분은 더 이상 브라우저 탐지 (browser-detection) 스택 전체와 싸울 필요가 없습니다. 여러분은 그것을 상당 부분 우회한 것입니다.
본질적으로, 모바일 접근 방식은 가치 있는 데이터가 앱 내부에 존재하거나, 모바일 앱이 보안이 강화된 웹사이트보다 방어력이 낮은 모든 곳에서 빛을 발합니다. 일반적인 예시는 다음과 같습니다:
- 웹사이트는 강력하게 보호되어 있지만 앱이 주요 인터페이스인 여행, 음식 배달, 차량 호출 또는 식료품 앱의 가격 및 가용성 정보.
- 마켓플레이스 및 부동산 앱의 매물 데이터.
- 활동의 상당 부분이 모바일 우선(mobile-first)인 플랫폼의 소셜 및 리뷰 데이터.
- 공개 API가 전혀 없는 앱(대부분의 앱이 이에 해당함)으로, UI가 유일한 진입로인 경우.
종합하기
단순한 웹사이트를 스크래핑하는 경우라면 간단하게 유지하세요. robots.txt를 준수하고, 공식 API가 있다면 그것을 사용하며, 요청을 보내는 속도를 제한하고, 타이밍을 다양화하며, 오류를 우아하게 처리하세요. 많은 웹사이트에서는 그것만으로도 충분합니다.
강력한 안티 봇 (anti-bot) 보호 기능이 있는 사이트를 스크래핑하는 경우라면 훨씬 더 어렵습니다. 현대적인 웹사이트들은 봇을 탐지하기 위해 네트워크 핑거프린트 (network fingerprint), 브라우저 핑거프린트 (browser fingerprint), 그리고 행동 패턴을 확인합니다. 헤드리스 브라우저 (headless browsers)를 사용하여 이 모든 것을 통과하는 데에는 지속적인 노력이 필요합니다.
만약 데이터가 모바일 앱에서 사용 가능하다면, 실제 휴대폰을 사용하는 것이 훨씬 더 쉬운 접근 방식이 될 수 있습니다. Mobilerun과 같은 플랫폼을 사용하면 실제 Android 또는 iOS 기기를 자동화할 수 있으므로, 브라우저 특화 탐지 기술들을 많이 피할 수 있습니다. 당신은 실제 사용자인 척하는 것이 아니라, 실제 기기를 사용하고 있는 것이기 때문입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기