Authorization ヘッダー - Basic / Bearer / API Key

入門 | 10分 で読める | 2026.05.02

公式ドキュメント

Authorization ヘッダーとは

Authorizationヘッダーは、クライアント(ブラウザやアプリ)がサーバーに対して認証情報を送信するためのHTTPヘッダーです。APIアクセスやログインが必要なリソースへのアクセス時に使用されます。

なぜ必要か: HTTPはステートレスなため、リクエストごとに「誰からのアクセスか」を証明する必要があります。Authorizationヘッダーで認証情報を送り、サーバーが検証します。

基本フォーマット

Authorization: <type> <credentials>
  • type: 認証スキーム(Basic, Bearer, Digestなど)
  • credentials: 認証情報(形式はスキームによって異なる)

主要な認証スキーム

スキーム形式用途セキュリティ
BasicBasic <base64(user:pass)>簡易認証低(HTTPS必須)
BearerBearer <token>OAuth 2.0 / JWT
DigestDigest <parameters>Basic認証の改良版中(レガシー)
API Keyカスタムヘッダーで送信サービス間通信中〜高

ポイント: Authorizationヘッダーは標準化されていますが、API Keyはカスタムヘッダー(例: X-API-Key)で送ることも多いです

Basic認証

最もシンプルな認証方式です。ユーザー名とパスワードをコロンで結合し、Base64エンコードして送信します。

リクエスト例

GET /api/users HTTP/1.1
Host: api.example.com
Authorization: Basic dXNlcjpwYXNzd29yZA==

dXNlcjpwYXNzd29yZA==の中身:

echo -n "user:password" | base64
# dXNlcjpwYXNzd29yZA==

サーバー側の検証

// Node.js / Express
app.get('/api/users', (req, res) => {
 const authHeader = req.headers.authorization;
 
 if (!authHeader || !authHeader.startsWith('Basic ')) {
 return res.status(401).json({ error: 'Missing or invalid Authorization header' });
 }
 
 const base64Credentials = authHeader.split(' ')[1];
 const credentials = Buffer.from(base64Credentials, 'base64').toString('ascii');
 const [username, password] = credentials.split(':');
 
 // 認証チェック
 if (username === 'user' && password === 'password') {
 res.json({ users: [...] });
 } else {
 res.status(401).json({ error: 'Invalid credentials' });
 }
});

レスポンス(認証失敗時)

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="API Access"

ブラウザはWWW-Authenticateヘッダーを受け取ると、ログインダイアログを表示します。

注意: Basic認証はBase64エンコードだけで暗号化ではありません。HTTPS通信でない限り、パスワードが平文で送信されます。本番環境では必ずHTTPSを使用してください

Basic認証の用途

  • 開発環境の簡易保護: Stagingサイトへのアクセス制限
  • 内部API: 信頼できるネットワーク内での軽量な認証
  • 管理画面の初期認証: アプリケーションレベル認証と併用

Basic認証の欠点

  • パスワードが毎回送信される(漏洩リスク)
  • ログアウト機能がない(ブラウザがキャッシュ)
  • 細かい権限制御ができない

Bearer Token(Bearer認証)

OAuth 2.0やJWTで使用される、現代のAPI認証の主流です。トークン(証明書)を発行し、リクエストごとに送信します。

リクエスト例

GET /api/users HTTP/1.1
Host: api.example.com
Authorization: Bearer YOUR_ACCESS_TOKEN

OAuth 2.0 フロー

  1. クライアントが認証サーバーにログイン
  2. アクセストークンを取得
POST /oauth/token HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded

grant_type=password&username=user&password=YOUR_PASSWORD&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET

レスポンス:

{
 "access_token": "YOUR_ACCESS_TOKEN",
 "token_type": "Bearer",
 "expires_in": 3600,
 "refresh_token": "YOUR_REFRESH_TOKEN"
}
  1. APIリクエストにトークンを付与
GET /api/profile HTTP/1.1
Authorization: Bearer YOUR_ACCESS_TOKEN

