ユーザーエージェント

ユーザーエージェントとは何か — クローラーやブラウザーが自分自身を識別するために使用するHTTPヘッダー、robots.txtのトークンと完全な文字列の違い、そしてボットが本物かどうかを確認する方法。

初回公開:2026年6月24日 · 最終更新:2026年8月3日 · Advanced
言語
このページには証拠シグナルが 2 件あります

ユーザーエージェントは、ブラウザー、クローラー、ボットなどすべてのクライアントが自分自身を識別するために送信するHTTPヘッダーです。混同されがちな2つのものがあります:リクエストヘッダー内の完全なユーザーエージェント*文字列*と、robots.txtでターゲットとする短いユーザーエージェント*トークン*(Googlebot、bingbot、Google-Extended)です。トークンは文字列の部分文字列です(RFC 9309)。Google-Extendedのように、リクエスト文字列がまったくないトークンもあります。文字列は簡単に偽装できます(Google自身も「しばしば偽装される」と述べています)。そのため、アクセス制御に使用してはいけません。Googlebot/Bingbotを検証するには、逆DNSと正引きルックアップ、または公開されているIPレンジと照合します。また、注意点もあります:AdsBotとGoogle-Safetyは`User-agent: *`を無視します。トークン行のバージョン番号やワイルドカードは無視され、マッチングは大文字小文字を区別しません。ボットのUAにユーザーとは異なるコンテンツを配信することはクローキングです。

TL;DR — ユーザーエージェントとは、あらゆるクライアントが自身を識別するために送信するHTTPリクエストヘッダーです。これは任意であり、クライアントが入力するメタデータであり、認証された身元ではありません。その値がユーザーエージェント文字列です。これとは別に、robots.txtで使用されるユーザーエージェントトークン(プロダクトトークン)があります。RFC 9309によれば、トークンは文字列の部分文字列であるべき(SHOULD)であり、これは強い慣習ですが、文書化された例外があります(Google-Extendedにはリクエスト文字列がまったくありません)。マッチングは大文字と小文字を区別せず、トークン行のバージョン番号やワイルドカードは無視され、最も具体的なグループが優先され、同じトークンのグループはマージされますが、*とはマージされません。文字列は簡単に偽装できます。Google自身も自社のものを「しばしば偽装される」と呼んでいます。そのため、Googleの場合はgooglebot.com/google.com/googleusercontent.com、Bingの場合はsearch.msn.comに対して、逆引きDNSと正引きDNS(プロキシやCDNの背後では実際のクライアントIPを使用)で検証するか、公開されているIPレンジと照合してください。検証済みのリクエストでも、リクエストが到着したことしか証明できず、ページがインデックスされた、取得された、AIトレーニングに使用されたということは証明できません。AdsBotとGoogle-SafetyはUser-agent: *を無視します。ChromeはブラウザのUA文字列から詳細情報を削除しつつあります(User-Agent削減)。Client Hintsは構造化されたがオプトインの代替手段であり、どちらもクローラー検証の代わりにはなりません。ユーザーエージェントの適応は正当な場合もありますが、クローラーに実質的に異なるコンテンツを欺瞞的に表示することはクローキングになり得ます。

Evidence for this claim HTTP User-Agent is a request field containing product information supplied by the client; it is descriptive text and not proof of identity. Scope: HTTP semantics for User-Agent. Confidence: high · Verified: IETF RFC 9110: User-Agent Evidence for this claim robots.txt User-agent matching is defined by the Robots Exclusion Protocol and controls crawler access, not authentication or general HTTP content negotiation. Scope: RFC 9309 robots matching behavior. Confidence: high · Verified: IETF RFC 9309: Robots Exclusion Protocol

ヘッダー、文字列、トークン

