스크래퍼를 위한 브라우저 핑거프린팅 설명
브라우저 핑거프린팅은 쿠키나 계정이 아니라 브라우저의 여러 특성을 합쳐 방문자를 식별하는 방식입니다. 사이트는 이를 재방문자 확인, 사기 탐지, 자동화 식별에 사용합니다. 웹을 스크래핑한다면 반드시 마주치게 됩니다. 이 가이드는 무엇이 측정되는지, 왜 값 하나의 불일치가 문제가 되는지, 그리고 공개 데이터를 수집하기 위해 하나의 일관되고 올바르게 행동하는 프로필을 유지하는 방법을 설명합니다. 또한 핑거프린트 조정으로 할 수 있는 일과 해서는 안 되는 일의 한계도 다룹니다.
핑거프린트를 이루는 요소
어떤 값 하나만으로 브라우저를 식별할 수는 없지만, 작은 값 여러 개가 합쳐지면 대개 식별이 됩니다. 흔한 입력값은 다음과 같습니다.
- User agent와 클라이언트 힌트. 브라우저가 보고하는 브라우저 이름, 버전, 운영체제.
- 화면과 창 크기. 화면 크기, 색 깊이, 장치 픽셀 비율, 뷰포트 크기.
- 언어와 시간대.
Accept-Language헤더,navigator.languages, 브라우저가 보고하는 시간대. - 설치된 글꼴. 페이지가 감지할 수 있는 글꼴. 운영체제와 설치된 소프트웨어마다 다릅니다.
- 캔버스, WebGL, 오디오 출력. 그래픽이나 오디오 스택이 테스트 이미지나 소리를 그리고 처리하는 방식의 미세한 차이.
- 네트워크 수준 특성. TLS 핸드셰이크, HTTP/2 설정, 요청 헤더의 순서. JavaScript가 실행되기 전에도 서버에 보입니다.
핑거프린팅 스크립트는 이것들을 해시나 점수로 합칩니다. 안정적이고 특이한 신호가 많을수록 결과는 더 쉽게 식별됩니다.
불일치가 눈에 띄는 이유
실제 브라우저는 내부적으로 일관됩니다. 운영체제는 글꼴과 맞고, 시간대는 언어 설정과 맞으며, 화면 크기는 실행 중인 기기와 맞습니다. 스크래퍼는 의도하지 않아도 이 일관성을 깨뜨리는 경우가 많습니다.
- 글꼴이 설치되지 않은 서버에서 보내는 데스크톱 브라우저의 user agent.
- IP 주소는 다른 나라에 있는데 독일어
Accept-Language헤더를 보내고, 시간대는 둘 중 어느 쪽과도 맞지 않는 요청. - 실제 모니터에서는 쓰지 않는 창 크기를 보고하는 헤드리스 환경.
- 실행할 때마다 새로 만드는 프로필. 그래서 쿠키와 방문 이력이 재방문자처럼 보이지 않습니다.
각 불일치는 작은 신호입니다. 이들이 합쳐지면 요청이 "일반 방문자"에서 "더 자세히 살펴볼 필요가 있음"으로 넘어갈 수 있습니다.
1단계: 내 환경 측정하기
내가 통제하는 핑거프린트 테스트 페이지나 로컬에서 실행하는 진단 페이지를 불러오면, 페이지가 내 클라이언트에 대해 무엇을 알아내는지 볼 수 있습니다. 값들을 보고, 그것들이 하나의 일관된 기기를 설명하는지 자문하세요. 다음은 그중 몇 가지를 출력하는 최소한의 Playwright 예제입니다.
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context(locale="en-GB", timezone_id="Europe/London")
page = context.new_page()
page.goto("https://example.com") # 내가 소유한 페이지로 바꾸세요
print(page.evaluate("""() => ({
language: navigator.language,
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
platform: navigator.platform,
viewport: [innerWidth, innerHeight]
})"""))
browser.close()
2단계: 프로필마다 하나의 정체성 유지하기
가장 유용한 습관은 각 스크래핑 정체성을 하나의 프로필로 다루는 것입니다. 하나의 특성 세트를 주고, 수명 내내 그대로 유지하세요.
- 브라우저 빌드 하나, user agent 하나, 운영체제 하나.
- 트래픽이 오는 지역에 맞는 로케일, 언어, 시간대.
- 실제 화면에 맞는 뷰포트와 장치 배율.
- 프로필이 재방문자처럼 행동하도록 유지되는 영구 쿠키 저장소.
요청마다 이 중 하나를 바꾸는 것은, 그대로 유지하는 것보다 더 의심스럽습니다. 일관성이 프로필을 평범하게 보이게 만듭니다.
3단계: 방문자처럼 프로필의 속도 조절하기
핑거프린팅은 입력 중 하나일 뿐입니다. 사이트는 하나의 프로필이 사이트를 얼마나 빠르게 돌아다니는지도 지켜봅니다. 1분에 상품 페이지를 200개 불러오는 프로필은, 핑거프린트가 무엇을 말하든 사람이 아닙니다. 요청을 분산하고, 결과를 캐싱하고, 페이지가 멈추라고 신호하면 중단하세요. 속도 조절에 대한 자세한 내용은 사이트 차단 없이 스크래핑하기 체크리스트에 있습니다.
4단계: 한계 알기
핑거프린트 조정으로 자동화된 프로필을, 거기에 없는 사람처럼 보이게 만들 수는 없습니다. 핑거프린팅에 의존하는 사이트는 보통 요청 속도 제한, 계정 확인, 때로는 캡차를 함께 사용합니다. 캡차가 나타나면 핑거프린트를 더 조정하는 것보다 솔버에서 토큰을 받아야 합니다. Scarnox에서 현재 운영 중인 캡차 유형은 PopularCaptcha이며, PopularCaptcha Python 가이드에서 요청 방법을 보여 줍니다. 존재하는 위젯 전반을 알고 싶다면 캡차 유형 설명을 읽어 보세요.
더 중요한 점은, 핑거프린트 회피가 사이트 규칙을 무시해도 된다는 허가증이 아니라는 것입니다. 운영자가 자동화된 접근을 제한했다면 올바른 행동은 멈추는 것이지, 프로필을 더 눈에 띄지 않게 만드는 것이 아닙니다. 핑거프린팅은 개인정보 문제이기도 합니다. 일부 사이트는 이를 이용해 사람들을 방문 간에 추적하며, 프로젝트에 필요한 것만 수집해야 하는 또 하나의 이유입니다.
스크래핑은 책임감 있게
- 사이트를 스크래핑하기 전에
robots.txt와 약관을 읽으세요. - 요청은 적고 느리게 보내고, 이미 수집한 것은 캐싱하세요.
- 실제 사람을 사칭하거나 차단을 우회하기 위해 프로필을 만들지 마세요.
- 필요하지 않은 개인 데이터는 저장하지 말고, 저장하는 데이터는 신중하게 다루세요.
다음 단계로 가기
대상이 브라우저 수준의 검사 뒤에 있다면 헤드리스 브라우저 감지부터 시작하세요. 자동화된 브라우저에 특화된 신호를 다룹니다. 콘텐츠를 보려면 JavaScript가 필요한 페이지는 JavaScript 웹사이트 스크래핑에서 다룹니다.
무료 체험 크레딧으로 시작하세요. 카드 등록은 필요 없습니다. 계정을 만들고 직접 소유한 페이지를 대상으로 PopularCaptcha 흐름을 시험해 보세요. 현재 요금은 가격 페이지에서 확인할 수 있습니다.