コンテンツへスキップ
Tutorial

ユーザーエージェントではなくTLSフィンガープリントを使用してAIスクレーパーを検出

| 6 min read

GPTBot、ClaudeBot、および PerplexityBot は、リクエストの 30% 以上で Chrome ユーザー エージェントになりすますようになりました。 JA4 TLS フィンガープリントは、オリジンがヘッダーを解析する前に、ハンドシェイク時にそれらを捕捉します。

Network cables representing TLS handshakes and bot fingerprinting at the edge
Photo by Thomas Jensen on Unsplash

robots.txt には次のように書かれています User-agent: GPTBot Disallow: /。 GPTBot はそれを尊重します。 上に構築された十数の RAG パイプライン requestshttpx、ヘッダーに Mozilla/5.0 文字列が含まれるヘッドレス Chrome ではサポートされません。 大手パブリッシャーからの最近のトラフィック サンプルによると、「Chrome」ヒットの 30 ~ 60% がブラウザ以外の TLS スタックから発生していることが示されています。 ユーザーエージェントは劇場です。 TLS クライアント Hello は真実です。

JA4 (2023 年に公開された TLS フィンガープリント形式 FoxIO) は、クライアントが TLS ライブラリをフォークすることなく簡単に変更できない Client Hello の部分 (暗号順序、拡張子、ALPN、署名アルゴリズム) をハッシュします。 本物のChromeとPython httpx どちらのスクリプトも、User-Agent ヘッダーに何を書いても、まったく似ていないフィンガープリントを持ちます。 この投稿では、エッジで JA4 を読み取り、それを分類する方法を示します。 /v1/tls/fingerprint、リクエストがオリジンに到達する前にアクションを実行します。

JA4 の外観

JA4 は、アンダースコアで結合された 3 つのセクションです。 最初のセクションでは、TLS バージョン、ALPN、および暗号数をエンコードします。 2 番目のハッシュ暗号スイート。 3 番目はハッシュ拡張と署名アルゴリズムです。 一般的な Chrome 124 のフィンガープリント:

t13d1516h2_8daaf6152771_e5627efa2ab1

ニシキヘビ httpx 0.27クライアント:

t13d1517h2_8daaf6152771_b1ff8ab2d16f

同じ TLS 1.3、同じ ALPN h2、同様の暗号ハッシュですが、拡張ハッシュが異なります。 httpx BoringSSL とは異なる拡張命令をネゴシエートします。 3 番目のセクションは、Chrome を装ったスクレーパーを捕捉する識別器です。

指紋を分類する

JA4 を次の宛先に送信します。 /v1/tls/fingerprint そして、クライアントの ID、評決、信頼スコアを取得します。 エンドポイントは、クライアント ライブラリとバージョン範囲によってインデックス付けされたフィンガープリント コーパスを維持します。

Python のサンプル応答 httpx 上記の JA4:

verdict フィールドは、エッジで操作する必要がある唯一の部分です。 browser_match これは、「これは既知の実際のブラウザのバージョンですか」のブール値のショートカットであり、監視に役立つ分母です。

Cloudflare ワーカー、30 行

Cloudflare は JA4 を公開します request.cf.ja4 TLS フィンガープリントが有効になっているゾーン (Pro プランでは無料、無料枠の Workers ヘッダー経由で利用可能) tls_client_hello リクエスト)。 クライアント ライブラリが更新されるまでフィンガープリントは安定しているため、判定を 1 時間キャッシュします。

キャッシュは、リクエスト量ではなく、一意のフィンガープリントに比例した API 呼び出し率を維持します。 一般的なサイトでは 1 日あたり 5,000 件未満の個別の JA4 が表示されるため、定常状態ではアップストリーム コールが発生することはほとんどありません。 ワーカーはコールド スタート時にマップを隔離するため、実際にはキャッシュが制限されます。 高カーディナリティのオリジンの場合は、次のように交換します。 caches.default 1時間のTTLで。

Expressでも同じこと

CDN がヘッダーで JA4 を転送する場合 (Fastly の fastly-tls-ja4、クラウドフレアの cf-ja4、または上流のワーカーから独自に作成したもの)、オリジン ハンドラーはシン ミドルウェアです。

