API キー
API の利用者を識別し、アクセスを制御するための文字列トークン
APIセキュリティ
API キーとは
API キーは、API の利用者を識別し、アクセスを制御するための文字列トークンである。認証 (誰か) ではなく識別 (どのクライアントか) に使う。レート制限や使用量の追跡に利用される。
API キー vs 認証トークン
| 観点 | API キー | OAuth / JWT |
|---|---|---|
| 目的 | クライアントの識別 | ユーザーの認証・認可 |
| セキュリティ | 低い (秘密の共有) | 高い (署名付きトークン) |
| 有効期限 | 長い (手動ローテーション) | 短い (自動更新) |
| 用途 | 公開 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 キーの漏洩対策
❌ よくある漏洩パターン:
- Git リポジトリにコミット
- フロントエンドの JS に埋め込み
- ログに出力
- URL のクエリパラメータに含める
✅ 対策:
- .gitignore で .env を除外
- サーバーサイドでのみ使用
- ログのマスキング
- ヘッダーで送信
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 を併用する。
全体像を把握するには関連書籍も有用。