sqdshguy/wreq-js
TypeScript0 / 0
Rust 바인딩으로 브라우저 JA3·JA4와 Akamai H2 지문을 재현하는 fetch 스타일 HTTP 클라이언트
TL;DR
wreq-js는 Node에서 브라우저 수준의 JA3·JA4 및 HTTP/2 지문을 네이티브 레이어에서 모방해 Cloudflare·DataDome 같은 서비스의 TLS 기반 검사를 우회하려는 도구입니다. Rust 바인딩(wreq)과 BoringSSL을 사용해 in-process로 동작하며 fetch 스타일 API, 세션 재사용, WebSocket, 스트리밍, 프록시, 커스텀 에뮬레이션을 제공하므로 TLS·HTTP/2 레벨의 적합성이 관건인 스크래핑이나 자동화 작업에서 바로 적용할 수 있습니다. 다만 자바스크립트 실행이 필요한 인터스티셜·CAPTCHA·행동 분석은 처리하지 못하므로 그런 케이스에는 Playwright 같은 브라우저 제어 도구를 함께 고려해야 합니다. 사전 빌드 바이너리가 많은 플랫폼을 커버하지만 플랫폼 바이너리가 없을 경우 Rust 툴체인이 필요하고 Node.js 20 이상을 요구합니다.
핵심 포인트
- wreq-js는 Node.js/TypeScript용 HTTP 클라이언트로서 브라우저의 TLS 핸드셰이크와 HTTP/2 지문을 모방하여 요청을 전송하는 도구이며, 내부적으로 Rust 바인딩(wreq)과 BoringSSL을 사용해 네이티브 레이어에서 동작합니다. 이 접근법은 Node의 기본 tls 모듈로는 조정할 수 없는 JA3·JA4와 HTTP/2 SETTINGS 수준의 차이를 해소하기 위해 설계되어 있으며, Chrome 149와 Firefox 151 수준의 프로필을 포함해 브라우저별 TLS·HTTP 특성을 재현할 수 있습니다. TLS 수준에서 브라우저처럼 보이게 하면 Cloudflare, DataDome, Akamai 같은 서비스의 핑거프린트 검사에서 걸릴 확률을 낮출 수 있으므로, 브라우저에서는 통과하지만 Node에서 403이 발생하는 경우에 직접적인 대안이 됩니다.
- 기능 면에서는 fetch 스타일 API와 세션(session)·transport·WebSocket 재사용·스트리밍 바디·프록시(HTTP·SOCKS)·커스텀 에뮬레이션(암호 목록, 확장, ALPN·ALPS·GREASE·HTTP/2 SETTINGS 순서 등)을 모두 제공합니다. 세션을 사용하면 연결 풀과 TLS 세션 캐시를 유지해 개별 fetch보다 TLS 핸드셰이크 비용을 줄일 수 있으며, README의 측정에서는 독립 fetch의 TLS 핸드셰이크가 대상 호스트에 대해 약 53 ms였고 세션 사용 시 약 15 ms로 줄어든 것으로 나옵니다. 사전 빌드된 네이티브 바이너리가 macOS, Linux(x64/arm64, glibc·musl), Windows x64로 제공되며, 해당 플랫폼 바이너리가 없을 때는 Rust 툴체인으로 소스에서 빌드되므로 Node.js 20 이상과 빌드 의존성을 유의해야 합니다.
- 한계와 위협 모델은 명확히 README에 명시되어 있으며 이 라이브러리는 전송 계층까지만 다루고 JavaScript 실행, CAPTCHA 해결, 행동 분석 우회는 수행하지 않습니다. 따라서 Turnstile, Akamai의 센서 기반 검사, Kasada 같은 스크립트/행동 기반 인터스티셜이 있는 대상에는 Playwright 같은 브라우저 제어 도구가 필요하며 TLS 수준을 맞춘다고 해서 항상 서비스가 허용하는 것은 아닙니다. 또한 동일한 TLS 프로필을 보내더라도 쿠키·세션 히스토리 부족 때문에 일부 사이트는 오히려 차단할 수 있으므로 실제 대상에서 검증하는 절차가 필요합니다.
- 성능 비교 표에서는 2026-08-06 M-series Mac 측정값을 인용해 wreq-js의 처리량이 초당 12842 req이고 콜드 스타트가 7 ms로 제시되어 있으며 Akamai HTTP/2 지문이 Chrome과 바이트 동일하다고 나옵니다. 같은 표에서 node-wreq는 6500 req/s·10 ms, impers는 8439 req/s·16 ms, impit은 6710 req/s·37 ms로 기재되어 있으니 네이티브 Rust 코어와 BoringSSL 조합이 지문 정확성과 JavaScript↔네이티브 경계 처리 측면에서 유리한 근거로 해석할 수 있습니다. got-scraping 같은 순수 JS 대안은 TLS 핸드셰이크를 조작하지 못하므로 JA3/JA4 문제를 해결하지 못했다는 점도 비교 근거로 포함되어 있습니다.
벤치마크
| 벤치마크 | 지표 | 값 | 비교 |
|---|---|---|---|
| Throughput | req/s | 12842 | vs node-wreq: 6500 req/s; impers: 8439 req/s; impit: 6710 req/s |
| Cold start latency | ms | 7 ms | vs node-wreq: 10 ms; impers: 16 ms; impit: 37 ms |
| Akamai HTTP/2 fingerprint | H2 correct | Yes (byte identical to Chrome) | vs impit: No |
| Browser support (TLS profiles) | Newest Chrome | Chrome 149, Firefox 151 | — |
367
Stars
14
Forks
+206
Trending
0
조회수
367 watchers0 open issuesMIT License
관련 토론
아직 관련 토론이 없습니다.
댓글
댓글을 작성하려면 로그인이 필요합니다.