評決ごとに行動を決定する

3 つの応答パスでほとんどのケースをカバーします。 不明なバケットをブロックしないでください。 新しいブラウザのリリースでは実際のユーザーが炎上することになります。

402 ステータス コードは意図的なものです。 スクレーパーオペレーターに向けて /api ブロックされていると伝えるのではなく、ライセンスを要求するのですが、それが「AIに敵対的な出版社」リストに載る原因になります。 フレンドリーなバージョンでは、Twitter の積み重ねではなく、時折 API を利用する顧客が得られます。

影響を測定する

ブロックを反転する前に、JA4 と User-Agent を 1 週間記録します。 重要なグラフは、「User-Agent が Chrome を主張しているが、JA4 がスクレイパーを主張しているリクエストの割合」です。 ほとんどのチームは 15 ~ 40% を見ています。 ユーザー エージェントのみのブロック リストを配布する場合、その数値が爆発範囲となります。 JA4 ベースのゲーティングを有効にすると、同じグラフで数時間以内にシェアが 1 桁に低下することが示されるはずです。

Botoi の無料利用枠は、1 日あたり 1,000 件の指紋分類 (5 要求/分バースト) をカバーします。 キャッシュと組み合わせると、小規模から中規模のサイトには十分なヘッドルームが得られます。 でキーを取得します botoi.com/api/signup

エンドポイント参照: TLS フィンガープリント API。 関連している: AI エージェントが最も頻繁な呼び出し元である場合の API 可観測性

FAQ

ユーザーエージェントが機能しなくなったのはなぜですか?
AI トレーニング クローラーとその多くの模倣者 (本物のボット、グレーマーケット スクレイパー、顧客が構築した RAG パイプライン) は、発行者が robots.txt と User-Agent ブロックを追加したため、「Mozilla/5.0 ... Chrome/120」を送信することが増えています。 TLS ハンドシェイクはクライアント ライブラリ (Go net/http、Python httpx、Node undici、headless Chrome) によって設定され、クライアントを書き換えずに偽装するのははるかに困難です。
JA4とは何ですか?
JA4 は、2023 年に FoxIO によって公開された TLS Client Hello フィンガープリント形式です。これは、ネゴシエートされた TLS バージョン、暗号スイート、拡張機能、ALPN、および署名アルゴリズムを t13d1516h2_8daaf6152771_e5627efa2ab1 のような文字列にハッシュします。 JA4 を共有する 2 つのクライアントは、User-Agent ヘッダーの内容に関係なく、同じ TLS スタックを使用しています。
これにより実際のユーザーがブロックされますか?
いいえ、実際の Chrome、Safari、Firefox には、ブラウザーのバージョンが変わるとのみ変更されるよく知られた JA4 があります。 botoi エンドポイントは、スクレイピング ライブラリ (curl、wget、requests、httpx、Go default、Node undici、検出防止パッチを適用したヘッドレス Chrome) に関連付けられたフィンガープリントにフラグを立てます。 ブラウザーのフィンガープリントを許可し、残りはチャレンジまたはレート制限します。
スクレーパーは JA4 になりすますことができますか?
はい、努力次第です。 curl-impersonate や Python tls_client ライブラリなどのツールは、Chrome JA4 を模倣できます。 スプーファーは 2026 年現在でもスクレイパー トラフィックのごく少数であり、スプーファー ID が公開されると、他のフィンガープリントと同様に分類されます。 JA4 raises the cost from one HTTP header to a forked TLS library; そのコストはロングテールを阻止するのに十分だ。
端の指紋を取得するにはどうすればよいですか?
Cloudflareは、cf.botManagementを介してリクエストオブジェクトでja4を公開し、request.cf.tlsClientHelloLengthとja4を介してワーカーでja4を公開します。 Fastly は fastly.tls 経由でそれを公開します。 AWS CloudFront はまだ直接公開していません。 CF ワーカー経由でルーティングするか、生の Client Hello で botoi /v1/tls/fingerprint エンドポイントを使用します。

botoiで開発を始めよう

150以上のAPIエンドポイント。検索、テキスト処理、画像生成、開発者ユーティリティに対応。無料プラン、クレジットカード不要。