JWT(JSON Web Token)

JWTはBearer Tokenの実装の一つで、トークン自体に情報を含めます。

構造:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 ← Header (Base64)
.
eyJ1c2VySWQiOjEyMywibmFtZSI6IkpvaG4ifQ ← Payload (Base64)
.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c ← Signature

Payloadの中身:

{
 "userId": 123,
 "name": "John",
 "exp": 1714521600
}

サーバー側の検証(JWT)

const jwt = require('jsonwebtoken');
const SECRET_KEY = process.env.JWT_SECRET;

app.get('/api/profile', (req, res) => {
 const authHeader = req.headers.authorization;
 
 if (!authHeader || !authHeader.startsWith('Bearer ')) {
 return res.status(401).json({ error: 'Missing token' });
 }
 
 const token = authHeader.split(' ')[1];
 
 try {
 const decoded = jwt.verify(token, SECRET_KEY);
 // decoded = { userId: 123, name: "John", exp: 1714521600 }
 
 res.json({ user: decoded });
 } catch (err) {
 res.status(401).json({ error: 'Invalid or expired token' });
 }
});

ポイント: JWTはサーバー側でセッション管理が不要(ステートレス)です。トークン自体に情報が含まれ、署名で改ざんを検知できます。

Bearer Token の用途

  • モダンなWebアプリケーション: React/Vue.js等のSPA
  • モバイルアプリ: iOS/Androidアプリのバックエンド認証
  • マイクロサービス: サービス間認証
  • サードパーティAPI連携: OAuth 2.0でアクセス許可

Bearer Token のベストプラクティス

  1. 有効期限を短く: 15分〜1時間
  2. Refresh Token で更新: 長期間のセッションを維持
  3. HTTPS必須: トークン漏洩を防ぐ
  4. トークンをlocalStorageに保存しない: XSS攻撃のリスク
// ✗ 悪い例: localStorageに保存
localStorage.setItem('token', token);

// ✓ 良い例: HttpOnly Cookieに保存(サーバーがSet-Cookie)
res.cookie('accessToken', token, {
 httpOnly: true,
 secure: true,
 sameSite: 'lax',
 maxAge: 3600000
});

API Key

サービス間通信や、サードパーティ開発者向けAPIでよく使われます。

送信方法

1. Authorizationヘッダー(非標準)

GET /api/data HTTP/1.1
Authorization: ApiKey YOUR_API_KEY

2. カスタムヘッダー(一般的)

GET /api/data HTTP/1.1
X-API-Key: YOUR_API_KEY

3. クエリパラメータ(非推奨)

GET /api/data?api_key=YOUR_API_KEY HTTP/1.1

問題点: URLはログに残りやすく、ブラウザ履歴やアクセスログに記録される。

注意: API Keyをクエリパラメータで送信すると、サーバーログやブラウザ履歴に残るリスクがあります。ヘッダーで送信しましょう。

サーバー側の検証

app.get('/api/data', (req, res) => {
 const apiKey = req.headers['x-api-key'];
 
 if (!apiKey) {
 return res.status(401).json({ error: 'API key required' });
 }
 
 // データベースで検証
 const client = apiKeys.find(k => k.key === apiKey);
 
 if (!client || !client.active) {
 return res.status(403).json({ error: 'Invalid or inactive API key' });
 }
 
 // レート制限チェック
 if (client.requestCount > client.limit) {
 return res.status(429).json({ error: 'Rate limit exceeded' });
 }
 
 res.json({ data: [...] });
});

API Key の管理

項目推奨方法
生成暗号学的に安全なランダム文字列(32文字以上)
保存ハッシュ化して保存(bcrypt/argon2)
ローテーション定期的に再発行
スコープ制限必要な権限のみ付与
有効期限長期(1年など)だが、使用頻度が低ければ短縮

API Key の用途

  • 外部開発者向けAPI: Stripe、Google Maps API、決済・地図系API
  • サーバー間通信: マイクロサービス、Webhook
  • CI/CDパイプライン: ビルド時のAPI呼び出し

