설명
브라우저 핑거프린팅은 브라우저에서 다양한 속성을 수집해 안정적인 식별자로 변환합니다. 쿠키가 없어도 User-Agent, 언어, 시간대, 화면 해상도, 설치된 글꼴, 캔버스 렌더링 해시, WebGL 렌더러 문자열, 오디오 컨텍스트 핑거프린트를 비롯한 수십 가지 신호의 조합만으로도 세션 간에 단일 브라우저를 놀라울 정도로 정확하게 식별할 수 있습니다.
크게 나누면 수동 핑거프린팅과 능동 핑거프린팅 두 가지 범주가 있습니다. 수동 핑거프린팅은 브라우저가 암묵적으로 노출하는 속성, 즉 User-Agent, Accept-Language, sec-ch-ua 클라이언트 힌트를 읽습니다. 능동 핑거프린팅은 브라우저의 렌더링 엔진, 오디오 엔진, GPU, 타이밍 특성을 탐지하는 JavaScript를 실행한 뒤 해시를 계산합니다.
스크래핑과 자동화에서 핑거프린팅이 중요한 이유는 IP 로테이션만으로는 충분하지 않기 때문입니다. 10,000개의 레지덴셜 IP를 로테이션하더라도 모든 요청이 동일한 캔버스 핑거프린트와 동일한 Playwright 기본 User-Agent를 사용한다면, 대상 사이트는 10,000개의 요청을 모두 동일한 스크래퍼 인스턴스로 연관 지을 수 있습니다. Cloudflare, Akamai, PerimeterX, Datadome 같은 현대적인 안티봇 시스템은 모두 IP 분석과 함께 핑거프린팅을 적극적으로 활용합니다.
작동 방식
브라우저가 핑거프린팅 코드가 포함된 페이지를 로드하면, 스크립트는 브라우저 속성(UA, 언어, 플러그인, 화면, 시간대)을 열거하고, 특정 텍스트와 그라디언트로 숨겨진 캔버스를 그린 다음 렌더링된 픽셀을 읽어들이며(캔버스 핑거프린트), WebGL 컨텍스트를 생성하여 GPU 벤더 및 렌더러 문자열을 읽고(WebGL 핑거프린트), 오디오 API로 톤을 생성하여 스펙트럼을 읽으며(오디오 핑거프린트), 하드웨어 신호를 위해 특정 연산(math.tan, performance.now 드리프트)의 시간을 측정합니다.
이 모든 값은 해시되어 핑거프린트 ID로 만들어지고 서버로 다시 전송됩니다. 이러한 속성 중 단 열두 개만 조합해도 매우 고유하기 때문에, 결과 ID는 쿠키 삭제, 새 세션, 다른 IP에서도 안정적으로 브라우저를 식별합니다.