「スマホ用とPC用で表示が変わるのはなぜ?」
「User-Agentって何の情報が含まれているの?」
Webサイトがブラウザを識別する鍵となるのが、User-Agentです。
この記事では、HTTPリクエストに含まれるUser-Agentについて、基礎から実践的な使い方まで分かりやすく解説していきますね。
User-Agentの基本概念

User-Agentって何?
User-Agent(ユーザーエージェント)は、ブラウザやアプリがWebサーバーに「自分は誰です」と伝えるための情報です。
HTTPリクエストヘッダーの一部として送信され、ブラウザの種類やバージョン、OSなどが含まれています。
パスポートや身分証明書のように、クライアントの身元を示すものなんですね。
なぜUser-Agentが必要なの?
Webサイトがクライアントを識別する理由はいくつかあります。
最適なコンテンツの提供
スマホには軽量版、PCには高機能版を表示できます。
画面サイズに合わせたレイアウトを選択できるんですね。
互換性の確保
古いブラウザには対応した表示方法を使います。
新しいCSSや機能をサポートしていない場合の回避策が取れますよ。
統計とアクセス解析
どのブラウザが人気か、モバイルとPCの比率はどうかなど、貴重なデータが得られます。
セキュリティとボット対策
不審なアクセスやクローラーを識別できます。
User-Agent文字列の構造
基本的なフォーマット
User-Agent文字列は、複数の情報が連結された形式です。
Chrome on Windowsの例:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
一見複雑ですが、パーツごとに意味があります。
各部分の意味
順番に分解してみましょう。
Mozilla/5.0
歴史的な理由で、ほぼすべてのブラウザに含まれます。
互換性のために残されているレガシー情報ですね。
プラットフォーム情報
(Windows NT 10.0; Win64; x64)
- Windows NT 10.0:Windows 10または11
- Win64:64ビット版Windows
- x64:64ビットプロセッサ
OSの種類とアーキテクチャが分かります。
レンダリングエンジン
AppleWebKit/537.36 (KHTML, like Gecko)
ChromeやSafariが使用するWebKitエンジンの情報です。
ブラウザ名とバージョン
Chrome/119.0.0.0
実際のブラウザとバージョン番号ですね。
Safari互換表記
Safari/537.36
Safariとの互換性を示すために追加されています。
主要ブラウザのUser-Agent例
Google Chrome
最新のChromeは以下のような文字列です。
Windows版:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
Mac版:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
Android版:
Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Mobile Safari/537.36
「Mobile」という文字が入ることで、モバイル版と識別できますね。
Mozilla Firefox
Firefoxの文字列はシンプルです。
Windows版:
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0
Geckoエンジンを使用していることが分かります。
Mac版:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/119.0
Safari
AppleのブラウザのUser-Agentです。
Mac版:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15
iPhone版:
Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1
iOSのバージョン情報も含まれていますね。
Microsoft Edge
EdgeもChromiumベースになりました。
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0
最後に「Edg」という識別子が追加されています。
JavaScriptでのUser-Agent取得

