あなたのスクレイパーは完璧な Chrome ヘッダーを送り、クリーンな residential IP の背後で動作しているのに、最初のリクエストでいきなり 403 を返される。captcha もチャレンジページもなく、解くべきものは何もない。サイトは HTTP のバイトが 1 つもやり取りされる前に、つまり TLS handshake の段階であなたを識別したのです。
この記事では、JA3 と JA4 のフィンガープリンティングが実際にどう機能するのか、なぜそれが 2026 年のあらゆる主要な anti-bot システムの静かな主力になっているのか、そして自分のフィンガープリントを 10 秒で確認する方法を解説します。先に bypass のためのツールが知りたい場合は、curl_cffi & tls-client で TLS フィンガープリンティングを回避するで扱いました。本記事はその姉妹編で、検出側がどう動くかを扱います。
理論に入る前に、自分自身の handshake を見てみましょう。当社の無料 JA3/JA4 チェッカーを開いてください。あなたのクライアントが今提示した TLS フィンガープリントをそのまま返し、それが何に一致するかを教えてくれます:
# From a terminal - see what curl's TLS looks like:
curl https://www.jibaoproxy.com/tools/fingerprint.html
# Then open the same URL in Chrome and compare.
両方を実行すれば、この記事全体の要点が見えてきます。User-Agent ヘッダーに何を設定しようと、curl と Chrome はまったく異なるフィンガープリントを生成するのです。
すべての HTTPS 接続は ClientHello メッセージから始まり、これは暗号化が始まる前に平文で送信されます。その中で、あなたのクライアントは次のことを宣言します:
ここに検出の核心があります。これらのリストとその正確な順序は、あなたのクライアントがコンパイルされた TLS ライブラリに焼き付けられています。Chrome の BoringSSL は特定の組み合わせを 1 つ宣言します。Python の OpenSSL は別のものを宣言します。Go の crypto/tls は 3 つ目を宣言します。これはヘッダーでは変えられません。HTTP レイヤーの下、ライブラリ自身によってネゴシエートされるからです。
JA3(Salesforce、2017 年)は ClientHello の 5 つのフィールド(TLS バージョン、cipher、extension、曲線、point format)を 1 つの文字列に連結し、それを MD5 でハッシュ化します:
771,4865-4866-4867-49195-49199,0-23-65281-10-11-35-16,29-23-24,0
|
v MD5
cd08e31494f9531f560d64c695473da9
TLS スタックごとに 1 つのハッシュ。Windows 上の Chrome 137 はどのコピーでも(ほぼ)同じ JA3 を生成し、OpenSSL 3.x 上の python-requests はどれも同じ別の JA3 を生成します。防御側はルックアップテーブルを保持しています。ハッシュ X = Chrome、ハッシュ Y = requests、ハッシュ Z = Go bot。User-Agent が Chrome だと言っているのに JA3 が OpenSSL だと言えば、即座に、静かに、安価にブロックされます。
JA3 には問題がありました。Chrome は 2023 年に extension の順序をランダム化し始め(素朴な JA3 を壊し)、MD5 は構造を持たないため、1 つのハッシュからは 2 つのクライアントがなぜ異なるのかが何もわかりません。JA4(FoxIO、2023 年)はその両方を解決し、今日まともなベンダーが採用しているものです:
JA4 = t13d1516h2_8daaf6152771_b0da82dd1658
| | |
a: protocol b: ciphers c: extensions
(TLS 1.3, 16 ciphers, (sorted, truncated
h2 ALPN, domain SNI) SHA256)
重要なシステムはすべてです。Cloudflare は JA3/JA4 を bot-management ルールに直接公開しています。DataDome と PerimeterX はそれをネットワークレイヤーのスコアリングに取り込んでいます(当社の DataDome/PerimeterX ガイドを参照)。Akamai は誰よりも長く TLS フィンガープリンティングを運用してきました。これが人気なのは、計算が無料で、HTTP レイヤーから偽装するのが不可能で、素朴な自動化の 90% を捕捉するからです。これまで書かれたあらゆる requests/httpx/axios/Go-http スクリプトを、JavaScript が実行される前に捕まえます。
これは人を驚かせます。proxy は IP を変えますが、TLS handshake はそのまま通過します。CONNECT トンネル(または SOCKS5 ストリーム)はあなたの ClientHello バイトをそっくりそのままターゲットへ運びます。Residential IP + requests ライブラリの JA3 = 「residential IP 上で動く bot」。datacenter IP よりはマシですが、それでも bot です。
IP と TLS フィンガープリントは独立したシグナルであり、両方をクリーンにする必要があります:
| IP | TLS フィンガープリント | 2026 年の判定 |
|---|---|---|
| Datacenter | ライブラリ(requests/Go) | 気にするサイトすべてでブロック |
| Residential | ライブラリ | JA4 をチェックするサイトでブロック |
| Datacenter | ブラウザ偽装 | IP レピュテーションでブロック |
| Residential | ブラウザ偽装 | ネットワークレイヤーのチェックを通過 |
ツール別に 2 つの道があります:
HTTP クライアント。ブラウザの正確な ClientHello を再実装する偽装ライブラリを使います: curl_cffi(Python)、tls-client(Python/Go)、got-scraping(Node)。完全に動くコードは curl_cffi ガイドにあります:
from curl_cffi import requests
r = requests.get(
"https://target.example",
impersonate="chrome",
proxies={"https": "socks5h://USERNAME:[email protected]:913"},
)
実ブラウザ(Playwright、ブラウザエージェント、anti-detect ブラウザ)。TLS レイヤーでやることは何もありません。フィンガープリントは本物の Chrome のものです。リスクは別の場所にあります。IP レピュテーションと CDP 検出です。
そして仮定せず、検証してください。バージョンはずれていきます。Chrome 120 の handshake にピン留めされた偽装ライブラリは、2026 年には「疑わしいほど古いブラウザ」と読み取られます。依存関係を更新するたびに再テストしてください:
新規ユーザーは登録時に500MBを獲得、さらに初回チャージにボーナスが付きます。期間限定オファーです。