3つのものを区別することが、このトピックの大部分です。

  • ヘッダー。 User-AgentはHTTP リクエストヘッダーです。ブラウザ、curl、クローラー、ボットなど、あらゆるクライアントが送信します。RFC 9110(中核となるHTTPセマンティクス標準)によれば、これはクライアントが入力する任意のフィールドであり、サーバーが検証した認証済みの身元ではなく、クライアントが提供する説明的なメタデータです。
  • 文字列。 ヘッダーのであり、ソフトウェア、バージョン、レンダリングエンジン、場合によってはOSを説明する自由形式の行です。
  • トークン。 robots.txtUser-agent:行でクローラーを対象にするために使用される短い識別子です。GooglebotbingbotGoogle-Extendedなどです。

人々がつまずくのは、この関係性です。RFC 9309(正式なRobots Exclusion Protocol標準)は、トークンは*「クローラーが送信する識別文字列の部分文字列であるべき(SHOULD)…HTTPの場合、プロダクトトークンはUser-Agentヘッダーの部分文字列であるべき(SHOULD)です。」と述べています。これはMUSTではなくSHOULDであり、標準が推奨する強い慣習ではありますが、すべてのクローラーが機械的に従う厳格な要件ではありません。Google-Extended(後述)は、この文書化された例外の最も明確な例です。Googleが自社のほとんどのトークンでこれに従っているからといって、部分文字列ルールを普遍的なものと読まないでください。プロバイダーがトークンを提供する場合、トークンは文字列の一部*です。robots.txtではトークンを対象にし、ログでは文字列を読み取ります。

Evidence for this claim A robots.txt user-agent line selects a crawler product token, not an arbitrary full HTTP User-Agent string; RFC 9309 says the token should be a substring of the identification string, but this SHOULD-level convention has documented product-specific exceptions and is not authentication. Scope: robots.txt parsing and matching Confidence: high · Verified: Robots Exclusion Protocol

Google自身が自社のボットの識別方法について述べていることは、ここで役立ちます。「Googleのクローラーは、HTTP user-agentリクエストヘッダー、リクエストの送信元IPアドレス、送信元IPの逆引きDNSホスト名の3つによって身元を識別します。」 ユーザーエージェントは3つのうちの1つにすぎないことに注意してください。残りの2つが実際の検証方法です。

Google-Extended: 文字列を持たないトークン

トークン ≠ 文字列を最も明確に示すのはGoogle-Extendedです。これは、GoogleがGeminiのトレーニングとグラウンディングにあなたのコンテンツを使用できるかどうかを制御します。そして、専用のHTTPリクエストユーザーエージェント文字列はまったくありません。 クロール自体は既存のGooglebot文字列で行われます。Google-Extendedは、robots.txtの制御トークンとしてのみ存在します。ログのリクエストヘッダーに「Google-Extended」が表示されることは決してありません。

実際的な結果として、Google-Extended をブロックすると、コンテンツの AI トレーニング利用のみに影響します。検索でのクロールやインデックス登録を Googlebot が停止することはありません。これらは別々のトークンで制御される別々の判断です。(サイトを読むボットの全体像については、AI クローラーとクローラーを参照してください。)

Googlebot のユーザーエージェント文字列

Googlebot は「エバーグリーン」です。最近のバージョンの Chrome で動作し、その文字列内の Chrome バージョンは定期的に更新されます(2019 年 12 月以降)。そのため、バージョンは W.X.Y.Z プレースホルダーとして表示されます。

Googlebot スマートフォン(モバイル):

Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/W.X.Y.Z Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

Googlebot デスクトップ:

Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Chrome/W.X.Y.Z Safari/537.36

覚えておくべきことが 2 つあります。まず、バージョンをハードコードしないでくださいW.X.Y.Z は変更されるため、それに一致させると壊れます。代わりに、安定したトークン Googlebot に一致させてください。次に、robots.txt ではモバイルとデスクトップを分離できません。両方のバリアントが 1 つの Googlebot トークンを共有するため、robots.txt のルールは両方に適用されます。

Google のクローラートークン

Google は、それぞれ独自のトークンを持つクローラーとフェッチャーのファミリー全体を運営しています。最もよく遭遇するものは次のとおりです。

