現在UAと手動解析
本ツールは,WebブラウザがHTTPリクエスト時に送信する「User-Agent」ヘッダーの文字列を読み解き,OSやブラウザの種類などの環境情報を構造化して表示する解析ツールです.ツールを起動した初期状態では,ReactのuseEffectフックを用いて,現在アクセスに利用しているブラウザ自身のwindow.navigator.userAgentプロパティを自動的に取得します.
取得した値はテキストエリアにセットされ,即座に解析関数へと渡されるため,まずは自分自身のアクセス環境がUA文字列からどのように推定されるかを確認できます.
テキストエリア内の文字列はユーザー自身で自由に編集することが可能です.サーバーのアクセスログ(例: Nginxのaccess.log内の$http_user_agentフィールド)から取得した過去のUser-Agentや,他のユーザーからバグレポートとして提供された未知の文字列を手動で貼り付け,「解析を実行」ボタンを押下することで,入力値に対する環境情報の推定処理が行われます.
注意点として,テキストエリアの文字列を編集した直後には解析は自動実行されず,前回実行時の解析結果が画面下部のレポート領域に残った状態となります.編集を反映させるためには「解析を実行」ボタンを押して状態を更新してください.また,「現在の環境」ボタンを押すことで,いつでも自身の初期状態の文字列を再取得し,入力をリセットして再解析を行うことができます.
本ツールにおける入力文字列の解析処理は,JavaScriptの文字列操作および正規表現機能を用いてブラウザ内で実行されます.
ブラウザ名と版の推定
入力されたUser-Agent文字列から,利用されているWebブラウザの名称と主たるバージョン番号を推定します.現代のブラウザは歴史的な表示互換性を保つため,意図的に他社のブラウザ名を文字列内に含める(スニッフィング対策)ことが常態化しており,単純なキーワード検索では誤判定を引き起こします.
そのため,本ツールの実装では特定の判定順序と正規表現を用いた除外ルールを設けています.名称の判定には小文字化した文字列などを用いますが,バージョン抽出には元の文字列に対する正規表現を使います.
たとえば,Microsoft Edgeの場合,文字列内にはChromeやSafariといった識別子も同時に含まれています.本ツールでは,まず「Edg」「EdgA」「EdgiOS」というEdge特有の文字列を最優先で検索し,マッチした場合はブラウザ名を「Microsoft Edge」として判定し,スラッシュ以降の数字をバージョン番号として抽出します.
同様に,Operaの場合は「OPR」や「Opera」を検索します.Google Chromeの場合は「Chrome」またはiOS用の「CriOS」をキーとしますが,EdgeやOperaの判定を先に済ませておくことで判定の優先順位を付けています.ただし,未知の形式では誤判定する場合があります.
Safariの判定においては,文字列内に「safari」が含まれていることを確認しつつ,同時に「chrome」「crios」「android」といった文字列が含まれていないことを必須条件とします.この除外条件を満たした場合のみ,「Version/」に続く数値をSafariのバージョンとして採用します.
Internet Explorerについては「msie」または「trident」の有無を確認し,「MSIE 」または「rv:」に続く数値を追跡します.これらすべての正規表現ルールに合致しない未知の文字列パターンが入力された場合は,ブラウザ名を「Unknown」,バージョンを空文字列として扱います.
OSと端末の互換表記
オペレーティングシステム(OS)とデバイスの種別判定も,User-Agent文字列内に含まれる特定のキーワードと正規表現グループに依存しています.Windows環境の場合,まず文字列内の「windows」を検知し,「Windows NT」に続くバージョン番号の規則性から具体的なOS名を判定します.
しかし,最新のWindows 11であっても,User-Agent上はWindows 10と全く同じ「Windows NT 10.0」という文字列が送信される仕様となっています.そのため,本ツールでは「windows nt 10.0」に合致した場合,OSバージョンを「10 / 11」という互換表記で出力します.
それ以前のWindows 8.1(NT 6.3),Windows 8(NT 6.2),Windows 7(NT 6.1),Vista(NT 6.0),XP(NT 5.1)については一意の名称が適用されます.
iOSデバイス(iPhone,iPad,iPod)の場合は,「OS [数字]_[数字] like Mac OS X」という形式の文字列を正規表現で探し,キャプチャグループで取得したアンダースコア(_)をドット(.)に置換してバージョン番号を構成します.この際,ソースコード上ではMacintoshの判定よりも先にiOSの判定を行う順序になっており,iOSデバイス上のブラウザを誤ってmacOSと判定しないよう工夫されています.
macOSの場合は「Mac OS X」に続く数値を同様に抽出し,Androidの場合は「Android」に続く数値をバージョンとします.LinuxやChromecast(crkey)は名称のみの判定となります.
デバイスタイプは,ボットと判定されたものを除き,iPadやAndroid(かつmobileを含まない場合)を「Tablet」,iPhoneやiPod,またはmobile文字列を含むものを「Mobile」,WindowsやMacintosh,X11,Linuxなどを「Desktop」として分類します.
ただし,近年のデスクトップ表示モードを標準とするiPadなどはMacintoshと同等の文字列を送信することがあり,本ツールのような文字列解析のみの手法では正確なデバイス区別が困難なケースが存在します.
エンジン候補の限界
Webページを描画しスクリプトを実行するレンダリングエンジンの特定は,User-Agent文字列の歴史的な複雑さが最も顕著に表れる解析プロセスです.現在主流となっている多くのモダンブラウザ(Chrome,Edge,Operaなど)は,内部的にBlinkエンジンを採用していますが,User-Agent内には過去の互換性を維持するためのトークンとして「AppleWebKit」という文字列が記述され続けています.
本ツールの実装では,まず文字列内に「applewebkit」が存在するかをチェックします.存在する場合,基本方針としてエンジン名を「WebKit」とし,正規表現を用いて「AppleWebKit/」に続く数字をエンジンバージョンとして抽出します.しかし,さらに踏み込んだ判定として,対象文字列に「chrome」「edg」「opr」のいずれかが含まれており,かつそれが「iphone」「ipad」「ipod」といったiOS端末を示すキーワードを含んでいない場合,実際のレンダリングエンジンはWebKitからフォーク(派生)した「Blink」であると推測します.
この追加条件に合致した場合,ツールは表示するエンジン名を強制的に「Blink」へ上書きします.ここで重要なのは,生文字列内のAppleWebKitに付随する数値は,あくまで互換性のためのトークンに付随する値であり,実際のBlinkエンジンのバージョンを示しているわけではない点です.
そのため,Blinkと判定した際のエンジンバージョンは意図的に空文字列とし,バージョン番号は表示しません.
一方で,Firefoxなどに搭載される「Gecko」エンジンの場合は,「rv:」に続く数値をバージョンとして採用し,Internet Explorerの「Trident」エンジンは「Trident/」に続く数値を抽出します.本ツールにおけるエンジン判定は,与えられた文字列からの推測に過ぎず,Client Hints API(UA-CH)を利用した追加情報の取得や,JavaScriptによる機能検知(Feature Detection)は実装されていません.
そのため,ユーザーによって意図的に偽装・短縮されたUser-Agentから真のエンジンを確定することには構造的な限界があります.
ボット文字列と認証の違い
Webサイトへのアクセスが,人間が操作するブラウザによるものか,それともクローラーや自動化スクリプトなどのBot(ボット)によるものかを判別するため,本ツールでは既知のボットに関連する特有のキーワード群を登録した正規表現を用いて検索を行います.判定リストには,「googlebot」「bingbot」「yandexbot」「baiduspider」「duckduckbot」といった主要検索エンジンのクローラーをはじめ,「facebookexternalhit」「twitterbot」「linkedinbot」のようなSNSのリンクプレビュー情報を取得するためのスクレイパーが含まれます.
さらに,「curl」「wget」などのコマンドラインベースのHTTPクライアントや,サイト監視用のプログラムなど,約20種類のキーワードを対象として大文字・小文字を問わず(/iフラグ)照合を実行します.
入力された文字列がこれらのキーワードのいずれかに合致した場合,ツールの解析結果はデバイスタイプを「Bot」として分類し,詳細解析レポート領域にて「Bot関連キーワードに一致(認証ではありません)」という赤色のアラートバッジを表示します.ここで極めて重要な実装上の仕様は,この機能が「対象のアクセスが正規のボットであることを保証・認証するものではない」という点です.
悪意のある攻撃者やスパム業者が,自身のアクセス元のUser-Agent文字列を意図的に「googlebot」などに偽装した場合,本ツールは単にテキスト入力された文字列をそのまま評価するため,当然ながらBotとして判定してしまいます.また,反対にキーワードリストに含まれていないからといって,それが確実に人間の操作によるアクセスであると断定することもできません.
四例と実ログの確認
実際の利用シーンにおける入力形式と解析結果の対応を直感的に把握できるよう,本ツールの画面上にはあらかじめ4つの代表的な「サンプルUA」ボタンが用意されています.これらのボタンを押下すると,対象のサンプルのUser-Agent文字列が自動的にテキストエリアへ入力され,同時に解析処理が実行されて結果レポートが切り替わります.
1つ目のサンプル「Chrome (macOS)」は,Intelチップ搭載のMac環境で動作するChrome 120の文字列例です.OSが「Mac OS X 10.15.7」として解釈され,エンジンはBlinkエンジンの判定ロジック(AppleWebKitを含みつつChromeであり,iOSではない)が適用されるプロセスを確認できます.
2つ目の「Safari (iPhone)」は,iOS 17.2が動作するiPhone環境の例です.Mobile Safari特有の文字列構成となっており,判定処理がmacOSよりも先にiOSの正規表現にマッチすることで,デバイスタイプがMobile,OS名がiOS,エンジンがWebKitとして規則に沿って抽出されます.
3つ目の「Firefox (Windows)」は,Windows環境におけるFirefox 121の例です.OSの判定において「Windows NT 10.0」にマッチするため,ツール独自の互換表記である「Windows 10 / 11」が出力されます.また,Geckoエンジンとそのリビジョン(rv:109.0)が明記されているのが特徴です.
4つ目の「Googlebot」は,Googleのウェブクローラーの代表的な文字列例です.判定リストの「googlebot」に合致するため,デバイスタイプがBotに分類される挙動をテストできます.
これらの固定サンプルを活用してツールの抽出・除外ロジックの挙動を理解した後は,実際に運用しているWebサーバーのアクセスログから抽出した生のUser-Agent文字列を貼り付けてご活用ください.未知のアクセス元のOS・ブラウザ調査や,自社サービスを訪れるユーザーのデバイス傾向の把握などに役立てることができます.