Headless는 더 이상 숨겨지지 않습니다
7일 전, cside는 2026년의 headless 브라우저 탐지에 관한 기술 분석을 발표했습니다. 핵심 내용은 이제 탐지 도구가 픽셀 단위에서 headless 세션을 잡아낸다는 점입니다. 표면상 동일한 브라우저, 동일한 운영체제라도 WebGL 출력 결과가 다릅니다. AudioContext 타이밍도 다릅니다. 폰트 열거 결과도 다릅니다. 각각은 미세한 신호이지만, 점수를 매기기에 충분할 만큼 일관적입니다.
해당 글은 WebDecoy의 Browser Fingerprinting 2026 분석이 나온 지 일주일 만에 게시되었으며, 다른 접근 방식을 통해 동일한 결론에 도달했습니다. 올해 초 발표된 Browserless의 State of Web Scraping 2026에서도 명확히 지적되었습니다. headless 브라우저는 사용자가 직접 조작하는 브라우저보다 더 자주 차단되며, 그 격차는 계속 벌어지고 있습니다.
프로덕션 환경에서 Puppeteer나 Playwright를 실행하고 있다면, 이는 비용 곡선을 변화시킵니다.
실제로 무엇이 바뀌었는가
과거의 headless 탐지는 navigator.webdriver === true, 비어 있는 plugins 배열, User-Agent의 HeadlessChrome 중심이었습니다. 2020년 이후의 모든 패치 플러그인이 이를 처리합니다. 이에 따라 탐지 도구는 스택의 더 하위 계층으로 이동했습니다.
소프트웨어 렌더링이 가장 큰 요소입니다. 실제 사용자의 브라우저는 GPU를 사용합니다. 컨테이너에서 실행되는 headless 환경은 대개 소프트웨어 래스터라이저로 폴백합니다. WebGL 렌더러 문자열이 다르게 읽힙니다. 동일한 명목 입력에 대해 픽셀 출력이 달라집니다. 동일한 입력값에서도 Canvas 핑거프린트가 갈라집니다. 이는 단순한 boolean 검사로 걸러지는 것이 아니라, 확률적 점수에 반영됩니다.
AudioContext가 두 번째입니다. 페이지가 오디오 컨텍스트를 인스턴스화하고 샘플 레이트나 채널 수를 요청할 때, headless 환경은 일반적인 데스크톱 세션과 미세하게 다른 값으로 응답합니다. 동일한 작업에 대한 타이밍이 예측 가능한 패턴으로 틀어집니다.
폰트 열거가 세 번째입니다. 사용자 머신에는 사용 이력에 따라 여러 폰트가 설치되어 있습니다. 컨테이너 이미지에는 엄선된(그리고 적은) 폰트 세트만 포함됩니다. 핑거프린팅 스크립트가 50개 폰트에 걸쳐 100개의 공통 문자열 너비를 측정할 때, 누락된 폰트 패턴은 결정적인 식별 단서가 됩니다.
각각의 신호는 약할 수 있습니다. 그러나 이들이 결합되고 탐지 도구가 여전히 확인하는 기존 신호들과 합쳐지면, 조치를 취하기에 충분할 만큼 높은 신뢰도로 자동화 세션과 사용자 세션을 구분하는 점수가 완성됩니다.
탐지 도구가 지금 투자하는 이유
수치상으로 R&D 예산 투입이 마침내 정당화되었기 때문입니다.
F5의 2026 Advanced Persistent Bot Report에 따르면, 기존 봇 완화 조치를 적용한 후에도 스크래퍼 트래픽이 전 세계 웹 트래픽의 10.2%를 차지합니다. 이는 기존 도구로는 방어자가 0으로 만들 수 없는 잔여 트래픽입니다. 해당 비중을 1%포인트라도 더 차단하는 것은 투자 가치가 있습니다.
Cloudflare가 7월 13일에 Precursor를 출시했습니다. Precursor는 포인터 움직임, 키보드 타이밍, 포커스, 가시성 등 지속적인 클라이언트 측 행동 신호를 수집하여 페이지 새로고침 간에도 유지되는 실시간 봇 점수에 반영합니다. 당사는 2주 전에 이와 관련한 글을 작성했습니다. 1년 전 지문(fingerprint)을 점수화했던 방식 그대로 이제는 세션 행동을 점수화합니다.
Precursor와 일련의 headless 전용 신호들은 개별적인 움직임이 아닙니다. 모두 동일한 전략에 속합니다. 단일 request를 독립적으로 평가하는 대신, 측정 가능한 모든 축에서 전체 세션을 평가합니다.
실제로 지불하고 있는 두 가지 비용
사내에서 직접 headless를 운영하는 것은 서류상으로는 늘 저렴해 보였습니다. 프레임워크는 무료이고 브라우저도 무료이며 컨테이너 비용도 저렴하기 때문입니다. 그러나 2026년에는 청구서에 표시되지 않는 두 가지 항목이 추가되었습니다.
유지보수 비용은 사람들이 쉽게 체감하는 부분입니다. 예전에는 puppeteer-extra-plugin-stealth을(를) 사용하면 패치 없이도 몇 달간 유지할 수 있었습니다. 하지만 2026년 기준 실질적인 방어 체계가 갖춰진 사이트에서는 고작 몇 주만 버팁니다. headless 업데이트, 브라우저 업데이트, 방어 솔루션 업데이트, 플러그인 업데이트 사이에서 엔지니어 한 명이 스택을 정상 유지하는 데만 매달 꼬박 일주일을 소모할 수 있습니다. 아무도 이를 로드맵에 넣지 않지만, 결국 로드맵을 잠식하게 됩니다.
탐지 비용은 성공률 차트에 가려져 있어 사람들이 눈치채지 못하는 부분입니다. 방어 수준이 높은 타깃에서의 차단율이 점차 상승합니다. 재시도 횟수도 증가합니다. 이에 따라 성공적인 fetch당 비용도 함께 올라갑니다. 흔히 이를 "사이트 방어가 강화되었다"고 여기며 넘어가곤 합니다. 일부는 사실입니다. 하지만 일부는 여러분의 스택과 일반 브라우저 사이의 간극이 점점 벌어지면서 발생하는 현상입니다. 두 원인 모두 동일한 방향으로 작용합니다.
두 비용 중 어느 하나만으로 프로젝트가 중단되지는 않습니다. 그러나 둘이 합쳐지면 자체 구축(build)과 솔루션 구매(buy) 사이의 득실 계산이 완전히 달라집니다.
데이터 팀에 미치는 영향
모든 스크래핑에 브라우저가 필요한 것은 아닙니다. 이 원칙은 변하지 않았습니다. 하지만 많은 headless 배포가 단순 HTTP 호출로 충분했던 페이지에서 시작되었기에 다시 한번 강조할 필요가 있습니다.
타깃 데이터가 XHR이나 JSON endpoint를 통해 전달된다면 브라우저를 건너뛰십시오. HTTP request가 더 저렴하고 빠르며 애초에 이러한 지문 신호를 전달하지도 않습니다. 7월 okhlopkov 글에서도 올바른 우선순위를 제시합니다. API 및 XHR이 우선이며, 그다음은 임베디드 JSON, 페이지가 반드시 요구할 때만 브라우저를 사용하고, LLM 추출은 다른 모든 방법을 검증한 뒤에만 적용해야 합니다.
브라우저가 반드시 필요한 사이트의 경우 핵심은 방어 수준입니다. 가벼운 보호(rate limit, User-Agent 필터, Referer 검사)가 적용된 곳에서는 잘 구성된 headless 스택이 여전히 유효하며 비용 부담도 적습니다. 강력한 보호(전체 세션 점수화를 적용한 Cloudflare, PerimeterX, DataDome)가 적용된 곳에서는 실질적인 비용이 발생하며 이는 누적됩니다. 바로 이 지점에서 손익 계산이 뒤바뀝니다.
아무도 이야기하지 않는 중간 지대도 존재합니다. 아예 차단하지 않고 조용히 서비스 품질을 떨어뜨리는 사이트들입니다. 달라진 가격, 누락된 목록, 사라진 이미지와 리뷰 등이 그 예입니다. 스크래퍼는 성공했다고 보고하지만 데이터는 조용히 오염되어 있습니다. 핑거프린팅 점수가 차단 여부뿐만 아니라 콘텐츠 표시 방식을 결정하는 입력값으로 사용되면서 이러한 실패 유형은 점점 더 흔해지고 있습니다.
자신이 이 중간 지대에 속해 있는지 구분할 수 없다면, 이미 해당 영역에 속해 있을 가능성이 높습니다.
향후 전망
Headless는 아무도 면밀히 살펴보지 않았기에 10년 동안 통했던 임시방편이었습니다. 지난 2년 사이에 상황이 바뀌었습니다. 탐지 솔루션 벤더들은 마침내 남아 있는 스크래퍼 트래픽까지 차단할 가치가 있다고 판단했으며, 자동화를 격리하기 가장 쉬운 계층을 공략하기 시작했습니다.
다음 라운드는 더 정교한 패치 플러그인의 싸움이 아닐 것입니다. 접근성 도구, 구형 GPU, 사내 프록시, 프라이빗 DNS 등 일반적이지 않은 환경을 가진 실제 사용자들에게 발생할 오탐(false-positive) 비율을 감수하면서까지 탐지 정확도를 유지할 가치가 있는지 사이트들이 저울질하는 단계가 될 것입니다. Headless 탐지 정확도를 1포인트 올릴 때마다 실제 사용자의 일부를 잃게 됩니다. 실제 군비 경쟁은 Puppeteer 설정이 아니라 바로 이 트레이드오프에서 벌어집니다.
이미 Headless 비용을 치르고 있다면 최소한 그 손실을 측정하십시오. 그렇지 않다면 인지하지도 못한 채 지불하는 숨은 비용이 될 뿐입니다.