クローラーrobots.txt トークン備考
GooglebotGooglebot検索、画像、動画、ニュース、Discover — モバイル + デスクトップがこのトークンを共有
Googlebot ImageGooglebot-ImageGoogle 画像
Googlebot VideoGooglebot-Video動画検索
Googlebot NewsGooglebot-Newsさまざまな Googlebot 文字列を使用
Google StoreBotStorebot-Googleショッピング
Google-InspectionToolGoogle-InspectionTool検索テストツールを強化
GoogleOtherGoogleOther内部調査/フェッチ
Google-ExtendedGoogle-Extendedrobots.txt のみ — Gemini トレーニング、リクエスト文字列なし

そして、通常のルールを破るもの — User-agent: *無視する 特別なケースのクローラー:

  • AdsBot (AdsBot-Google) と AdsBot Mobile (AdsBot-Google-Mobile) — ワイルドカードに従いません。ブロックするには、明示的に名前を指定する必要があります。
  • AdSense (Mediapartners-Google) — 同様。グローバルな * を無視します。
  • Google-Safety — マルウェア/不正使用の検出に使用されます。robots.txt を完全に無視します。

その意味するところは、多くの人が見逃す点です。User-agent: * は AdsBot や Google-Safety をブロックしません。 ワイルドカードで「すべてのボットをブロック」して AdsBot がいなくなったと思っても、実際にはいません。(これはまさに、robots.txt でブロックされているのにインデックスされるという領域にページが入り込む種類の驚きです。完全な制御の話については robots.txt を参照してください。)

Bingbot のユーザーエージェント文字列

Bing は 2022 年に Bingbot の文字列を再構築し、Microsoft Edge でレンダリングされることを反映しました。現在の文字列は次のとおりです。

Bingbot デスクトップ:

Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/W.X.Y.Z Safari/537.36

Bingbot モバイル:

Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/W.X.Y.Z Mobile Safari/537.36 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)

robots.txt トークンは単に bingbot です。注意すべき点: 2022 年以降、Bingbot の文字列は実際の Chrome/Edge ブラウザーとほぼ同じに見えます。唯一の違いは、その中の bingbot/2.0 フラグメントです。UA でボットをフィルタリングまたは検出するロジックがある場合、その変更は重要です。

robots.txt がトークンを実際に照合する方法

クローラーが従うルールのグループを決定するルールがいくつかあります(Google の robots.txt 仕様と RFC 9309 による):

  • 最も具体的な一致が優先されます。 Google は “クローラーのユーザーエージェントに一致する最も具体的なユーザーエージェントを持つグループを見つけて…正しいルールのグループを決定します。” Googlebot の Googlebot グループは、* グループよりも優先されます。
  • 同じトークンのグループはマージされます — ただし * とは決してマージされません。 同じエージェントを指定する複数のグループは結合されます。特定のエージェントのグループと * グループはマージされません* は、特定のものが一致しない場合のフォールバックにすぎません。
  • 大文字と小文字は区別されません。 フィールド名と値の両方 — GooglebotgooglebotGOOGLEBOT は同等です。
  • トークン行のバージョン番号とワイルドカードは無視されます。 Google によると、googlebot/1.2googlebot* はどちらも googlebot と同等です。” ファミリーに一致させるために User-agent: Googlebot* と書くことはできません。そこでの * は何もしません。

つまり、User-agent: 行はトークンを受け取り、それをクローラーの識別情報のプレーンな(大文字小文字を区別しない)部分文字列として照合します。バージョンの固定も、その中のワイルドカードもありません。

文字列を信頼できない理由と、検証方法

ユーザーエージェント文字列は自由形式のテキストです。何でも設定できます。 curl の1行で Googlebot を名乗ることができ、多くのツールや悪意のあるボットがまさにそれを利用してブロックをすり抜けます。Google 自身も Googlebot のドキュメントで次のように述べています: “the HTTP user-agent request header used by Googlebot is often spoofed by other crawlers.” (翻訳) 「Googlebot が使用する HTTP ユーザーエージェントリクエストヘッダーは、他のクローラーによって偽装されることがよくあります。」 私が Googlebot ガイド で述べたように、“Many SEO tools and some malicious bots will pretend to be Googlebot. This may allow them to access websites that try to block them.” (翻訳) 「多くの SEO ツールや一部の悪意のあるボットは Googlebot を装います。これにより、それらをブロックしようとするウェブサイトにアクセスできる可能性があります。」

したがって、文字列だけでアクセスやコンテンツの判断を下してはいけません。代わりに検証してください。

どちらの方法でも前提条件が1つあります: 実際の 送信元 IP を取得することです。サイトがリバースプロキシ、ロードバランサー、または CDN の背後にある場合、デフォルトのアクセスログに記録されるアドレスはプロキシの IP であり、クローラーの IP ではない可能性があります。元のクライアント IP(通常は X-Forwarded-For などのヘッダーで転送され、プロキシで正しく設定されます)が必要です。そうでなければ、以下のどちらの検証方法も意味をなしません。

方法 1 — 逆引き + 正引き DNS(スポットチェックに最適)。 Google の2つの手順:

  1. “Run a reverse DNS lookup on the accessing IP address from your logs, using the host command. Verify that the domain name is either googlebot.com, google.com, or googleusercontent.com.” (翻訳) 「ログからアクセス元 IP アドレスに対して、host コマンドを使用して逆引き DNS ルックアップを実行します。ドメイン名が googlebot.comgoogle.com、または googleusercontent.com のいずれかであることを確認します。」
  2. “Run a forward DNS lookup on the domain name retrieved in step 1… Verify that it’s the same as the original accessing IP address from your logs.” (翻訳) 「手順1で取得したドメイン名に対して正引き DNS ルックアップを実行します…それがログの元のアクセス元 IP アドレスと同じであることを確認します。」

Bingbot の場合も同じ2段階の手順ですが、ホスト名は search.msn.com で終わる必要があります(Bing ブランドのドメインではない — よくある驚きです)。コマンドはスクリプトタブにあります。

方法 2 — 公開 IP レンジ(大規模に最適)。 Google はハードコーディング用の静的許可リストを公開していません(“these IP address ranges can change” (翻訳) 「これらの IP アドレスレンジは変更される可能性があります」)が、照合できる機械可読な CIDR JSON ファイルは公開しています(common-crawlers.json およびより広範なクローラーファイル)。Bing も現在はレンジを公開しています。私はまさにこの目的のために Googlebot IP 検証ツール を構築しました — IP を貼り付けると分類されます。Bing Webmaster Tools には組み込みの「Bingbot の確認」ツールもあります。

DNS は一度きりのログチェックに適しており、IP レンジの照合は大量検証に適しています。どちらでも合う方を使いましょう — ただし、どちらかは必ず使ってください。また、期待されるホスト名とレンジファイルの両方を今日時点のものとして扱い、恒久的なものとは見なさないでください。Google と Bing はこれらのパスを以前に変更したことがあります(この記事が最初に書かれて以来、IP レンジ JSON ファイルは移動され、名前が変更されました)。そのため、以前機能していたルックアップが一致しなくなった場合は、ライブの検証ドキュメントを再確認してください。

UA の一致は下流の結果の証明にはならない

完全に検証されたリクエストでさえ — 実際の Googlebot IP、正引きで確認された逆引き DNS、すべてが一致 — 証明できるのは1つのことだけです: そのリクエスト がサーバーに到達したということです。これをより大きな主張に拡大解釈したくなりますが、以下のそれぞれは別個の事実であり、それぞれ別個の証拠が必要です:

  • リクエスト受信 — そのユーザーエージェントを持つリクエストがサーバーに到達した。(ログ検証が実際に証明すること。)
  • 身元確認 — リクエストが主張するクローラーから実際に来たもの。(逆DNS / IPレンジマッチングが追加で証明すること。)
  • コンテンツ取得・レンダリング — クローラーがページを正常にレンダリングした(エラーなし、ブロックされたリソースなし)。リクエストが届いただけでは保証されない。
  • インデックス登録 — URLが検索インデックスに入った。取得が成功してもインデックス登録は保証されない。
  • 検索・引用・トレーニングに使用 — 特にAIクローラー(Google-Extended、GPTBotなど)の場合、クロールはコンテンツが特定の回答に使用されたり、引用されたり、モデルのトレーニングに使われたことの証明にはならない。これらはクロールの下流にある、別個でほとんど観測不可能なステップである。

