API キー
API の利用者を識別し、アクセスを制御するための文字列トークン
APIセキュリティ
API キーとは
API キーは、API の利用者を識別し、アクセスを制御するための文字列トークンである。認証 (誰か) ではなく識別 (どのクライアントか) に使う。レート制限や使用量の追跡に利用される。
API キー vs 認証トークン
API キーと認証トークンの違いを以下にまとめる。
| 観点 | API キー | OAuth / JWT |
|---|---|---|
| 目的 | クライアントの識別 | ユーザーの認証・認可 |
| セキュリティ | 低い (秘密の共有) | 高い (署名付きトークン) |
| 有効期限 | 長い (手動ローテーション) | 短い (自動更新) |
| 用途 | 公開 API、レート制限 | ユーザーデータへのアクセス |
API キーの送信方法
API キーの送信方法の例を示す。
# ヘッダーで送信 (推奨)
curl -H "x-api-key: abc123" https://api.example.com/data
# クエリパラメータで送信 (非推奨: ログに残る)
curl https://api.example.com/data?api_key=abc123
API キーの管理
API キーはコードにハードコードせず環境変数で管理し、AWS では Secrets Manager でセキュアに保存する。定期的に新しいキーにローテーションし、必要な API のみアクセス可能なスコープ制限と、特定の IP からのみ使用可能な IP 制限を設ける。
API キーの漏洩対策
API キーの漏洩対策を図で示す。
❌ よくある漏洩パターン:
- Git リポジトリにコミット
- フロントエンドの JS に埋め込み
- ログに出力
- URL のクエリパラメータに含める
✅ 対策:
- .gitignore で .env を除外
- サーバーサイドでのみ使用
- ログのマスキング
- ヘッダーで送信
Lambda での API キーの取得
Lambda での API キーの取得のコード例を示す。
import { SecretsManagerClient, GetSecretValueCommand } from '@aws-sdk/client-secrets-manager';
const client = new SecretsManagerClient({});
const secret = await client.send(
new GetSecretValueCommand({ SecretId: 'my-api-key' })
);
const apiKey = secret.SecretString;
API キーだけでは不十分
API キーは識別には使えるが、セキュリティの唯一の防御線にしない。認証が必要な API には OAuth 2.0 / JWT を併用する。
全体像を把握するには関連書籍も有用。
この記事は役に立ちましたか?
関連用語
レート制限
API やサービスへのリクエスト数に上限を設け、過負荷を防ぐ仕組み
API Gateway
API のエントリーポイントとして認証、スロットリング、ルーティングを一元管理する AWS サービス
シークレット管理
パスワード、API キー、証明書などの機密情報を安全に保存・配布・ローテーションする手法
ケイパビリティベースセキュリティ
リソースへのアクセス権を偽造不可能なトークン (ケイパビリティ) として管理するセキュリティモデル
OpenID Connect
OAuth 2.0 の上に構築された認証レイヤーで、ユーザーの身元情報を ID トークンとして提供する
OAuth 2.0
ユーザーのパスワードを渡さずに、リソースへの限定的なアクセスを許可する認可フレームワーク