HTTP Basic認証でのBase64
HTTP Basic認証がBase64で資格情報をエンコードする仕組みを解説。フォーマット、セキュリティ上の注意点、HTTPSでの正しい実装方法を紹介します。
Format
詳細な説明
RFC 7617で定義されたHTTP Basic認証は、Base64エンコードを使用してHTTPリクエストヘッダーでユーザー資格情報を送信します。最もシンプルな認証スキームの一つですが、重要なセキュリティ上の考慮事項があります。
仕組み:
- クライアントがユーザー名とパスワードをコロンで結合:
username:password - この文字列をBase64エンコード:
dXNlcm5hbWU6cGFzc3dvcmQ= - エンコードされた文字列を
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リクエストを認証する場合に使用します。