
스택의 모든 계층에서 요청을 Chrome 브라우저로 완벽하게 위장하는 차세대 HTTP 스텔스 프록시입니다.
"믿을 수 없어, 열광학 위장!"
이것은 JA4+와 같은 핑거프린팅을 사용하여 특정 HTTP 클라이언트를 차단하는 서비스를 우회하기 위해 설계된 HTTP 프록시입니다. 이 프록시를 사용하면 curl과 같은 선호하는 HTTP 클라이언트를 사용하면서도 실제 (Chrome/Chromium) 웹 브라우저와 마법처럼 구별할 수 없는 핑거프린트를 가질 수 있습니다. thermoptic은 또한 JavaScript 기반 핑거프린팅을 완화하기 위한 몇 가지 재미있는 기능을 제공합니다. 또한 웹 브라우저와 저수준 HTTP 클라이언트를 함께 사용하여 하이브리드 스크래핑을 쉽게 수행할 수 있게 해줍니다.
JA4+ 핑거프린팅에 익숙하지 않더라도, 스크래핑을 해본 적이 있다면 아마 이로 인해 차단된 경험이 있을 것입니다. Cloudflare와 같은 인기 서비스는 이러한 기법(및 기타 트릭)을 사용하여 "비인간적인" HTTP 클라이언트의 사용을 탐지하고 요청을 차단합니다. 이러한 서비스는 또한 이 핑거프린팅을 사용하여 실제 브라우저로 세션을 시작한 후 나중에 curl과 같은 저수준 클라이언트로 전환하는지를 탐지할 수 있습니다. thermoptic은 모든 스크래핑 요청에 대해 통합된 "실제" 브라우저 핑거프린트를 제시함으로써 이러한 모든 문제를 해결합니다.
다음은 프록시 없이 curl의 JA4H (HTTP) 핑거프린트 예시입니다:
$ curl https://ja4db.com/id/ja4h/
ge11nn090000_b6a016211e8a_000000000000_e3b0c44298fc
이는 URL을 직접 방문할 때 Chrome이 생성하는 핑거프린트와 상당히 다릅니다:
ge11cn19enus_f2808f0d04cf_9a10d4221160_7068f58def6e
하지만 프록시를 사용해 요청을 보내면, 우리의 JA4H 지문은 마법처럼 동일해진다:
$ curl --proxy http://thermoptic:1234 https://ja4db.com/id/ja4h/
ge11cn19enus_f2808f0d04cf_9a10d4221160_7068f58def6e
(우리의 JA4 TLS 지문도 마찬가지입니다).
Ubuntu 22.04에서 컨테이너화된 Chrome 인스턴스를 통해 트래픽을 위장하는 thermoptic 프록시를 시작하려면:
일반 Docker 설정 (GPU 런타임이 없는 호스트에서 작동):
docker compose up --build
이제 끝났습니다. 이제 이를 통해 트래픽을 프록시할 수 있습니다:
curl --proxy http://127.0.0.1:1234 --insecure https://ja4db.com/id/ja4h/
중요 사항:
PROXY_USERNAME과 PROXY_PASSWORD로 인증을 설정해야 합니다.---insecure를 사용하고 싶지 않다면 ./ssl/rootCA.crt에 있는 생성된 CA 파일을 사용해야 합니다. 이 파일은 thermoptic을 처음 실행할 때 생성됩니다.--remote-debugging-port 플래그로 실행된 모든 Chrome/Chromium 인스턴스에 thermoptic을 연결할 수 있습니다. 이는 지문을 최대한 눈에 띄지 않게 유지하기 위해 더 일반적으로 사용되는 환경(예: Windows의 Chrome)을 설정하고 이를 통해 프록시하려는 경우 필수적입니다./dev/dri를 마운트하며, 번들된 Chrome 컨테이너가 NVIDIA/Vulkan 렌더링 경로로 전환할 수 있게 합니다. 이를 사용하려면 docker compose -f docker-compose.yml -f docker-compose.gpu.yml up --build를 실행하세요.curl, requests 등)를 thermoptic과 통합하는 데 거의 또는 전혀 사용자 정의 코드가 필요하지 않으며, 프록시만 설정하면 지문이 처리됩니다../hooks/onstart.js에서 확인할 수 있습니다.http://127.0.0.1:14111). 사이트에 수동으로 로그인한 다음 로그인된 세션으로 프록시를 통해 원활하게 요청을 보내는 데 유용합니다(디버깅에도 유용).docker-compose.yml의 UPSTREAM_PROXY 환경 변수를 통해 업스트림 HTTP 또는 SOCKS 프록시 URI를 설정합니다.
curl과 같은 HTTP 클라이언트를 사용하여 thermoptic을 프록시로 설정한 상태에서 HTTP 요청을 보냅니다.thermoptic은 요청을 분석하여 이것이 원래 어떤 유형의 브라우저 요청이어야 하는지(예: 수동 URL 방문? 양식 제출? fetch() 요청?)를 최대한 판단합니다.thermoptic은 Chrome 디버깅 프로토콜(CDP)을 사용하여 브라우저를 조종하고, 실제 웹 브라우저에서 정상적으로 발생하는 것과 정확히 동일하게 요청을 모킹하는 페이지를 설정합니다.thermoptic은 모킹된 컨텍스트를 통해 요청을 트리거하고 HTTP 응답을 캡처합니다.thermoptic은 HTTP 응답을 클라이언트로 다시 보냅니다.브라우저가 실제로 전체 스택을 사용하여 요청을 수행하기 때문에 결과적인 JA4 지문은 동일합니다.
참고: 많은 WAF가 웹 브라우저의 JavaScript 수준 지문 채취를 사용하기 때문에, thermoptic은 스크래핑 과정의 핵심 단계에 브라우저를 활용할 수 있는 훅도 제공합니다. 이에 대한 자세한 내용은 이 섹션을 참조하세요.
솔직히 말하자면: 다른 접근 방식에는 브라우저 지문 채취 문제에 대한 실용적인 장기 솔루션이 되는 것을 막는 근본적인 결함이 있습니다.
브라우저 JA4+ 지문 채취를 "이기려는" 다른 많은 시도는 브라우저 스택의 여러 계층을 재구현하는 방식으로 이루어집니다. 이 접근 방식에는 다음과 같은 여러 심각한 단점이 있습니다:
반면, thermoptic은 브라우저 자체를 사용하여 HTTP 요청을 수행하기 때문에:
thermoptic이 제어하는 브라우저를 최신 지문 세트에 맞게 업데이트하기만 하면 됩니다.물론, 단점이 없는 솔루션은 없습니다. thermoptic 접근 방식의 단점에 대한 자세한 목록은 DOWNSIDES.md 문서를 참조하세요.
thermoptic인 이유는?"Thermoptic"("thermoptic camouflage"의 줄임말)은 Ghost in the Shell (1995) 애니메이션에서 Major가 사용하는 가상의 위장을 가리킵니다. 영화에서 이 위장은 착용자를 가시광선과 열복사를 포함한 여러 탐지 스펙트럼에 걸쳐 숨길 수 있는 것으로 묘사됩니다. 마찬가지로, 이 도구는 여러 채널(HTTP, TLS 등)에 걸쳐 사용자를 지문 채취로부터 숨기려고 시도합니다.
이 도구는 연결된 Chrome/Chromium 브라우저와 정확히 동일하게 다음 JA4 지문을 스푸핑합니다:
thermoptic은 이제 제어되는 Chrome 인스턴스를 내부 proxyrouter 서비스를 통해 라우팅하므로, Chrome을 업스트림 HTTP 또는 SOCKS 프록시(자격 증명이 필요한 프록시 포함)로 지정할 수 있습니다. docker-compose.yml의 proxyrouter 서비스 아래에 있는 UPSTREAM_PROXY 값을 편집하여 업스트림 프록시 URI를 설정하세요. 비워 두면 Chrome은 인증되지 않은 클러스터 내 프록시를 통해 인터넷에 직접 연결됩니다.
업스트림 SOCKS 프록시 설정 예시:
proxyrouter:
environment:
UPSTREAM_PROXY: "socks5://username:[email protected]:1080"
일부 업스트림 프록시는 저수준 핑거프린트(예를 들어 TCP 메타데이터)를 변경할 수 있으며, 이는 주거용 브라우저와의 일치도를 떨어뜨릴 수 있다는 점을 유의하세요.
thermoptic은 클라이언트가 Cookie 헤더에 지정한 쿠키를 사용하여 브라우저를 로드합니다. 그러면 요청이 브라우저 컨텍스트에서 실행될 때 이 쿠키들이 포함됩니다. 이는 서버가 쿠키의 순서나 그와 유사한 값싼 트릭으로 핑거프린팅을 할 수 없도록 하기 위해 수행됩니다.
참고: 이 쿠키들은 요청 이후에도 남아 있습니다. 쿠키에 대한 정리 로직을 구현하고 싶다면 thermoptic 훅을 작성하세요.
네, thermoptic은 이런 하이브리드 사용을 지원합니다. 자세한 내용은 이 섹션을 참조하세요.
X-Fetch-*, Origin, Referer와 같은 헤더를 올바르게 설정하고 있는지 확인해야 합니다. thermoptic에 이러한 헤더를 알려주지 않으면 적절하게 은밀한 방식으로 요청을 실행할 수 없습니다.
컨텍스트 헤더를 설정하지 않으면 thermoptic은 대상 사이트가 기대하는 것과 정확히 일치하지 않을 수 있는 기본값을 설정합니다. 예를 들어, Origin 헤더를 설정하지 않으면 Origin을 null로 설정하고, Referer 헤더를 설정하지 않으면 Referer를 전혀 보내지 않습니다.
요청이 가능한 한 은밀하도록 이러한 컨텍스트 헤더를 포함하는 것이 최선의 이익입니다! thermoptic은 당신의 마음을 읽을 수 없고, 오직 요청만 읽을 수 있습니다 :).
일반적으로 이는 JavaScript/브라우저 수준 검사를 통과하기 위해 일시적으로 전체 웹 브라우저를 활용하는 thermoptic 훅의 경우에만 적용됩니다. 이러한 훅과 전체 브라우저 모드를 일시적으로 사용할 때는 봇으로 핑거프린팅되지 않도록 주의해야 합니다(예: Runtime.enable과 같은 함정을 피하세요).
여기서 작용하는 윤리적 고려 사항과 복잡한 게임 이론은 README에서 답할 수 있는 범위를 넘어섭니다. 그래도 이메일/트위터/Github을 통해 저를 비난하실 때 이 지나치게 단순화된 요점 중 어느 것이든 자유롭게 반박해 주세요: