용어집

헤드리스 브라우저란 무엇인가요?

헤드리스 브라우저는 그래픽 사용자 인터페이스 없이 실행되는 실제 웹 브라우저로, Chrome DevTools Protocol이나 WebDriver 같은 API를 통해 프로그래밍 방식으로 제어되며, 자동화 테스트, 스크래핑, JavaScript가 많은 페이지 렌더링에 사용됩니다.

헤드리스 Chrome / Firefox가 JavaScript로 렌더링되는 사이트를 스크래핑하는 표준인 이유와 대중적인 드라이버(Playwright, Puppeteer, Selenium), 그리고 핑거프린트 트레이드오프를 이해합니다.

설명

헤드리스 브라우저는 보이는 창 없이 실행되면서 내비게이션, DOM 상호작용, 렌더링을 위한 프로그래밍 방식 API를 노출하는 일반 브라우저(Chrome, Firefox, WebKit)입니다. JavaScript를 실행하고, CSS를 적용하며, 쿠키를 처리하고, 일반 브라우저와 구분할 수 없게 동작합니다 — 유일한 차이는 UI 창이 없고 사람의 입력이 없다는 점입니다.

스크래핑에서 헤드리스 브라우저는 원하는 데이터가 JavaScript에 의해 클라이언트 측에서 렌더링될 때 반드시 필요합니다. 최신 웹 앱(React, Vue, Angular SPA)은 흔히 빈 HTML 껍데기를 반환하고 JS가 실행된 후에 채워지는데, `requests`나 `axios` 같은 일반 HTTP 클라이언트는 이 빈 껍데기만 보게 됩니다. 헤드리스 브라우저는 전체 페이지 생명주기를 실행하여 완전히 렌더링된 DOM을 제공합니다.

주요 드라이버로는 Playwright(Microsoft, 멀티 브라우저), Puppeteer(Google, Chrome/Firefox), Selenium(더 오래된 WebDriver 기반, 가장 폭넓은 언어 지원)이 있습니다. 각각은 내비게이션, 클릭, 입력, 요소 대기, 네트워크 요청 가로채기, 콘텐츠 추출을 위한 메서드를 제공합니다. 사람처럼 보여야 하는 자동화 작업에는 헤드리스 브라우저와 스텔스 플러그인, 레지덴셜 프록시를 결합한 조합이 표준 스택입니다.

작동 방식

Playwright/Puppeteer/Selenium을 통해 헤드리스 브라우저를 실행하면, 드라이버는 `--headless` 플래그와 함께 실제 Chromium(또는 Firefox/WebKit) 프로세스를 시작하고 디버깅 프로토콜(Playwright/Puppeteer의 경우 Chrome DevTools Protocol, Selenium의 경우 WebDriver)을 통해 연결합니다. 스크립트는 `page.goto`, `page.click`, `page.evaluate`와 같은 명령을 해당 프로토콜을 통해 전송하고, 브라우저는 마치 실제 사용자가 조작하는 것처럼 이를 실행합니다.

브라우저는 실제 브라우저가 수행하는 모든 작업을 처리합니다: TLS 핸드셰이크(자체 지문 포함), HTTP/2 또는 HTTP/3 협상, 쿠키 저장, JavaScript 실행, 레이아웃, 페인트, 하위 리소스에 대한 네트워크 요청. 스크립트는 이러한 작업 중 어느 것이든 가로채고, 요청/응답을 수정하고, 스크립트를 삽입하고, 렌더링된 DOM에서 데이터를 추출할 수 있습니다.

타입

Playwright

Microsoft의 최신 멀티 브라우저 드라이버입니다. Chromium, Firefox, WebKit을 지원합니다. 최고의 API 편의성, 내장된 대기 기능, 네트워크 인터셉션, 크로스 브라우저 테스트를 제공합니다. 신규 프로젝트를 위한 기본 선택입니다.

Puppeteer

