HTTP Basic認証でのBase64

HTTP Basic認証がBase64で資格情報をエンコードする仕組みを解説。フォーマット、セキュリティ上の注意点、HTTPSでの正しい実装方法を紹介します。

Format

詳細な説明

RFC 7617で定義されたHTTP Basic認証は、Base64エンコードを使用してHTTPリクエストヘッダーでユーザー資格情報を送信します。最もシンプルな認証スキームの一つですが、重要なセキュリティ上の考慮事項があります。

仕組み:

  1. クライアントがユーザー名とパスワードをコロンで結合:username:password
  2. この文字列をBase64エンコード:dXNlcm5hbWU6cGFzc3dvcmQ=
  3. エンコードされた文字列を Basic プレフィックス付きで Authorization ヘッダーに送信
GET /api/resource HTTP/1.1
Host: api.example.com
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

各言語でのヘッダー構築:

JavaScript:

const credentials = btoa(`${username}:${password}`);
fetch(url, {
  headers: { "Authorization": `Basic ${credentials}` }
});

Python:

import base64, requests
credentials = base64.b64encode(f"{username}:{password}".encode()).decode()
requests.get(url, headers={"Authorization": f"Basic {credentials}"})
# Or simply: requests.get(url, auth=(username, password))

cURL:

curl -u username:password https://api.example.com/resource
# curl automatically Base64-encodes and adds the header

セキュリティ上の考慮事項:

Base64は暗号化ではありません。Authorization ヘッダーを傍受した者は資格情報を簡単にデコードできます:

atob("dXNlcm5hbWU6cGFzc3dvcmQ=") // "username:password"

このため、HTTP Basic認証は必ずHTTPS(TLS)上で使用する必要があります。暗号化はトランスポート層で行われ、エンコーディングでは行われません。HTTPSがなければ、資格情報は平文で送信されます(Base64は単なるテキスト表現であり、保護ではありません)。

Basic認証が適切な場面:

  • 両方がHTTPSを使用する管理下のサーバー間API呼び出し
  • 内部ツールや開発環境
  • OAuthが過剰になるシンプルなインテグレーション

Basic認証を避けるべき場面:

  • ユーザー向けのログインフォーム(セッションベース認証やOAuthを使用)
  • クライアントサイドコードに資格情報を保存する必要があるAPI
  • HTTPSが保証できないコンテキスト

よくある間違い: パスワードにコロンを含めること。RFCではユーザー名にコロンを含めてはならないとされていますが、パスワードには含められます。分割は最初のコロンでのみ行われます:admin:p4ss:word はユーザー名 admin でパスワード p4ss:word です。

ユースケース

APIキーをユーザー名とし空のパスワードを使うHTTP Basic認証が必要な決済ゲートウェイへのAPIリクエストを認証する場合に使用します。

試してみる — Base64 Encoder

フルツールを開く