基本的な取得方法
ブラウザ側でUser-Agentを取得するのは簡単です。
const userAgent = navigator.userAgent;
console.log(userAgent);
navigator.userAgentプロパティで、文字列全体が取得できます。
ブラウザの判定
特定のブラウザかどうかを判定できます。
function detectBrowser() {
const ua = navigator.userAgent;
if (ua.indexOf('Chrome') !== -1 && ua.indexOf('Edg') === -1) {
return 'Chrome';
} else if (ua.indexOf('Firefox') !== -1) {
return 'Firefox';
} else if (ua.indexOf('Safari') !== -1 && ua.indexOf('Chrome') === -1) {
return 'Safari';
} else if (ua.indexOf('Edg') !== -1) {
return 'Edge';
}
return 'Unknown';
}
console.log('Browser:', detectBrowser());
文字列の検索で、ブラウザを特定できますね。
モバイル判定
スマホやタブレットかどうかを判定します。
function isMobile() {
const ua = navigator.userAgent;
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(ua);
}
if (isMobile()) {
console.log('モバイルデバイスです');
} else {
console.log('PCです');
}
正規表現で、モバイル端末のキーワードを検索していますよ。
OS判定
オペレーティングシステムを識別できます。
function detectOS() {
const ua = navigator.userAgent;
if (ua.indexOf('Win') !== -1) return 'Windows';
if (ua.indexOf('Mac') !== -1) return 'macOS';
if (ua.indexOf('Linux') !== -1) return 'Linux';
if (ua.indexOf('Android') !== -1) return 'Android';
if (ua.indexOf('iOS') !== -1 || ua.indexOf('iPhone') !== -1) return 'iOS';
return 'Unknown';
}
console.log('OS:', detectOS());
サーバーサイドでの取得と利用
Nodeでの取得
サーバー側でもUser-Agentを取得できます。
const express = require('express');
const app = express();
app.get('/', (req, res) => {
const userAgent = req.headers['user-agent'];
console.log('User-Agent:', userAgent);
res.send(`Your User-Agent: ${userAgent}`);
});
app.listen(3000);
HTTPヘッダーから取得するんですね。
PHPでの利用
PHPでは$_SERVERから取得します。
<?php
$userAgent = $_SERVER['HTTP_USER_AGENT'];
if (strpos($userAgent, 'Mobile') !== false) {
echo 'モバイル版ページを表示';
} else {
echo 'PC版ページを表示';
}
?>
Pythonでの処理
Pythonでも簡単に扱えます。
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def index():
user_agent = request.headers.get('User-Agent')
if 'Mobile' in user_agent:
return 'モバイル版'
else:
return 'PC版'
if __name__ == '__main__':
app.run()
User-Agentの実践的な活用
レスポンシブデザインとの使い分け
最近では、CSSメディアクエリが主流です。
CSSメディアクエリ(推奨):
/* モバイル用 */
@media (max-width: 768px) {
.content {
font-size: 14px;
}
}
/* PC用 */
@media (min-width: 769px) {
.content {
font-size: 16px;
}
}
画面サイズで判定する方が確実ですね。
User-Agentが有効な場面:
- サーバー側でコンテンツを切り替える
- モバイル専用ドメインにリダイレクト
- アクセス統計の収集
- 特定ブラウザのバグ回避
コンテンツ最適化
ブラウザに応じた最適な表示を提供します。
const ua = navigator.userAgent;
// Safari では WebP を避ける(古いバージョンの場合)
if (ua.indexOf('Safari') !== -1 && ua.indexOf('Chrome') === -1) {
document.getElementById('image').src = 'image.jpg';
} else {
document.getElementById('image').src = 'image.webp';
}
アクセス解析
訪問者の環境を統計的に把握します。
function sendAnalytics() {
const data = {
userAgent: navigator.userAgent,
browser: detectBrowser(),
os: detectOS(),
mobile: isMobile(),
screenSize: `${screen.width}x${screen.height}`
};
// アナリティクスサーバーに送信
fetch('/analytics', {
method: 'POST',
body: JSON.stringify(data)
});
}
ボットとクローラーのUser-Agent
検索エンジンボット
検索エンジンのクローラーは独自のUser-Agentを持っています。
Googlebot:
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Bingbot:
Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
これらを識別して、適切に対応する必要がありますね。
ボット判定
クローラーかどうかを判定します。
function isBot() {
const ua = navigator.userAgent.toLowerCase();
const botPatterns = [
'googlebot',
'bingbot',
'slurp', // Yahoo
'duckduckbot',
'baiduspider',
'yandexbot',
'crawler',
'spider',
'bot'
];
return botPatterns.some(pattern => ua.indexOf(pattern) !== -1);
}
if (isBot()) {
console.log('ボットによるアクセスです');
}
robots.txtとの連携
クローラーには、robots.txtで適切な指示を出しましょう。
User-agent: Googlebot
Allow: /
User-agent: *
Disallow: /admin/
User-Agentを指定して、アクセス制御できますよ。
User-Agentスプーフィング
スプーフィングとは
User-Agentを偽装することです。
ブラウザの開発者ツールで、簡単に変更できます。
Chrome DevToolsでの変更:
- F12で開発者ツールを開く
- メニュー(⋮)→「その他のツール」→「ネットワーク条件」
- User-Agentのチェックを外してカスタム設定
スプーフィングの用途
正当な利用例もあります。
開発者のテスト
モバイル表示を確認するために、User-Agentを変更します。
アクセス制限の回避
一部のサイトは特定のブラウザしか受け付けません。
プライバシー保護
詳細な情報を隠したい場合に使われることもありますね。
セキュリティへの影響
User-Agentだけを信頼してはいけません。
重要な判断には使わない:
- セキュリティ判定
- 決済処理
- ログイン認証
他の情報と組み合わせて、総合的に判断する必要があります。
プライバシーとUser-Agent

フィンガープリンティング
User-Agentは、ユーザー追跡に使われる可能性があります。
画面解像度、タイムゾーン、インストールされたフォントなどと組み合わせると、個人を特定できてしまうんです。
これを「ブラウザフィンガープリンティング」と呼びます。
User-Agent削減の動き
プライバシー保護のため、情報量を減らす取り組みがあります。
User-Agent Reduction:
Chromeなどで、段階的に詳細情報が削減されています。
将来的には、より一般的な文字列になる予定ですね。
User-Agent Client Hints
新しいアプローチとして登場しました。
従来の方法:
すべての情報を一度に送信します。
Client Hints:
サーバーが必要な情報だけを要求できます。
Accept-CH: Sec-CH-UA-Platform, Sec-CH-UA-Mobile
必要最小限の情報交換で、プライバシーを保護できますよ。
User-Agent解析ライブラリ
JavaScript用ライブラリ
複雑な解析を簡単にするツールがあります。
UAParser.js:
import UAParser from 'ua-parser-js';
const parser = new UAParser();
const result = parser.getResult();
console.log('Browser:', result.browser.name);
console.log('Version:', result.browser.version);
console.log('OS:', result.os.name);
console.log('Device:', result.device.type);
詳細な情報を構造化して取得できます。
サーバーサイドライブラリ
Node.js – express-useragent:
const useragent = require('express-useragent');
const express = require('express');
const app = express();
app.use(useragent.express());
app.get('/', (req, res) => {
console.log('Browser:', req.useragent.browser);
console.log('Mobile:', req.useragent.isMobile);
console.log('OS:', req.useragent.os);
res.send('User-Agent analyzed!');
});
Python – user-agents:
from user_agents import parse
ua_string = 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0...'
user_agent = parse(ua_string)
print(f'Mobile: {user_agent.is_mobile}')
print(f'Browser: {user_agent.browser.family}')
print(f'OS: {user_agent.os.family}')
手動で解析するより、ライブラリを使う方が確実ですね。
よくある問題とトラブルシューティング