Google의 Chrome 전용 헤드리스 드라이버입니다. 성숙하고 문서화가 잘 되어 있으며 순수 Chromium 워크플로에 적합합니다. Playwright보다 가볍지만 Chromium 계열 브라우저로 제한됩니다.

Selenium WebDriver

셋 중 가장 오래된 것으로, 가장 광범위한 언어 지원(Python, Java, C#, Ruby 등)을 제공합니다. 스크래핑에서는 Playwright/Puppeteer보다 사용성이 떨어지지만, 크로스 브라우저 테스트의 표준입니다.

스텔스 패치된 헤드리스 브라우저

안티 디텍션 패치가 적용된 헤드리스 브라우저: puppeteer-extra-plugin-stealth, playwright-extra/stealth, undetected-chromedriver. 기본 헤드리스 탐지 요소(navigator.webdriver, 누락된 플러그인 목록, 기본 User-Agent)를 마스킹합니다.

일반적인 사용 사례

JavaScript로 렌더링된 페이지 스크래핑 (SPA, 동적 콘텐츠)
자동화된 엔드투엔드 테스트
페이지를 PDF 또는 스크린샷으로 렌더링
로그인 또는 상호작용이 필요한 사이트 크롤링
양식 제출 및 다단계 워크플로우
시각적 회귀 테스트를 위한 정답(ground-truth) 스크린샷 생성
자주 묻는 질문

자주 묻는 질문

다음에 대한 일반적인 질문 헤드리스 브라우저.

원하는 데이터가 JavaScript로 렌더링되는 경우, 데이터를 추출하기 전에 페이지와 상호작용(클릭, 입력, 스크롤)해야 하는 경우, 또는 사이트가 통과를 위해 실제 JS 엔진이 필요한 클라이언트 측 안티봇 챌린지를 사용하는 경우입니다. 정적 HTML 페이지의 경우 일반 HTTP 클라이언트가 더 빠르고 가볍습니다.

기본적으로는 그렇습니다. 기본(vanilla) 헤드리스 Chrome은 `navigator.webdriver=true`를 설정하고 플러그인 목록이 누락되는 등의 특징을 보입니다. 스텔스 플러그인(puppeteer-extra-plugin-stealth, playwright-extra)이 이러한 부분을 패치합니다. 실제 사용자와 유사한 타이밍과 레지덴셜 IP를 결합하면, 잘 조정된 헤드리스 브라우저는 탐지하기가 매우 어렵습니다.

새로운 스크래핑 프로젝트라면 Playwright를 사용하세요. 더 나은 API, 내장된 대기 기능, 네이티브 네트워크 인터셉션, 멀티 브라우저 지원을 제공합니다. Chromium만 사용한다면 Puppeteer도 괜찮습니다. JS/Python을 넘어선 폭넓은 언어 지원이 필요하거나 기존 테스트 프레임워크와 통합해야 한다면 Selenium이 올바른 선택입니다.

launch 옵션에 프록시를 전달하세요. Playwright: `chromium.launch({ proxy: { server: 'http://gate.shifter.io:10000', username: '...', password: '...' } })`. Puppeteer(`--proxy-server=`)와 Selenium(chrome capabilities)도 동일한 패턴입니다. 세 드라이버 모두 HTTP와 SOCKS5 프록시를 지원합니다.

일반 HTTP 요청보다 느린 것은 사실입니다. 페이지를 렌더링해야 하기 때문입니다. 하지만 JS 비중이 높은 대상에서는 필요한 데이터를 반환하는 유일한 방법입니다. 정적 HTML의 경우 헤드리스 브라우저를 건너뛰고, SPA와 보호된 사이트의 경우 렌더링 비용은 피할 수 없습니다.

예. 대부분의 프로덕션 스크레이퍼는 AWS, GCP 또는 Browserless 같은 전문 프로바이더의 컨테이너에서 헤드리스 브라우저를 실행합니다. 메모리와 CPU가 병목이 되며, 각 Chromium 인스턴스는 200-500MB를 사용합니다. 높은 동시성을 위해서는 단일 대형 VM보다 Kubernetes 스타일의 플릿이 필요합니다.