OpenClaw 에이전트에 사이드카 MCP로 스텔스 브라우저를 추가했습니다. 아키텍처와 테스트 결과 공개
요약
OpenClaw 에이전트의 안티 봇 탐지 문제를 해결하기 위해 스텔스 브라우저를 사이드카 MCP 방식으로 추가한 아키텍처를 소개합니다. 성능 저하를 최소화하기 위해 필요할 때만 활성화하는 전략과 Linux 환경에서의 Xvfb 설정 트러블슈팅을 다룹니다.
핵심 포인트
- 안티 봇 대응을 위해 전체 교체 대신 사이드카 MCP 패턴 채택
- 필요 시에만 활성화하여 브라우저 콜드 스타트 비용 최적화
- Linux 헤드리스 환경에서 Chrome 실행을 위한 Xvfb 설정 필수
- 기본 브라우저와 스텔스 브라우저의 역할 분담을 통한 효율성 증대
지난달 Cloudflare의 봇 챌린지(bot challenge)로 인해 제 OpenClaw의 일일 브라우저 트래픽 중 8%가 소실되었습니다. 기본 브라우저 도구는 Gmail이나 대시보드에서는 잘 작동했습니다. 하지만 안티 봇(anti-bot) 게이트를 만나는 순간 무너졌습니다. 그래서 저는 스텔스 브라우저(stealth browser)를 사이드카 MCP(sidecar MCP)로 추가했습니다. 이는 별도의 프로세스이며, 기본적으로는 비활성화되어 있고, 탐색 시 97개의 도구가 나타납니다. 저는 이를 대체재가 아닌 보완재로서 연결했습니다. 여기 아키텍처와 테스트 결과, 그리고 제가 거의 실수할 뻔했던 부분을 소개합니다.
솔직한 설정: 왜 포크(fork)가 아닌 사이드카인가
OpenClaw 브라우저 도구를 포크(fork)하여 nodriver(탐지되지 않는 Chrome 포크)로 교체한 뒤, 이를 새로운 기본값으로 배포하고 싶은 유혹이 있었습니다. 거의 그렇게 할 뻔했습니다. 하지만 냉정하게 시간을 계산해 보았습니다. 스텔스 브라우저는 모든 안티 핑거프린팅(anti-fingerprint) 플래그를 사용하여 Chrome을 부팅하는 데 약 6~7초가 걸립니다. 반면 기본 브라우저 도구는 기존 브라우저 데몬(daemon)을 사용하기 때문에 1초 미만 내에 시작됩니다.
제 에이전트가 수행하는 작업의 95%(이메일 확인, 대시보드 스크래핑, DEV.to 게시 등)에는 기본 브라우저가 더 빠르고 충분합니다. Cloudflare, DataDome 또는 기타 안티 봇 미들웨어(anti-bot middlewares)를 만나는 나머지 5%의 작업에는 강력한 무기가 필요합니다. 그래서 사이드카(sidecar) 방식을 선택했습니다.
# scripts/stealth-mcp-entry.sh — Xvfb를 부팅한 후 MCP 서버를 실행합니다
#!/usr/bin/env bash
set -euo pipefail
...
MCP 엔트리는 enabled: false로 등록되어 있습니다. 특정 세션에서 이를 켜려면 openclaw mcp configure stealth-browser-mcp --enable && openclaw mcp reload를 실행하면 됩니다. 스텔스 작업이 끝나면 --disable로 다시 끌 수 있습니다. 사이드카 패턴을 사용하면 에이전트가 실제로 필요할 때만 콜드 스타트(cold-start) 비용을 지불하게 됩니다.
아무도 경고해주지 않는 Linux 디스플레이 문제
이 부분에서 40분을 허비했습니다. nodriver는 실제 Chrome 프로세스를 실행합니다. 헤드리스(headless) Linux 환경에서 실제 Chrome을 실행하려면 X 서버(X server)가 필요합니다. DISPLAY가 설정되어 있지 않으면 Chrome은 즉시 다음과 같은 오류와 함께 종료됩니다:
ERROR:ui/ozone/platform/x11/ozone_platform_x11.cc:256] Missing X server or $DISPLAY
The platform failed to initialize. Exiting.
해결 방법은 단 하나의 스크립트, scripts/start-xvfb.sh입니다. 이 스크립트는 /tmp/.X99-lock에 오래된 락 파일 (lock file)이 있는지 확인하고, 만약 PID가 종료된 상태라면 이를 제거한 뒤, 백그라운드에서 Xvfb :99 -screen 0 1920x1080x24를 실행합니다. 멱등성 (Idempotent)을 보장하며, Xvfb가 이미 실행 중이라면 0을 반환합니다.
# scripts/start-xvfb.sh — 축약본
DISPLAY_NUM="${DISPLAY_NUM:-99}"
RES="${RES:-1920x1080x24}"
...
만약 Xvfb가 설치되지 않은 서버에 이를 배포한다면, 실패 모드는 조용히 발생합니다. 즉, Chrome이 해당 한 줄의 에러와 함께 그냥 종료되어 버립니다. 래퍼 스크립트 (wrapper script)는 바이너리가 누락된 경우를 명시적으로 로그에 남겨, 다음 작업자가 잘못된 레이어를 디버깅하며 40분을 허비하지 않도록 합니다.
실제로 작동함을 확인시켜 준 테스트 매트릭스 (test matrix)
세 가지 탐지 표면 (detection surfaces)이 있습니다. 저는 이 세 가지 모두가 깨끗하게 통과하기를 원했습니다.
# 1. Cloudflare 자체 테스트 페이지
curl -sL https://nowsecure.nl | grep -i "you are human"
...
사이드카 (sidecar)가 연결된 제 Pop!_OS 장비에서의 결과입니다:
| 테스트 | 결과 | 비고 |
|---|---|---|
| nowsecure.nl (Cloudflare) | PASS | 챌린지(Challenge) 돌파, 페이지가 일반 브라우저로 인식됨 |
| ... |
두 번의 sannysoft 실패는 정직한 지표입니다. WebGL에는 GPU가 필요하지만, Xvfb에는 GPU가 없습니다. 텍스트 중심의 페이지에서 Cloudflare를 우회하는 제 사용 사례에서는 이것이 문제가 되지 않습니다. 만약 WebGL도 필요하다면, Xvfb를 xvfb-run --auto-servernum으로 교체하고 위에서 언급한 swiftshader 플래그를 추가하세요. 그런 조치 없이 프로덕션 환경의 헤드리스 (headless) Linux 박스에서 WebGL 비중이 높은 스텔스 작업을 실행하는 것은 권장하지 않습니다.
사이드카를 신뢰하기 전에 감사 (audit)할 수 있게 해주는 프로브 (probe) 패턴
enabled: false로 설정된 97개의 도구를 가진 MCP 서버는, 에이전트가 이를 호출하도록 허용하기 전에 반드시 검사하고 싶은 대상입니다. OpenClaw의 MCP CLI는 제가 정확히 필요로 하는 정보를 노출합니다:
openclaw mcp show stealth-browser-mcp
# → enabled: false
# → command: /home/themachine/.openclaw/workspace/scripts/stealth-mcp-entry.sh
...
probe는 enabled를 true로 전환하지 않고도 연결하여 서버가 노출하는 모든 항목을 나열한 뒤 연결을 해제합니다. 이는 MCP 서버를 위한 nmap -sV와 동일한 역할을 하며, 새로운 MCP를 등록한 후 가장 먼저 실행해야 할 작업입니다. 만약 probe 결과가 0개의 도구(tools)로 나온다면, Chrome이 시작되기도 전에 래퍼 스크립트(wrapper script)가 고장 난 것입니다. 만약 97개로 나온다면, 안심하고 스위치를 켜도 좋습니다.
배운 점
-
포크(fork)보다는 사이드카(Sidecar). 브라우저 작업이 필요한 5%의 상황을 위해 6~7초의 콜드 스타트(cold-start)가 발생하는 것은 괜찮습니다. 하지만 그렇지 않은 95%의 상황에서는 낭비입니다. 에이전트가 그 가치를 창출할 때만 비용을 지불하세요.
-
헤드리스 리눅스(Headless Linux)는 공짜가 아니다. Xvfb는 50줄짜리 스크립트에 불과하지만, 시작하기 전에 미리 작성해두지 않으면 단 한 줄의 Chrome 에러 때문에 오후 시간을 통째로 날릴 수 있습니다. 스텔스 브라우저를 클론(clone)하기 전에 Xvfb 래퍼를 먼저 작성하세요.
-
하나가 아닌 세 가지 테스트. Cloudflare의 자체 페이지만으로는 충분하지 않습니다. 그 페이지는 정당한 브라우저들이 통과하도록 설계되어 있습니다. sannysoft와 CreepJS가 거짓을 잡아냅니다. 세 가지 모두 실행하세요. Cloudflare는 통과(green)했지만 CreepJS가 실패(red)했다면, 그 세션은 일주일 안에 차단될 것입니다.
-
활성화하기 전에 조사(Probe)하라. 꺼져 있지만 보이는 사이드카 MCP는 감사(auditable)가 가능합니다. 켜져 있는 사이드카 MCP는 신뢰를 가정하는 것입니다. 속도 게이트(speed gate)보다 감사 게이트(audit gate)가 더 중요합니다.
-
경로는
/tmp에서 살아남아야 한다. 처음에는 도구를/tmp/stealth-browser-mcp에 클론했습니다./tmp정리 작업이 실행되기 전까지 3일 동안은 잘 작동했습니다. 이를~/.openclaw/workspace/tools/로 옮기고 MCP 설정에서STEALTH_MCP_HOME의 대상 경로를 변경하세요. 175MB의 종속성(dependencies)은 유지할 가치가 있습니다.
전체 결과, 스크린샷, 그리고 제가 계속 업데이트하고 있는 운영 문서(operator doc)는 제 워크스페이스의 skills/stealth-browser/stealth-browser-mcp.md에 있습니다. 만약 가끔 안티 봇(anti-bot) 관문을 만나는 OpenClaw 에이전트를 실행 중이라면, 사이드카 패턴이 올바른 형태입니다. 대체재도 아니고, 포크도 아닙니다. 그저 에이전트가 언제 사용해야 할지 알고 있는, 도구 상자 안의 또 다른 도구일 뿐입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기