セキュリティ

APIキー直書きを含むHTMLを共有するときのリスクと対策

APIキーがHTMLのソースに直書きされた状態でプレビューURLを共有すると、URLを受け取った全員がキーを取得できる状態になります。共有相手が信頼できる社内メンバーだけでも、URLがSlackの検索でヒットしたりメール転送されたりすれば意図せず流出するリスクがあります。リスクの範囲を正しく理解したうえで対策を取ることが重要です。

なぜ危ないのか

HTMLにAPIキーが含まれている場合、そのプレビューURLにアクセスしたブラウザは自動的にHTMLとすべてのJSを取得します。ユーザーがDevToolsを開かなくても、ブラウザの拡張機能や中間プロキシがキーを読み取る可能性があります。また、Slack・Notion・Teamsなどのリンクプレビュー生成処理がURL先のHTMLを読み取る際にキーが外部サーバーのログに残ることもあります。

APIキーは発行されたAPIの権限を持ちます。たとえばStripeのAPIキーが漏れれば決済処理の呼び出しが可能になり、SendGridのキーなら任意のメール送信ができます。AI系APIキー(OpenAI・Anthropicなど)は高額請求に直結します。キーの権限スコープによっては、流出後の被害が非常に大きくなります。

  • 相手がログインなしで開ける状態か確認する
  • PCとスマホで最低1回ずつ表示を確認する
  • 内部情報・個人情報・不要な外部送信が残っていないか見る
  • レビュー期限と修正時の差し替え方を決めておく

ソースで見る場所

共有前の確認では、テキストエディタでHTMLを開き`Ctrl+F`で`key`・`token`・`secret`・`password`を検索するのが最速です。`<script>`ブロック全体と`fetch()`の引数、`Authorization`ヘッダーを組み立てている箇所を重点的に確認してください。`fetch('https://api.openai.com/v1/chat/completions', { headers: { 'Authorization': 'Bearer sk-...' } })`のようなパターンが典型的な直書きです。

外部からCDNで読み込んでいるJSファイルがある場合(例:`<script src="https://cdn.example.com/app.js">`)も確認が必要です。そのURLをブラウザで直接開いてソースを確認するか、`curl -L <URL> | grep -i key`で内容を検索してください。AIがバンドルしたJSファイルをCDN代わりのURLで読み込む構成を出力することがあります。

  • HTML内の外部script・form action・iframeを確認する
  • APIキーやトークンらしき文字列がないか検索する
  • 画像・CSS・JSのパスが公開後も解決できるか見る
  • noindexと認証を混同せず、必要なら両方設定する

安全に共有する設定

どうしてもAPI呼び出しが必要なHTMLをレビュー共有したい場合は、プレビューURLにアクセス制限を設けてください。ギガサイト便のような認証付き共有サービスを使えば、特定のメールアドレスだけがURLを開けるように設定できます。これにより不特定多数への漏えいリスクを大幅に下げられます。

APIキーをモックデータやFetch差し替えで動作確認するアプローチも有効です。`fetch()`を`mockFetch()`にオーバーライドして固定レスポンスを返すシム(モックサービスワーカー)を使えば、本物のAPIキーなしでUIの動作確認ができます。「見た目の確認」と「機能の確認」を切り分けることで、デザインレビュー段階ではAPIキーなしのHTMLを共有する運用を実現できます。

  • HTML内の外部script・form action・iframeを確認する
  • APIキーやトークンらしき文字列がないか検索する
  • 画像・CSS・JSのパスが公開後も解決できるか見る
  • noindexと認証を混同せず、必要なら両方設定する

再発防止ルール

APIキーを絶対にHTMLに書かないというルールをチームで合意してください。「開発中は一時的に書いてよい」という例外を作ると、その「一時的」なファイルが共有・コミット・デプロイされる事故が繰り返されます。ローカル開発でもAPIキーはブラウザのHTMLには含めず、ローカルプロキシサーバー(`localhost:3001/api/openai`など)経由でアクセスする設計を最初から採用してください。

APIキーが漏れていないかを定期的にスキャンする習慣も重要です。GitHubは秘密情報スキャン機能をデフォルトで有効にしており、コミットやプッシュ時にAPIキーと思われる文字列を検出してアラートを送ります。GitHubを使っていない場合はgit-secretsやTruffleHogをCIに組み込むことでコミット時の自動検出が可能です。

  • HTML内の外部script・form action・iframeを確認する
  • APIキーやトークンらしき文字列がないか検索する
  • 画像・CSS・JSのパスが公開後も解決できるか見る
  • noindexと認証を混同せず、必要なら両方設定する

よくある質問

パスワード保護されたプレビューURLならAPIキーが含まれていても安全ですか?

パスワード保護は不特定多数からのアクセスを防ぎますが、パスワードを知っている人全員がキーを取得できます。パスワードが転送・共有・メモされるリスクを考えると、根本的にはAPIキーをHTML外に出す対応が必要です。

制限付きAPIキー(読み取り専用など)なら直書きしても問題ないですか?

リスクは下がりますが、完全に安全とは言えません。読み取り専用でも個人データや非公開情報を取得できるAPIの場合は情報漏えいになります。また読み取り権限で利用量が増えれば料金超過にもつながるため、制限付きでも直書きは原則避けてください。

既に共有したHTMLにAPIキーが含まれていたことに気づいた場合、閲覧ログで被害を確認できますか?

APIプロバイダーのダッシュボードでキーの使用ログを確認できます。OpenAIなら「Usage」ページで日時・モデル・トークン数が確認でき、通常より多い呼び出しがあれば不正利用の疑いがあります。まずキーを失効させてからログを精査してください。

関連記事

セキュリティ

APIキー直書きを防ぐAIプロンプトと公開前スキャン

AI生成HTMLへのAPIキー直書きをプロンプト設計で防ぎ、公開前スキャンで二重検出したい開発者・制作担当者向け。具体的なプロンプト文言とgrepコマンドをセットで紹介します。

4分で読める
セキュリティ

Stripeキーを含むHTMLを共有するときのリスクと対策

StripeキーがHTMLに含まれている状態でのリスクの大きさと、キーの種類に応じた対処法を理解したい開発者・担当者向け。本番・テスト・Publishable・Secretの違いをもとに、どこまで対応すべきかを判断できる。

5分で読める
「セキュリティ」の記事をもっと見る →