같은 Chromium 엔진, 다른 자동화 — Playwright / MCP / 브라우저 확장 해부

Claude 같은 에이전트에게 브라우저를 쥐여줄 수 있다는 이야기를 요즘 자주 듣습니다. 그런데 구체적으로 들어가 보면 Playwright, Playwright MCP, Claude-in-Chrome 확장, 그리고 헤드리스 Chromium 이라는 네 가지 선택지가 혼재되어 있고, 이름이 비슷해서 어느 상황에 무엇을 써야 할지 꽤 헷갈렸습니다.
자동화를 직접 만들어 보다가 "분명 같은 엔진을 쓰는데 왜 결과가 다르게 나올까" 하는 질문이 생겼고, 그 답을 찾는 과정에서 이 네 가지를 레이어 관점 으로 구분해서 보면 덜 혼란스럽다는 것을 알게 되었습니다. 이 글은 그 정리입니다.
네 가지가 결국 같은 엔진입니다
먼저 용어부터 정리해 보면, 이렇게 배치할 수 있습니다.
Chromium — 브라우저 엔진 본체. Chrome 의 오픈소스 기반이며, 나머지 도구들은 결국 이 엔진 위에 올려져 있습니다.
Playwright — Microsoft 가 만든 브라우저 자동화 라이브러리. Chromium / Firefox / WebKit 를 프로그램적으로 제어할 수 있게 해 줍니다.
Playwright MCP — Claude Code 가 Playwright 를 MCP (Model Context Protocol) 로 래핑해 LLM 에이전트가 쓸 수 있게 노출한 도구입니다. 내부에서는 여전히 Playwright + Chromium 이 돌아갑니다.
Claude-in-Chrome 확장 — 사용자가 평소 쓰는 Chrome 에 확장을 설치해 Claude 가 그 세션을 원격 제어하게 하는 방식입니다.
사용자 일상 Chrome — 기준점으로서의 "사람이 쓰는 브라우저" 입니다.
즉 네 가지 도구가 같은 엔진을 다른 목적으로 꺼내 쓴 것 이라는 점이 먼저 확인되어야 합니다. 여기서부터 비로소 차이를 이야기할 수 있습니다.
실행 주체와 사용자 개입에 따른 비교
네 가지가 언제 어디서 실행되는지, 사용자가 얼마나 개입해야 하는지에 따라 이렇게 나뉩니다.
도구 | 실행 주체 | 사용자 개입 | 주요 용도 |
|---|---|---|---|
헤드리스 Playwright (Node 스크립트) | Node 프로세스 | 없음 (무인) | CI E2E 테스트, 배치 스크래핑 |
Playwright MCP | Claude (MCP 도구 호출) | 세션 중 협업 | 에이전트가 한 번에 브라우저 작업 처리 |
Claude-in-Chrome 확장 | 사용자 Chrome + 확장 | 실시간 옆에서 | 사용자 로그인 세션 연장 |
일반 Chrome | 사람 | 전부 | 기준점 |
이 표만 놓고 보면 "그러면 Playwright MCP 로 다 해결되는 것 아닌가" 싶지만, 실제로 만져 보면 더 미묘한 차이가 드러납니다.
차이를 만드는 건 "쿠키의 수명 주기"
헤드리스 Playwright 스크립트를 짜 보다가, 로그인이 필요한 사이트에서 막힌 적이 있습니다. 사용자가 평소 쓰는 Chrome 에서 로그인한 뒤 쿠키를 추출해 스크립트에 주입했는데, 어떤 요청은 통과하고 어떤 요청은 차단되는 현상이 일어났습니다.
원인을 따라가다 보니, 결국 "쿠키가 어디서 발급되고 어디서 사용되는가" 의 차이라는 것을 알게 되었습니다. 두 가지 수명 주기가 있습니다.
외부 주입형 — 사용자 일상 Chrome 에서 로그인해서 쿠키를 추출하고, 다른 Chromium 인스턴스에 주입.
내부 발급형 — 같은 Chromium 인스턴스 안에서 로그인하고, 그 상태 그대로 자동화를 이어감.
문제는 전자의 경우 쿠키를 잘 주입했어도 그 쿠키를 발급한 브라우저와 지금 쓰는 브라우저가 서로 다르다 는 점입니다. 많은 서비스가 보안을 위해 쿠키를 특정 세션 지문 (fingerprint) 에 묶어 발급하기 때문에, 외부에서 건너온 쿠키는 재검증 단계에서 "이 쿠키의 원래 주인이 아닌 것 같다" 는 판단이 내려지고, 그때부터 추가 확인을 요구하거나 차단이 시작됩니다.
같은 엔진을 써도 쿠키가 자라난 흙 이 다르면 재검증 단계에서 갈라진다는 것이, 네 가지 도구를 가르는 가장 큰 변수였습니다.
브라우저 fingerprint 라는 변수
브라우저 지문은 한 가지 값이 아니라 여러 시그널의 조합입니다. 대표적으로 이런 것들이 있습니다.
JavaScript 런타임 속성 (
navigator.webdriver,navigator.plugins등)Canvas / WebGL 렌더링 결과 (GPU 드라이버, 폰트 차이로 픽셀 단위 다름)
설치된 폰트 목록, 화면 해상도, 시간대, 언어 설정
TLS 핸드셰이크 패턴 (ClientHello 구성, 확장 순서)
봇 탐지용 기법이라기보다, "이 요청이 방금 전 요청과 동일한 세션인지" 를 판별하는 기준점으로 이해하면 맥락이 잡힙니다. 네 가지 도구를 이 관점에서 다시 보면 이렇게 정리됩니다.
도구 | 로그인 발생 위치 | 사용 위치 | 지문 일관성 |
|---|---|---|---|
헤드리스 Playwright (쿠키 외부 주입) | 사용자 Chrome | Chromium 자동화 인스턴스 | ❌ 다름 |
헤드리스 Playwright (내부 로그인 + 같은 세션 유지) | Chromium 자동화 | Chromium 자동화 | ✅ 같음 (단 매번 로그인 필요) |
Playwright MCP | MCP 가 띄운 Chromium | 동일 Chromium | ✅ 같음 |
Claude-in-Chrome 확장 | 사용자 Chrome | 동일 사용자 Chrome | ✅ 같음 (사람과 완전히 동일) |
같은 Chromium 엔진이라고 해서 지문까지 같은 것은 아닙니다. 기본 User-Agent 부터 다르고, 자동화 플래그 노출 여부, 확장 설치 여부, 실행 환경이 조합되어 각기 다른 지문을 만듭니다.
그래서 언제 무엇을 쓸 것인가
이 차이가 정리되고 나면 선택이 훨씬 간단해집니다. 세 가지 대표적인 상황을 예로 들어 보겠습니다.
Case A — 로그인이 필요 없는 사이트의 E2E 테스트 / 배치 스크래핑
헤드리스 Playwright (Node) 가 가장 자연스럽습니다. CI 에서 주기적으로 돌리기 적합하고, 재현성이 필요한 자동화에 잘 어울립니다. 로그인 세션이 없으니 쿠키 수명 주기 문제 자체가 생기지 않습니다.
헤드리스 Playwright (Node)
├─ 완전 무인 실행 가능
├─ CI/CD 파이프라인에 통합 쉬움
└─ 공개 페이지 스크래핑 / E2E 테스트 / 스크린샷 비교Case B — 로그인이 필요한 작업을 에이전트에게 한 번에 시키기
Playwright MCP 가 유용합니다. 사용자가 세션 중에 MCP 가 띄운 브라우저에 로그인만 해 주면, 그 이후로는 같은 Chromium 안에서 에이전트가 이어받아 작업을 처리합니다. 세션이 살아있는 동안만 작동 하므로 무인 배치로는 쓸 수 없지만, "지금 한 번 처리해 달라" 식의 대화형 워크플로우에는 최적입니다.
Playwright MCP
├─ 사용자가 대화 시작 시 로그인 1회
├─ 같은 Chromium 인스턴스 안에서 에이전트가 후속 작업
└─ 세션 종료와 함께 환경도 정리됨Case C — 사용자 일상 세션을 그대로 이어받기
Claude-in-Chrome 확장이 적합합니다. 사용자가 평소 쓰는 Chrome 에 설치하므로 지문이 사람과 완전히 동일하고, 로그인 상태를 그대로 이용할 수 있습니다. 다만 사용자가 Chrome 을 켜 놓고 있어야 하고, 에이전트의 조작 속도가 사용자의 상호작용과 섞일 수 있다는 점은 감안해야 합니다.
정리 — 레이어를 구분해서 보기
돌이켜 생각해 보면, 처음에 혼란스러웠던 이유는 네 가지 도구를 같은 레이어 에 놓고 비교하려 했기 때문입니다. 사실 이 네 가지는 서로 다른 레이어에 있습니다.
엔진 — Chromium
엔진을 감싼 자동화 라이브러리 — Playwright
그 라이브러리를 LLM 도구로 노출한 프로토콜 — MCP
엔진을 사용자 기기에 묶은 실사용 브라우저 — Chrome + 확장
선택은 "엔진을 고르는 것" 이 아니라 "어느 레이어에서 작업을 풀 것인가" 에서 출발해야 덜 헷갈립니다. 무인 반복 작업은 라이브러리 레이어에서, 대화형 협업은 MCP 레이어에서, 사용자 본인의 세션 연장은 확장 레이어에서 풀리는 식입니다.
LLM 에이전트 시대에 브라우저를 쥐여주는 선택지는 앞으로도 늘어날 것 같습니다. 다만 엔진이 같다고 해서 서로 동등한 대체재는 아니라는 것, 그리고 차이를 만드는 핵심 변수는 "쿠키와 지문이 어디서 발급되어 어디에서 쓰이는가" 라는 것을 염두에 두면 선택이 한결 수월해진다는 생각이 들었습니다.
관련 글
Playwright MCP 19개 프로세스 사고, LaunchAgent HTTP 상주로 통합한 회고
Claude Code 대화 세션을 닫으면 stdio Playwright MCP 도 같이 종료될 줄 알았습니다. 8개 세션을 띄워두고서야 19개 프로세스 1.6GB 점유를 측정했고, LaunchAgent HTTP 상주 모델로 통합한 운영 회고입니다.
Claude Code MCP 서버 정리 — 불필요한 도구 제거로 토큰 35% 절약하기
Claude Code의 MCP 서버 10개를 분석해 불필요한 4개를 제거했습니다. MCP 도구 정의가 매 메시지마다 시스템 프롬프트에 들어가 71K 토큰을 소비하고 있었다는 사실, 그리고 실제 정리 과정을 공유합니다.
Playwright MCP 로 크롬 익스텐션 popup UI 평가하기
Playwright MCP 는 chrome-extension:// 컨텍스트에 직접 붙지 못합니다. chrome.* API 와 fetch 를 mock 해 익스텐션 popup 을 평범한 정적 페이지로 분장시키고, AI UI/UX 평가 하네스에 입력한 과정을 정리했습니다.