認証方式の比較

方式セキュリティ実装の複雑さステートレス用途
Basic認証低(HTTPS必須)簡単開発環境、簡易保護
Bearer (JWT)SPA、モバイルアプリ
Bearer (OAuth)サードパーティ連携
API Key中〜高簡単サーバー間通信
Digestレガシー(非推奨)

実践メモ: ユーザー向けアプリはBearer (JWT)、サーバー間通信はAPI Keyが主流です。Basic認証は開発環境の一時的な保護に留めましょう。

クライアント側の実装例

JavaScript(fetch)

// Basic認証
fetch('https://api.example.com/users', {
 headers: {
 'Authorization': 'Basic ' + btoa('user:password')
 }
});

// Bearer Token
const token = 'YOUR_ACCESS_TOKEN';
fetch('https://api.example.com/profile', {
 headers: {
 'Authorization': `Bearer ${token}`
 }
});

// API Key
fetch('https://api.example.com/data', {
 headers: {
 'X-API-Key': 'YOUR_API_KEY'
 }
});

cURL

# Basic認証
curl -u user:password https://api.example.com/users

# Bearer Token
curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" https://api.example.com/profile

# API Key
curl -H "X-API-Key: YOUR_API_KEY" https://api.example.com/data

Axios(JavaScript)

import axios from 'axios';

// Bearer Token をグローバル設定
axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;

// リクエスト
const response = await axios.get('https://api.example.com/profile');

セキュリティベストプラクティス

1. HTTPS必須

全ての認証情報はHTTPS通信で送信する。

// ✗ 悪い例: HTTP
http://api.example.com

// ✓ 良い例: HTTPS
https://api.example.com

2. トークンの有効期限

{
 "access_token": "...",
 "expires_in": 900, // 15分
 "refresh_token": "..."
}

3. レート制限

// API Keyごとにリクエスト数を制限
const rateLimit = require('express-rate-limit');

const limiter = rateLimit({
 windowMs: 60 * 1000, // 1分
 max: 60, // 60リクエスト/分
 keyGenerator: (req) => req.headers['x-api-key']
});

app.use('/api/', limiter);

4. トークンの保存場所

保存場所セキュリティ用途
HttpOnly Cookie高(XSS耐性)SPA、サーバーレンダリング
メモリ(変数)高(リロードで消える)SPA(短時間)
localStorage低(XSS脆弱)非推奨
sessionStorage低(XSS脆弱)非推奨

5. スコープと権限分離

// JWTのPayload
{
 "userId": 123,
 "scope": ["read:users", "write:posts"],
 "exp": 1714521600
}

サーバー側で必要な権限があるか確認。

if (!decoded.scope.includes('write:posts')) {
 return res.status(403).json({ error: 'Insufficient permissions' });
}

デバッグとトラブルシューティング

Chrome DevTools で確認

  1. Network タブ → Headers
  • Authorizationヘッダーの値を確認
  • WWW-Authenticateレスポンスを確認
  1. Console で Base64 デコード
atob('dXNlcjpwYXNzd29yZA=='); // "user:password"

よくあるエラー

401 Unauthorized:

  • Authorizationヘッダーが欠けている
  • トークンが無効・期限切れ
  • 認証情報が間違っている

403 Forbidden:

  • 認証は成功したが、権限がない
  • API Keyのスコープが不足

429 Too Many Requests:

  • レート制限に達した
  • API Keyの使用量超過

まとめ

Authorizationヘッダーは、HTTPにおける認証の基本です。Basic認証はシンプルですがHTTPS必須、Bearer Tokenはモダンなアプリケーションの標準、API Keyはサーバー間通信で便利です。用途に応じて適切な認証方式を選び、HTTPS・有効期限・レート制限などのセキュリティ対策を必ず実施しましょう。

参考リソース

← 一覧に戻る
PR
PR
PR
PR