Mochi.js: 고정밀 브라우저 자동화를 위한 Bun-Native 접근 방식
브라우저 자동화는 오랫동안 개발자와 안티봇 서비스 간의 숨바꼭질 게임이 되어 왔습니다. Playwright 및 Puppeteer와 같은 도구는 테스트를 위한 업계 표준이지만, 종종 정교한 탐지 시스템의 쉬운 표적이 되는 뚜렷한 지문(fingerprint)을 남깁니다. Mochi.js는 브라우저 정체성의 모든 측면이 논리적으로 일관되도록 보장함으로써 '지문' 문제를 해결하기 위해 설계된 Bun-native 프레임워크로 등장했습니다.
전통적인 자동화의 문제점
대부분의 자동화 라이브러리는 브라우저를 패치하거나 일반적인 탐지 벡터를 재정의하기 위해 스크립트를 주입하여 정체성을 숨기려고 시도합니다. 이는 종종 "Frankenstein 지문"을 생성합니다. 예를 들어, User-Agent는 브라우저가 macOS에서 실행 중이라고 주장하지만, WebGL 렌더러는 Linux 기반 환경임을 드러내는 식입니다. 이러한 불일치는 FingerprintJS Pro와 같은 현대적인 봇 탐지기가 찾는 바로 그 요소입니다.
Mochi.js의 5가지 핵심 기둥
고정밀 스텔스 기능을 달성하기 위해 Mochi.js는 다섯 가지 핵심 기술적 기둥을 중심으로 구축되었습니다:
1. 관계적 일관성 엔진 (Relational Consistency Engine)
속성을 무작위로 할당하는 대신, Mochi.js는 단일 (profile, seed) 쌍에서 지문을 유도하기 위해 48개의 규칙을 가진 유향 비순환 그래프 (DAG)를 사용합니다. 이를 통해 canvas, WebGL, audio, fonts, 그리고 WebGPU 데이터가 모두 관계적으로 일관되게 유지됩니다. 프로필이 macOS의 특정 Chrome 버전으로 설정되면, 다른 모든 지문 표면이 해당 특정 환경에 맞춰 조정되어, 일반적으로 봇 탐지를 유발하는 모순을 제거합니다.
2. Chromium-Native Fetch
봇이 탐지되는 가장 흔한 방법 중 하나는 TLS 핸드셰이크와 HTTP/2 지문 (JA3/JA4)을 통한 것입니다. Mochi.js는 Chrome을 사칭하기 위해 별도의 HTTP 레이어나 FFI를 사용하는 흔한 실수를 피합니다. 대신, session.fetch() 호출을 Chrome DevTools Protocol (CDP)를 통해 Chromium으로 직접 라우팅하여, 네트워크 트래픽이 정의상 실제 사용자의 브라우저와 구별할 수 없도록 보장합니다.
3. 행동적 합성 (Behavioral Synthesis)
스텔스는 단순히 브라우저가 무엇인지에 관한 것이 아니라, 브라우저가 어떻게 행동하는지에 관한 것입니다. Mochi.js는 인간의 상호작용을 시뮬레이션하기 위해 생체 역학적 모델을 구현합니다:
- Bezier Paths: 마우스 움직임에는 인간의 부정확함을 모방하기 위해 오버슈트(overshoot)와 수정 동작이 포함됩니다.
- Fitts's Law: 이동 시간은 대상의 거리와 크기에 따라 계산됩니다.
- Lognormal Digraph Delays: 타이핑 속도는 특정 키 조합 사이의 현실적인 지연 시간을 사용하여 시뮬레이션됩니다.
4. Probe-Manifest Harness
스텔스 기능을 유지하기 위해, 이 라이브러리는 "Probe-Manifest" 하네스를 포함합니다. 이 시스템은 실제 장치로부터 베이스라인을 캡처하고 CI 파이프라인에서 라이브 세션을 이 베이스라인과 비교합니다. 어떠한 불일치도 서면으로 작성된 근거를 통해 정당화되어야 하며, 이를 통해 도구가 탐지 가능한 상태로 퇴보하는 것을 방지합니다.
5. 통합 Bun-Native 스택
Patchright, fingerprint injectors, 그리고 Python sidecars와 같은 복잡한 파이프라인이 필요한 전통적인 설정과 달리, Mochi.js는 Bun을 위해 구축된 단일 라이브러리입니다. 이는 오버헤드를 줄이고 스텔스 브라우저의 배포를를 단순화합니다.
구현 및 사용법
Mochi.js는 Playwright 사용자의 "근육 기억"을 유지할 수 있도록 유사한 API를 제공합니다. 기본적인 스텔스 세션을 다음과 같이 몇 줄의 코드만으로 실행할 수 있습니다:
import { mochi } from "@mochi.js/core";
const session = await mochi.launch({
profile: "linux-chrome-stable",
seed: "user-12345",
});
const page = await session.newPage();
await page.goto("https://target.example/checkout");
await session.close();
커뮤니티 피드백 및 비판
Mochi.js의 기술적 야심은 인상적이지만, 초기 Hacker News의 반응은 몇 가지 중요한 우려 사항을 점약했습니다:
- 안정성 및 신뢰성: 일부 사용자는 특정 봇 탐지 사이트에 접속하거나 특정 페이지(예: Grok)를 렌더링할 때 충돌이 발생한다고 보고했습니다. 이는 도구가 아직 초기, 불안정한 단계에 있음을 시사합니다.
- 투명성의 역설: 한 댓글 작성자는 DAG와 지문 매니페스트를 공개적으로 문서화함으로써, 개발자들이 안티봇 서비스에 탐지 방법 개선을 위한 로드맵을 제공할 수 있으며, 이는 잠재적으로 "숨바꼭질 추격전"을을 가속화할 수 있다고 지적했습니다.
- 디버그 모드 딜레마: 자동화 커뮤니티의 흔한 비판은 (CDP를 위해 필수적인) 디버그 모드로 실행되는 브라우저가 종종 탐지 가능하다는 점입니다. 사용자들은 Mochi.js가 브라우저가 제어된 환경에서 실행 중이라는 사실을 효과적으로 숨길 수 있는지 의약심을 가졌습니다.
- 문서화 및 UX: 피드백에 따르면 홈페이지와 문서가 모바일 친화적이지 않아, 고정밀 시뮬레이션에 대한 라이브러리의 초점에 모순된다는 의견이 있었습니다.
결론
Mochi.js는 단순한 패치를 넘어 실제 브라우저 환경의 체계적인 시뮬레이션으로 나아가려는 정교한 시도입니다. 관계적 일관성 및 생체 역학적 행동에 초점을 맞춤으로써, 고스텔스 자동화가 필요한 이들에게 유통할 수 있는 유력한 대약안을 유사합니다. 초기 채택자들이 보고한 초기 안정성 문제를 극복할 수 있다면 말입니다.