Obscura: AI 에이전트와 웹 스크래핑을 위한 Rust 기반 경량 헤드리스 브라우저

Obscura 소개

웹 스크래핑이나 AI 에이전트 자동화에서 자바스크립트가 실행된 실제 페이지를 얻으려면 보통 헤드리스 Chrome을 띄웁니다. 문제는 Chrome이 데스크톱 브라우징을 위해 만들어진 무거운 소프트웨어라는 점입니다. 수백 MB의 메모리와 바이너리, 느린 시작 시간은 페이지 하나를 여는 데는 문제가 없지만, 수백·수천 개의 페이지를 대규모로 처리하는 자동화에서는 비용으로 돌아옵니다.

Obscura는 이 자동화 시나리오에 초점을 맞춰 Rust로 작성한 헤드리스 브라우저 엔진입니다. V8을 통해 실제 자바스크립트를 실행하고 Chrome DevTools Protocol(CDP)을 지원하므로, Puppeteer나 Playwright에서 연결해 쓰는 헤드리스 Chrome을 그대로 대체할 수 있습니다. 기존 스크립트에서 접속 대상만 Obscura로 바꾸면 되는 구조입니다.

이 프로젝트는 명령줄 도구이면서 동시에 서버로도 동작합니다. 단일 페이지를 가져오는 fetch, CDP WebSocket 서버를 띄우는 serve, 여러 URL을 병렬로 긁는 scrape, 그리고 AI 에이전트에 브라우저 자동화 도구를 노출하는 mcp 명령을 제공합니다. 탐지 회피를 위한 스텔스 모드와 트래커 차단 기능도 빌드 옵션으로 포함되어 있습니다.

Obscura의 핵심 구성

Obscura의 기능은 크게 다섯 축으로 정리됩니다. 각 기능은 독립적으로도 쓰이지만, 결합하면 대규모 스크래핑과 에이전트 자동화를 위한 하나의 실행 환경이 됩니다.

  • V8 자바스크립트 실행: V8 엔진을 직접 임베드해 페이지의 실제 자바스크립트를 렌더링합니다. --v8-flags로 힙 크기 같은 V8 옵션을 그대로 전달할 수 있습니다.
  • CDP 호환: Chrome DevTools Protocol을 구현해 Puppeteer·Playwright와 연동됩니다. Target, Page, Runtime, DOM, Network, Fetch 등 여러 CDP 도메인을 지원합니다.
  • 병렬 스크래핑: scrape 명령이 워커 프로세스로 여러 URL을 동시에 처리하며, 동시 실행 수를 --concurrency로 조절합니다.
  • 스텔스 모드: 지문(fingerprint) 무작위화와 트래커 차단을 켜는 빌드 기능입니다.
  • MCP 서버: 브라우저 자동화 도구를 Model Context Protocol로 노출해 Claude Desktop, Cursor 같은 AI 에이전트가 직접 페이지를 조작하게 합니다.

Obscura와 헤드리스 Chrome 비교

Obscura의 설계 목표는 데스크톱 브라우징이 아니라 대규모 자동화입니다. 저자는 헤드리스 Chrome과 비교한 수치를 다음과 같이 제시합니다. 아래 값은 프로젝트가 직접 측정해 README에 공개한 것으로, 실행 환경에 따라 달라질 수 있습니다.

항목 Obscura 헤드리스 Chrome
메모리 30 MB 200 MB 이상
바이너리 크기 70 MB 300 MB 이상
탐지 회피 내장 없음
페이지 로드 85 ms 약 500 ms
시작 시간 즉시 약 2초

별도 벤치마크 저장소에서 공개한 페이지 로드 측정에서도 정적 HTML 51ms, 자바스크립트·XHR·fetch가 섞인 페이지 84ms 같은 값을 제시하며, 같은 페이지에서 Chrome은 수백 ms대라고 밝히고 있습니다. 전체 벤치마크 스위트는 별도 저장소인 obscura-benchmark에 있습니다.

Obscura의 스텔스 모드

