---
title: "봇 탐지 전부 통과한다는 Firefox 기반 Playwright 래퍼가 나왔다"
published: 2026-05-19T20:51:59.000Z
canonical: https://jeff.news/article/2941
---
# 봇 탐지 전부 통과한다는 Firefox 기반 Playwright 래퍼가 나왔다

invisible_playwright는 Playwright와 호환되는 패치된 Firefox로, 브라우저 지문 탐지와 봇 탐지 테스트를 통과한다고 주장하는 오픈소스 프로젝트다. 핵심은 자바스크립트 런타임에서 값을 덮어씌우는 방식이 아니라 Firefox의 Gecko 경로를 C++ 레벨에서 패치해 탐지기가 ‘거짓말 흔적’을 잡기 어렵게 만든다는 점이다. 자동화 탐지, 크롤링 방어, 지문 일관성 설계에 관심 있는 개발자에게는 꽤 자극적인 사례다.

- invisible_playwright는 “탐지 안 되는 Playwright용 Firefox”를 목표로 내건 프로젝트임
  - 패치된 Firefox를 제공하면서도 Playwright 호환성을 100% 유지한다고 주장함
  - 동기·비동기 API를 그대로 쓰고, 기존 Playwright 코드에서 전환도 작게 끝난다는 식으로 설명함
  - 지원 플랫폼은 Windows x86_64와 Linux x86_64

- 제시한 탐지 테스트 결과가 꽤 세게 나옴
  - Google은 세션을 “사람일 가능성이 매우 높음”으로 분류했고, reCAPTCHA v3 점수는 0.90이라고 주장함
  - Fingerprint Pro에서는 봇 탐지, VPN 플래그, 변조 탐지, 개발자 도구 탐지가 모두 “Not detected”로 나왔다고 함
  - CreepJS의 거짓말 탐지에서도 “0 lies”를 강조함. 안티디텍트 브라우저는 보통 여기서 한두 군데 모순이 나와 점수가 무너진다는 주장임

> [!IMPORTANT]
> 이 글의 핵심은 “값을 숨겼다”가 아니라 “브라우저 전체 지문이 서로 말이 맞는다”는 주장임. 봇 탐지는 단일 필드보다 모순을 잡는 쪽으로 진화하고 있다는 얘기임.

- 기존 안티디텍트 브라우저의 약점으로 자바스크립트 패치를 지목함
  - 많은 Chromium 기반 도구는 `navigator`, `WebGLRenderingContext.getParameter`, Canvas API 같은 값을 주입 스크립트로 덮어쓴다고 설명함
  - 문제는 이런 오버라이드가 `Function.prototype.toString()`, 프로퍼티 descriptor, 열거 순서, prototype 변조 검사에서 흔적을 남긴다는 것
  - CreepJS 같은 탐지기는 바로 이런 “거짓말 흔적”을 모아 신뢰도를 깎음

- invisible_playwright는 Firefox를 C++ 레벨에서 패치하는 쪽을 택함
  - 값이 자바스크립트 shim에서 나오는 게 아니라 Gecko의 정상 경로를 통해 반환되도록 만든다는 설명임
  - 그래서 페이지 입장에서는 브라우저가 그냥 자기 값을 말하는 것처럼 보이고, 탐지기가 잡을 오버라이드 흔적이 줄어든다는 논리임
  - Navigator, screen, GPU/WebGL, Canvas, fonts, audio, WebRTC, timezone, DevTools 탐지, SOCKS5 인증까지 여러 레이어를 같이 맞춘다고 함

- 특히 WebRTC 쪽 디테일이 흥미로움
  - WebRTC의 srflx 주소는 프록시 egress IP로 보이게 하고, host candidate는 사설 LAN 주소처럼 합성한다고 설명함
  - 기본 Firefox는 mDNS 호스트명 같은 세션 단위 신호가 나올 수 있는데, 이것도 탐지기에는 안정적인 fingerprint가 될 수 있음
  - 프로젝트는 이런 후보 값을 스푸핑된 네트워크와 맞춰 바꿔 실제 공인 IP가 새지 않게 한다고 주장함