ログ内の検証済みGooglebotヒットは実際のシグナルである — ただし、それが実際に示す以上の意味に拡張しないこと。

Web Bot Auth: 検証の今後

2026年、GoogleはWeb Bot Authの実験を開始した — “an experimental cryptographic protocol used to authenticate requests sent by bots.” そのアイデアは、“move beyond easily spoofed headers to a verified identity and decouple agent identity from IP addresses.” ボットはリクエストに暗号署名し、サイトはGoogleが公開する公開鍵に対して署名を検証し、署名付きリクエストにはSignature-Agentヘッダーが含まれる。Google自身の注意書きが重要だ: “We don’t sign every request of a particular agent. Be sure that you fall back to the established methods of bot verification.” つまり、これは追加的なものであり、置き換えではない — 逆DNSとIPレンジは今日のベースラインのままである。

ブラウザもUA文字列からの解析が難しくなっている

上記はすべてクローラーに関するものだが、同じ「文字列を過信しない」教訓はブラウザにも当てはまり、その傾向は強まっている。ChromeはUser-Agent reductionを展開している: UA文字列の一部(完全なブラウザバージョン、OSバージョン、デバイスモデル)を正確に報告する代わりに、凍結または粗くするもので、文字列が特定ユーザーのフィンガープリントに使われないようにする。Google自身の説明: “The granularity and abundance of detail can lead to user identification. The default availability of this information can lead to covert tracking.” 実際には、正確なブラウザ/OS/デバイスバージョンをUA文字列解析に頼る — アナリティクス、デバイス検出、バグトリアージ — はますます信頼性が低くなり、今後さらに悪化するだろう。

Chromeが推奨する代替手段はUser-Agent Client Hints (UA-CH) である: サーバーが明示的に要求した場合にのみブラウザが送信する構造化データ。低エントロピーヒント(ブラウザブランド、メジャーバージョン、モバイルフラグ)はデフォルトで送信される。高エントロピーヒント(正確なバージョン、プラットフォームバージョン、デバイスモデル)は、サーバーがAccept-CHレスポンスヘッダーでオプトインする必要がある — ブロードキャストではなく、明示的なネゴシエーションである。これに依存する前に2つの注意点: これはChrome/Chromium系のメカニズムであり、すべてのブラウザが送信するわけではない。また、サポートされている場所でも、“the value may be blank, not returned, or populated with a varying value.” Client Hintsはブラウザ文字列の問題を解決する。これはクローラー検証メカニズムではない — GoogleとBingは依然としてDNSとIPレンジで自社のクローラーを検証しており、Client Hintsではない。

ユーザーエージェントターゲティングとクローキング

魅力的な動き — 「UAでGooglebotを検出して特別なものを配信する」 — は、技術的に脆弱であるだけでなく、ポリシー違反でもある。

脆弱な理由は、Googleが単一のUAでクロールしないからだ。Googlebot(モバイルとデスクトップ)、Google-InspectionTool、AdsBot、GoogleOtherなどを、変動するIPから正しく処理する必要がある — クリーンにホワイトリスト化するのは事実上不可能である。

ポリシー違反です。クローラーとユーザーに異なるコンテンツを配信することはクローキングにあたります:「検索ランキングを操作し、ユーザーを誤解させる意図で、ユーザーと検索エンジンに異なるコンテンツを提示すること。」 ペナルティはアルゴリズムによる順位低下から完全なインデックス削除まで及びます。この点に注意してください:正当な適応(レスポンシブレイアウト、コンテンツネゴシエーション)は問題ありませんが、ボットとユーザーの間でコンテンツ自体をすり替えることがクローキングに該当します。

ユーザーエージェントがより大きなパイプラインのどこに位置するかについては、クロール(ハブ)とクローラーを参照してください。それらのボットが取得を許可されているものを制御するには、robots.txtを参照してください。

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.