--features stealth로 빌드하면 탐지 회피 기능이 활성화됩니다. 세션마다 GPU·화면·캔버스·오디오·배터리 지문을 무작위화하고, navigator.webdriver를 실제 Chrome처럼 undefined로 두며, 네이티브 함수 문자열을 위장하는 등 자동화 브라우저임을 드러내는 신호를 줄입니다.

여기에 더해 3,520개 도메인을 대상으로 하는 트래커 차단이 함께 동작합니다. 분석·광고·텔레메트리·지문 수집 스크립트가 아예 로드되지 않도록 막으며, --stealth 옵션과 함께 자동으로 켜집니다.

Obscura의 설치와 사용법

미리 빌드된 바이너리를 릴리스 페이지에서 내려받거나, Docker 이미지, 소스 빌드 중 하나를 선택할 수 있습니다. 저자는 Chrome, Node.js, 별도 의존성이 필요 없다고 설명합니다. 소스에서 빌드하려면 Rust 1.75 이상이 필요하며, 첫 빌드는 V8을 소스에서 컴파일하므로 약 5분이 걸립니다.

# Docker로 CDP 서버 실행 (127.0.0.1:9222)
docker run -d --name obscura -p 127.0.0.1:9222:9222 h4ckf0r0day/obscura

# 소스 빌드 (스텔스 모드 포함)
git clone https://github.com/h4ckf0r0day/obscura.git
cd obscura
cargo build --release --features stealth

기본 사용은 fetch로 페이지를 가져오는 것입니다. --eval로 자바스크립트 표현식을 실행하거나, --dump으로 HTML·텍스트·링크·마크다운 등 원하는 형태로 출력할 수 있습니다.

# 페이지 제목 가져오기
obscura fetch https://example.com --eval "document.title"

# 자바스크립트를 렌더링한 뒤 HTML 덤프
obscura fetch https://news.ycombinator.com --dump html

# 여러 URL을 병렬로 스크래핑
obscura scrape url1 url2 url3 --concurrency 25 --format json

CDP 서버를 띄우면 Puppeteer나 Playwright에서 WebSocket 엔드포인트로 연결합니다. 다음은 저장소가 제시하는 Playwright 연동 예시입니다.

import { chromium } from 'playwright-core';

const browser = await chromium.connectOverCDP({
  endpointURL: 'ws://127.0.0.1:9222',
});

const page = await browser.newContext().then(ctx => ctx.newPage());
await page.goto('https://en.wikipedia.org/wiki/Web_scraping');
console.log(await page.title());

await browser.close();

Obscura의 MCP 서버와 AI 에이전트 연동

Obscura는 브라우저 자동화 기능을 Model Context Protocol(MCP) 서버로도 제공합니다. obscura mcp 명령으로 stdio 방식의 서버를 띄우면 Claude Desktop 같은 클라이언트가 하위 프로세스로 실행하고, --http --port 8080 옵션을 주면 네트워크로 접속하는 HTTP 방식으로 동작합니다.

{
  "mcpServers": {
    "obscura": {
      "command": "obscura",
      "args": ["mcp"]
    }
  }
}

노출되는 도구에는 URL로 이동하는 browser_navigate, 현재 페이지의 URL·제목·본문 텍스트를 돌려주는 browser_snapshot, CSS 선택자로 요소를 클릭하는 browser_click, 입력값을 채우는 browser_fill, 자바스크립트를 실행하는 browser_evaluate 등이 있습니다. 에이전트는 이 도구들을 호출해 실제 웹 페이지를 탐색하고 조작할 수 있습니다.

Obscura의 라이선스

Obscura는 Apache License 2.0으로 공개되어 있어 개인 및 상업적 목적으로 자유롭게 사용할 수 있습니다. 저자는 오픈소스 엔진이 앞으로도 Apache-2.0으로 유지되며 기능 제한 없이 완전한 형태로 제공된다고 밝히고 있습니다.

:house: Obscura 공식 홈페이지

:books: Obscura 문서 사이트

:github: Obscura 프로젝트 GitHub 저장소

더 읽어보기




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! 텔레그램(Telegram)이나 Slack/Discord/Teams/Dooray/GoogleChat 등으로도 새 글 알림을 받으실 수 있습니다. :smiley:

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck:

1개의 좋아요