User-Agentが取得できない
いくつかの原因が考えられます。
プライバシー拡張機能:
一部のブラウザ拡張が、User-Agentをブロックしています。
古いブラウザ:
非常に古い環境では、形式が異なる場合があります。
デフォルト値の設定:
const ua = navigator.userAgent || 'Unknown';
取得できない場合に備えて、デフォルト値を用意しましょう。
判定が正しく動かない
文字列マッチングの落とし穴です。
部分一致の問題:
// 間違い:EdgeもChromeと判定される
if (ua.indexOf('Chrome') !== -1) {
return 'Chrome';
}
// 正しい:Edgeを先に判定
if (ua.indexOf('Edg') !== -1) {
return 'Edge';
} else if (ua.indexOf('Chrome') !== -1) {
return 'Chrome';
}
判定順序が重要ですね。
更新への対応
ブラウザは頻繁に更新されます。
将来性のあるコード:
// 具体的なバージョン番号に依存しない
const isModernBrowser = 'fetch' in window && 'Promise' in window;
if (isModernBrowser) {
// 最新機能を使用
} else {
// 代替処理
}
機能検出(Feature Detection)の方が安全です。
代替手段と将来の方向性
機能検出(Feature Detection)
User-Agentよりも推奨される方法です。
// User-Agentで判定(非推奨)
if (ua.indexOf('Chrome') !== -1) {
// WebP対応前提の処理
}
// 機能検出(推奨)
if (window.createImageBitmap) {
// WebP対応の処理
} else {
// 代替処理
}
実際に機能があるか直接確認する方が確実ですね。
Modernizr
機能検出を簡単にするライブラリです。
if (Modernizr.webp) {
// WebP対応
} else {
// JPEGやPNG使用
}
レスポンシブデザイン
画面サイズで判定する現代的な方法です。
// JavaScript
const isMobile = window.innerWidth <= 768;
// CSS
@media (max-width: 768px) {
/* モバイル用スタイル */
}
User-Agentに頼らない設計が主流になっていますよ。
セキュリティ上の注意点
User-Agentを信頼しすぎない
簡単に偽装できるため、重要な判断には使えません。
避けるべき使い方:
- User-Agentだけでログイン許可
- User-Agentだけでアクセス制御
- User-Agentだけで料金決定
サーバーサイドでの検証
クライアント側の判定は、サーバーでも再検証しましょう。
// クライアント側
if (isMobile()) {
// モバイル用処理
}
// サーバー側でも確認
app.get('/api/data', (req, res) => {
const ua = req.headers['user-agent'];
if (ua.includes('Mobile')) {
// モバイル用データ
} else {
// PC用データ
}
});
実践的なTips
User-Agentのログ記録
問題解決のために、ログを残しましょう。
app.use((req, res, next) => {
console.log({
timestamp: new Date(),
ip: req.ip,
userAgent: req.headers['user-agent'],
path: req.path
});
next();
});
トラブル時の調査に役立ちますよ。
A/Bテストでの活用
特定のブラウザでの挙動テストに使えます。
function shouldShowNewFeature() {
const ua = navigator.userAgent;
// Chromeユーザーの50%に新機能を表示
if (ua.indexOf('Chrome') !== -1) {
return Math.random() < 0.5;
}
return false;
}
パフォーマンス最適化
ブラウザの性能に応じた最適化ができます。
const ua = navigator.userAgent;
// 古いAndroid端末では重い処理を避ける
if (ua.indexOf('Android 4') !== -1) {
// 軽量版の処理
} else {
// 通常処理
}
まとめ:User-Agentを適切に活用しよう
User-Agentは、Webアプリケーション開発で役立つ情報源です。
しかし、プライバシーやセキュリティを考慮して、適切に使用することが重要です。
この記事の重要ポイント:
- User-Agentはブラウザがサーバーに送る識別情報
- ブラウザ、OS、デバイスタイプなどが含まれる
- JavaScriptとサーバーサイドの両方で取得可能
- モバイル判定やブラウザ判定に使える
- 簡単に偽装できるため、セキュリティには使えない
- 機能検出やレスポンシブデザインの方が推奨される
- User-Agent Client Hintsが新しい標準として登場
- ライブラリを使うと解析が簡単
まずは開発者ツールで、自分のブラウザのUser-Agentを確認してみましょう。
実際に触れることで、User-Agentの理解が深まっていきますよ。

コメント