- Chromium 기반 자동화가 기본적으로 의심받는다는 시각도 깔려 있음
  - 주거용 프록시를 쓰는 봇 트래픽이 Chromium 계열에 많이 몰려 있어서, 탐지기들이 Chromium 모양 자체를 위험 신호로 가중할 수 있다는 주장임
  - Chromium fork는 Blink, V8, ANGLE 같은 오픈소스 레이어를 가져가도 Chrome의 비공개 구성요소나 릴리스 cadence까지 완전히 맞추기 어렵다고 봄
  - 그래서 이 프로젝트는 Firefox 기반으로 가되, 런타임 덮어쓰기 대신 엔진 레벨에서 일관성을 맞추는 쪽을 선택함

- 지문 값은 하드코딩이 아니라 preference와 seed로 제어된다고 함
  - 각 세션은 실제 Firefox telemetry에서 뽑은 GPU, 오디오, 폰트 등 약 400개 필드를 기반으로 고유하고 일관된 프로필을 샘플링한다고 설명함
  - seed를 기록하면 같은 GPU, 같은 Canvas hash, 같은 audio context를 재현할 수 있음
  - 특정 GPU 렌더러, 화면 크기, CPU 동시성 같은 값은 pin으로 고정하고 나머지는 seed 기반으로 유지할 수 있다고 함

- 비교표에서는 상용 안티디텍트 브라우저보다 한 단계 깊게 패치했다고 주장함
  - Multilogin Mimic, GoLogin Orbita, AdsPower, Dolphin Anty 등은 Chromium fork와 자바스크립트 오버라이드 중심이라고 비교함
  - Kameleo나 Multilogin Stealthfox처럼 Firefox 프로필을 제공하는 제품도 런타임 오버라이드 패턴은 비슷하다고 봄
  - 다만 경쟁 제품 점수는 프로젝트 측 자체 테스트 결과라, 그대로 객관적 벤치마크처럼 받아들이긴 조심해야 함

> [!WARNING]
> 이런 기술은 자동화 테스트 연구에도 쓰일 수 있지만, 서비스 약관 우회나 남용 자동화에도 바로 연결될 수 있음. 방어 관점에서는 “탐지 우회가 가능한 가정”을 두고 설계를 다시 봐야 함.

---

## 기술 맥락

- 이 프로젝트의 선택은 “브라우저 표면만 덮기”가 아니라 “렌더링 엔진 경로에서 일관된 값을 내기”예요. 봇 탐지기가 단순히 `navigator.webdriver` 하나만 보는 시대가 아니라, 여러 API 값이 서로 모순되는지까지 보니까 이런 접근을 택한 거예요.

- 자바스크립트 오버라이드는 구현이 쉽지만, 그 자체가 흔적을 남긴다는 문제가 있어요. 함수 문자열, descriptor, 프로퍼티 순서, prototype 변경 같은 메타 정보가 원래 브라우저와 달라지면 탐지기는 “값은 그럴듯한데 말투가 이상하다”는 식으로 잡아낼 수 있거든요.

- Firefox의 Gecko를 C++ 레벨에서 패치하면 값이 정상 엔진 경로에서 나온 것처럼 보일 수 있어요. 그래서 프로젝트는 Canvas, WebGL, 폰트, 오디오, WebRTC, 시간대, 프록시 같은 레이어를 따로따로 속이는 게 아니라 하나의 지문 프로필로 맞추는 쪽을 강조해요.

- 방어하는 팀 입장에서는 이게 꽤 불편한 신호예요. 특정 필드 하나로 자동화를 차단하는 규칙은 쉽게 깨질 수 있고, 세션 행동, 계정 평판, 요청 패턴, 서버 쪽 리스크 모델까지 같이 봐야 하는 이유가 여기에 있어요.

## 핵심 포인트

- Firefox를 C++ 레벨에서 패치해 Playwright 자동화를 사람 세션처럼 보이게 만든다고 주장
- reCAPTCHA v3 점수 0.90, Fingerprint Pro 봇 탐지 실패, CreepJS 거짓말 0개 같은 수치를 제시
- Chromium 기반 안티디텍트 브라우저의 자바스크립트 오버라이드 방식이 탐지 가능하다고 비판
- WebRTC, Canvas, WebGL, 폰트, 오디오, 시간대, 프록시까지 지문을 일관되게 맞추는 구조를 내세움

## 인사이트

이 프로젝트는 공격 도구로도 보일 수 있지만, 방어자 입장에서는 브라우저 지문 탐지가 어디까지 흔들릴 수 있는지 보여주는 테스트 케이스다. ‘navigator 값 몇 개 보면 되겠지’ 수준의 봇 탐지는 점점 설 자리가 없어지고 있다.
