Model Context Protocol을 통한 AI 에이전트를 위한 탐지 불가능한 브라우저 자동화
요약
본 기술 기사는 AI 에이전트가 탐지되지 않는 브라우저 자동화 환경을 구축하는 방법을 설명합니다. Model Context Protocol(MCP) 기반의 Stealth Chrome DevTools 서버는 안티봇 시스템 회피, 다중 세션 관리, 그리고 높은 동시 접속 처리 능력을 제공하여 전문적인 웹 크롤링 및 에이전트 개발에 활용됩니다.
핵심 포인트
- Model Context Protocol(MCP)을 통해 AI 에이전트에 연결 가능
- 안티봇 시스템(Cloudflare 등) 탐지 회피 기능 탑재
- 다수의 세션을 단일 백엔드에서 효율적으로 관리 (세트장용)
- 스텔스 인수 필터링으로 자동화 흔적 제거 및 지속성 확보
AI 에이전트를 위한 Model Context Protocol(MCP)을 통해 탐지할 수 없는 브라우저 자동화 — 50개 이상의 동시 Claude Code 세션을 위해 구축된 단일 백엔드.
Stealth Chrome DevTools MCP에 에이전트 연결하기 — 아래 문장을 모든 AI 코딩 에이전트(Claude Code, Codex, Cursor, Windsurf, OpenCode 등) 중 하나에 복사하여 붙여넣으면 서버가 설치되고 해당 에이전트에 등록되며 백엔드가 검증됩니다:
Fetch and execute the appropriate instructions to set me up for Stealth Chrome DevTools MCP from https://raw.githubusercontent.com/DevinoSolutions/stealth-chrome-devtools-mcp/main/agent-setup/prompt.md
여기서 가져오는 지침은 agent-setup/prompt.md입니다.
—
사람이 읽을 수 있는 형태로도 제공됩니다. 웹사이트에 로그인하는 정보는 여전히 사용자 본인의 것입니다: 에이전트가 브라우저를 준비하고, 사용자가 로그인을 준비합니다.
스마트 프로필 관리, 안티-탐지 스텔스 인수 필터링(stealth arg filtering), 강력한 프로세스 생명주기 처리가 가능한 독립형 stealth Chrome DevTools MCP 서버입니다. 완전한 안티봇 회피를 위해 nodriver (CDP 기반)로 구축되었습니다.
captcha-bypass.mp4
persistent-sessions.mp4
안티봇 시스템(Cloudflare, DataDome, PerimeterX 등)에 의해 탐지 불가능합니다. 이름 지정 세션(Named sessions) — 세션은 쿠키와 로그인을 유지하며, 새 세션은 default에서 시드됩니다.
스텔스 인수 필터링(Stealth arg filtering) — 30개 이상의 감지 가능한 Chrome 플래그(Puppeteer/Playwright 서명, 자동화 마커)를 자동으로 제거합니다. 다중 인스턴스 지원(Multi-instance support) — 여러 브라우저를 동시에 생성하고 관리할 수 있습니다. Claude Code 세트장용으로 구축됨(Built for fleets of Claude Code sessions) — 세션은 브라우저가 아닌 가벼운 stdio 프록시(약 60 MB의 상주 메모리) 비용이 발생합니다: 모든 세션은 데스크톱당 하나의 백엔드를 공유하며, Chrome은 세션이 생성된 곳에만 존재합니다. 62개의 세션이 동시에 연결된 상태로 측정되었으며; 동시 콜드 스타트는 50개 동시 세션에서 확장 테스트가 이루어졌고, 모두 단일 백엔드에서 몇 초 만에 사용 가능합니다 — 세트장용으로 구축됨을 참조하세요. 바쁜 세션은 재연결되고, 그때만 접미사(suffix)를 붙입니다 — session이라는 이름으로 생성된 브라우저는 여전히 해당 브라우저에 접속하며; github-session이 github-session-2가 됩니다.
다시 연결(re-attach)이 거부될 때만 고아 복구(Orphan recovery)— 누수된 브라우저 프로세스를 종료하지 않고 안전하게 정리합니다. 세션 지속성(Session persistence)— 새로운 세션은 default의 쿠키, 로그인 및 웹 데이터를 가져옵니다.
유휴 시간 초과 없음(Zero idle timeout)— 명시적으로 닫을 때까지 브라우저가 활성화 상태를 유지합니다. 전체 CDP 접근(Full CDP access)— DOM 조작, 네트워크 가로채기(interception), JavaScript 실행, 스크린샷 기능을 제공합니다.
uv tool install stealth-chrome-devtools-mcp==2.1.27
이 명령어는 ~/.local/bin/stealth-chrome-devtools-mcp에 버전 고정형 실행 파일을 설치합니다.
(Windows의 경우: %USERPROFILE%\.localin\.stealth-chrome-devtools-mcp.exe)
MCP 설정을 (예: claude_desktop_config.json, ~/.claude.json 등) 이 경로를 가리키도록 지정하세요:
{
"mcpServers": {
"stealth-chrome-devtools-mcp": {
...
Claude Code 한 줄 명령어 (Windows에서는 위의 .exe 경로 사용):
claude mcp add --scope user stealth-chrome-devtools-mcp -- ~/.local/bin/stealth-chrome-devtools-mcp
설정 파일에 왜 uvx를 사용하지 않나요? 작동은 하지만, uvx는 모든 클라이언트 세션 시작 시마다 패키지를 재해결(re-resolves)합니다. 각 Claude Code 세션은 자체 stdio 프록시를 실행하므로, 다수의 동시 세션(공유 백엔드는 50까지 확장 테스트됨)은 시작 과정을 패키지 해상도 폭풍으로 만듭니다. uv tool install은 모든 프록시에 즉각적이고 고정된 실행 파일을 제공합니다— 공유 백엔드, 프로필 처리, 그리고 세션별 브라우저 격리 동작이 동일하게 작동합니다. 나중에 업그레이드하려면: uv tool install stealth-chrome-devtools-mcp==<새 버전>
(또는 최신 릴리스를 추적하려면 uv tool upgrade stealth-chrome-devtools-mcp)
설정 파일에 대한 제로 설치 체험판 (첫 확인용으로는 괜찮지만, 다수 환경에는 부적합):
{
"mcpServers": {
"stealth-chrome-devtools-mcp": {
...
또는 pip를 통해 (pip install stealth-chrome-devtools-mcp==2.1.27), 해당 환경의 stealth-chrome-devtools-mcp 콘솔 스크립트를 command로 사용합니다.
충돌(Crashes)은 기본적으로 사용자 이름과 기계 이름을 제거한 상태로 유지 관리자에게 보고됩니다. 리포트가 무엇을 포함하는지, 그리고 어떻게 비활성화하는지는 오류 보고(Error Reporting)를 참조하세요.
일반적인 MCP 브라우저 서버는 클라이언트 세션당 하나의 서버 프로세스와 하나의 Chrome을 실행합니다. 이는 단일 세션에는 문제가 없지만 50개 세션에서는 재앙적입니다. 왜냐하면 모든 세션이 아무것도 하기 전에 전체 브라우저에 대한 비용을 지불하기 때문입니다. 이 서버는 다르게 설계되었습니다. Claude Code 세션은 얇은 stdio 프록시만 실행합니다. 브라우저는 데스크톱당 하나의 공유 백엔드에 존재하며, Chrome은 세션이 요청한 곳에만 존재합니다.
Windows 11 워크스테이션(2026-09-11)에서 62개의 Claude Code 세션을 동시에 연결하여 측정한 결과:
| 측정 항목 | |
|---|---|
| 공유 백엔드에 연결된 Claude Code 세션 수 | 62 |
| ... | 콜드 스타트: 한 번에 50개 세션, 모두 사용 가능 (initialize + tools/list) |
7.3초 (tests/test_startup_herd.py) | |
| 따뜻한 백엔드에 합류하는 51번째 세션 | 1.0초 |
이것이 플릿(fleet)에게 제공하는 이점:
메모리는 열어둔 세션 수에 따라가고, 사용한 브라우저 수에 비례합니다. 유휴 세션은 Chrome이 아닌 프록시만 유지합니다. 5개의 브라우저를 사이에 두고 60개 세션을 운영할 경우, 60개의 브라우저가 아닌 5개의 브라우저와 60개의 프록시에 대한 비용을 지불합니다.백엔드당 콜드 스타트는 한 번입니다. 첫 번째 세션이 파일 잠금(file lock) 하에 백엔드를 부팅하고, 나머지 모든 세션은 여기에 수렴하여 몇 초 만에 사용 가능해집니다. 나중에 도착하는 세션은 약 1초 만에 합류합니다.아무것도 남지 않습니다. 고아가 된 Chrome 프로세스는 활성 프로세스를 죽이지 않고 회수되며, Chrome이 실행된 후 실패한 스폰(spawn)은 자체 브라우저를 정리합니다.시작 과정이 패키지 해상도 폭풍이 아닙니다. uv tool install을 사용하면 모든 프록시는 고정된 실행 파일(pinned executable)이므로, 50개 세션이 함께 시작하더라도 패키지를 50번 다시 해상할 필요가 없습니다.
위의 세션별 및 브라우저별 수치는 용량을 계획할 때 고려해야 하는 값입니다. 백엔드 자체의 메모리 사용량은 세션들이 그것을 어떻게 사용하는지(캡처된 네트워크 바디, 저장된 요소 클론, 활성 탭)에 따라 달라지므로 상수값으로 제시되지 않았습니다.
**세션(session)**이란 이름이 지정되고 지속적인 Chrome 프로필입니다: `spawn_browser(session=
또는 stealthy spawn --session acme
같은 이름을 다시 요청하면 동일한 쿠키와 로그인 정보를 얻게 되며, 만약 브라우저가 여전히 열려 있다면 그 브라우저는 새 브라우저가 아니라 기존의 브라우저입니다.
default는 아무 이름도 지정하지 않았을 때 얻게 되는 세션입니다. 사람이 로그인하는 곳이며, 모든 새로운 세션은 이를 복사본으로 시작합니다.
session="default"
를 사용하면 이를 명시적으로 엽니다. 이는 예약된 이름이므로 (사용자 정의 이름으로는 사용할 수 없으며, master나 master-snapshot 역시 마찬가지입니다) 해당 메커니즘 자체의 디렉토리로 간주됩니다.** seed_from / --from**은 default로부터가 아니라 기존 세션에서 새로운 세션을 복사합니다:
stealthy spawn --session work --headed # 이 창에서 수동으로 로그인합니다.
stealthy spawn --session work2 --from work # 이미 로그인된 두 번째 세션입니다.
이것은 세션이 생성될 때만 적용됩니다. 이미 존재하는 세션에 대해 이 매개변수를 전달하는 것은 오류이며, 해당 세션이 실제로 어디에서 왔는지 이름을 알려줄 뿐입니다. 결코 조용한 무시(no-op)가 아니며, 수동으로 입력한 로그인 정보 위로 재시드되지도 않습니다.
소스는 열려 있을 수 있습니다. 단지 그 브라우저가 이 백엔드가 구동하는 브라우저여야 합니다. 즉, 스폰(spawn)을 통해 실행된 경우에 해당합니다 (위 예시는 work 창을 띄워 놓습니다). 그러면 쿠키가 실행 중인 브라우저에서 읽혀 새 세션으로 기록되며, spawn은 이를 알립니다:
seeded : seeded from work at 2026-09-21 14:02
cookies : 14 handed over from the running source
이 인계는 쿠키만 전달하며 다른 것은 아무것도 가져가지 않습니다. 모든 종류의 쿠키—세션(session), 영구(persistent), HttpOnly, Secure, SameSite=None, Partitioned—그리고 소스가 로그인된 모든 사이트를 가져가며, 단지 의도한 사이트만을 가져가는 것이 아닙니다. localStorage, sessionStorage, IndexedDB, Cache Storage, 서비스 워커 또는 저장된 비밀번호는 가져가지 않으므로, 토큰을 localStorage에 보관하는 사이트는 로그인되지 않습니다. 그러한 경우, 파일 복사가 읽을 수 있도록 먼저 소스를 닫아야 합니다. 인계가 실패하더라도 세션은 여전히 생성되고 작동합니다—이 경우 답변에는 cookies : NOT carried (…)라고 표시됩니다.
이 백엔드는 브라우저에서 열린 소스를 구동하지 않습니다. 다른 백엔드(다른 사람의 백엔드, 또는 사용자가 직접 시작한 Chrome)는 거부됩니다. 그 이유는 우리가 쿠키를 요청할 연결고리가 없기 때문이며, 라이브 프로필 파일 복사본에는 아무것도 포함되어 있지 않기 때문입니다.
--from default와 --from이 설정되지 않은 경우(즉, 같은 의미), 세 가지 결과가 발생합니다. 왜냐하면 default는 사용자가 직접 로그인하는 세션이며, 해당 창은 보통 열려 있기 때문입니다:
default창이 열려 있고 이 백엔드가 구동 중인 경우: 시드(seed)가 복사되고 라이브 jar 파일이 전달됩니다. (cookies : N handed over from the running source)- 우리가 구동하지 않는 Chrome에서 열린 경우: 시드가 복사되며, 아무것도 거부되지 않습니다. 시드는 해당 창이 마지막으로 닫힌 시점만큼만 신선하며, 이는
seeded라인에 표시됩니다 (SEED CHANGED SINCE). - 창이 닫힌 경우: 항상 그랬듯이 시드만 복사됩니다.
시드는 별도의, 닫혀서 복사 가능한 형태의 default(아래)이며, 해당 창이 닫힐 때 새로 고쳐집니다. 유일하게 거부되는 경우는 아직 시드가 존재하지 않고 default가 열려 있는 머신입니다. 안전하게 복사할 것이 아무것도 없으며, 라이브 디렉토리를 복사하면 원하는 로그인 정보가 빠진 세션이 전달될 것입니다. default 창을 한 번 닫으면 됩니다. 그러면 시드가 기록되고, 그 이후로는 열려 있든 아니든 작동합니다.
C:\stealth-mcp-browser-sessions\
master/ # `default` 세션 — 로그인 정보, 쿠키, 확장 프로그램
master-snapshot/ # 시드: 안전한 복사본이며, `default`가 닫힐 때 새로 고쳐집니다
...
디렉토리 이름은 역사적인 것이며 경로에서 보게 될 내용입니다. 사용자가 입력하는 단어와 도구가 답변하는 단어는 default와 시드입니다.
- 이름 없는 스폰(spawn)이
default가 비어 있을 때 열립니다. — 열기 전에 서버가 시드를 새로 고칩니다. default가 바쁠 때는 시드에서 일회용 복사본이 만들어집니다. — 복사본에는 모든 쿠키, 로그인 정보 및 세션 데이터가 포함됩니다.- 오래된(stale) 시드는 인증 파일이 변경될 때 자동으로 새로 고쳐집니다.
--from <세션>
해당 세션에서 새로운 세션을 복사합니다.
복사된 것이 어떤 세션이었든 그 내용은 기록됩니다: stealthy profiles
그리고 하나의 에이전트가 생성할 때마다 모두 seeded from <name> at <when>을 출력하며,
로그인 시도가 발생한 이후 소스(source)에 변경 사항이 생기면 SEED CHANGED SINCE 플래그를 설정합니다.
이것은 의도적인 동작으로, 한 세션에서 수행된 로그인이 다른 세션으로 자동으로 전달되지는 않습니다. 이를 요청하는 것이 --from입니다.
클론(Clones)은 재생 가능한 Chrome 캐시를 제외하므로 각각 수 GB가 아닌 몇 MB 크기입니다. 일회용 자동 클론은 닫으면 삭제되며, 저장 공간 제한(STEALTH_MCP_CLONE_STORAGE_CAP_GB, 기본값 10 GB)이 혹시라도 누수된 가장 오래된 유휴(idle) 클론을 회수합니다. 따라서 sessions/ 폴더는 크기가 제한됩니다. 용량 초과로 인한 삭제는 복구 가능합니다: 제거된 클론은 sessions/.trash/ 폴더로 이동하며, 지정된 보존 기간(STEALTH_MCP_CLONE_TRASH_RETENTION_HOURS, 기본값 24시간)이 지난 후에만 완전히 삭제되므로, 실수로 인한 삭제도 손실되기보다는 복원될 수 있습니다.
사용자가 명시적으로 생성한 이름 지정 프로필(예: github-session)은 유지되며 절대 삭제되지 않습니다. 하지만
spawn_browser(session="fleet") # 첫 호출에서 생성됨 (기본 시드의 복사본)
spawn_browser(session="fleet", seed_from="upup-b9be57135713-84488-27")
또는: fleet을 이미 실행 중인 브라우저를 만듦
fleet은 일반적인 이름의 세션이므로, 모든 이름 지정된 세션(named sessions) 속성이 여기에 적용됩니다:
close_instance는 프로필을 유지하며, 백엔드 재시작 시 동일한 instance_id 아래에서 브라우저에 다시 연결합니다
(그리고 fleet도 첫 번째로)
오직 kill-orphans --force만이 이를 제거할 수 있습니다. fleet으로의 재연결 실패는 해당 브라우저를 제거하는 대신 실행 중이고 기록된 상태로 남겨두는데, 이는 그 안에 있는 로그인을 다시 생성할 수 없기 때문입니다.
fleet을 요청하기
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub AI Tools의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기