API キーとは
この記事は約 2 分で読めます
API キーとは、アプリケーション間の通信で呼び出し元を識別するために使われる一意の文字列です。Web サービスやクラウドプラットフォームが提供する API にアクセスする際、リクエストに API キーを含めることで「誰がこの API を呼んでいるのか」をサーバー側が判別します。ただし、API キーは厳密には認証 (authentication) ではなく識別 (identification) の手段であり、OAuth トークンのようなきめ細かい権限制御とは根本的に異なる点を理解しておく必要があります。
API キーの仕組み
API キーの送信方法は主に 2 つあります。1 つ目はリクエストヘッダーに含める方式で、<code>Authorization: Bearer sk-xxxx</code> や <code>X-API-Key: xxxx</code> のように HTTP ヘッダーに埋め込みます。2 つ目はクエリパラメータとして URL に付与する方式 (<code>?api_key=xxxx</code>) ですが、こちらはサーバーログやブラウザ履歴にキーが残るため、現在ではセキュリティ上推奨されません。ヘッダー方式であっても、通信が TLS で暗号化されていなければキーは平文で流れるため、HTTPS の利用は大前提です。
API キーと OAuth トークンの違い
API キーは「このリクエストはどのアプリケーションから来たか」を示す識別子であり、通常は固定の文字列です。一方、OAuth のアクセストークンは「どのユーザーが、どのスコープ (権限範囲) で、いつまで有効な認可を与えたか」を表現する動的なトークンです。API キーが漏洩すると、そのキーに紐づくすべての操作が無制限に実行される危険がありますが、OAuth トークンはスコープの限定と有効期限により被害範囲を局所化できます。実務上は、公開 API の利用量制限には API キー、ユーザーデータへのアクセスには OAuth トークンという使い分けが一般的です。
キー漏洩事故の実態
API キーの漏洩は、開発現場で最も頻繁に起きるセキュリティインシデントの 1 つです。GitHub の公開リポジトリに AWS のアクセスキーをコミットしてしまい、数分以内に自動スキャンボットに検出されて暗号通貨マイニングに悪用される事例は後を絶ちません。2023 年には、ある企業が Slack のメッセージ内に API キーを貼り付けたことが原因で大規模なデータ漏洩に発展しました。AWS は GitHub 上の漏洩キーを自動検出して無効化する仕組みを導入していますが、検出までのわずかな時間差で被害が発生するケースもあります。スタートアップのセキュリティチェックリストでも、キー管理は最優先項目として挙げられています。
シークレット管理のベストプラクティス
API キーをソースコードに直接書き込む (ハードコード) のは最も危険なアンチパターンです。代わりに、環境変数 (<code>.env</code> ファイル) でキーを管理し、<code>.gitignore</code> で Git の追跡対象から除外するのが最低限の対策です。より堅牢な運用では、HashiCorp Vault や AWS Secrets Manager のようなシークレット管理サービスを利用します。これらのサービスは、キーの保存時暗号化、アクセスログの記録、自動ローテーションといった機能を提供し、キーのライフサイクル全体を安全に管理できます。鍵管理の基本原則として、キーにアクセスできる人間とシステムを最小権限に絞ることが重要です。
シークレット管理の実践的な手法は、API セキュリティの実践書 (Amazon)でも体系的に解説されています。
ローテーションの重要性
API キーは定期的に新しいものに差し替える (ローテーション) べきです。キーが漏洩していても気づかないケースは多く、定期ローテーションは「気づかない漏洩」の被害期間を限定する保険として機能します。AWS や Google Cloud では 90 日ごとのローテーションが推奨されており、自動ローテーション機能も提供されています。ローテーション時は、旧キーと新キーの両方が一定期間有効な「グレースピリオド」を設けることで、サービスの中断を防ぎます。API キー管理の詳細ガイドも参考にしてください。
よくある誤解
「API キーがあればセキュリティは万全」という誤解は根強いですが、API キーは単なる識別子であり、それだけでは十分な保護にはなりません。API キーに加えて、IP アドレス制限、レート制限、リファラーチェックなどを組み合わせた多層防御が不可欠です。また、フロントエンドの JavaScript に API キーを埋め込むと、ブラウザの開発者ツールから誰でも閲覧できてしまうため、サーバーサイドでのみキーを扱う設計が原則です。
この記事は役に立ちましたか?