環境変数とシークレットとは?わかりやすい入門ガイド
環境変数とは、DATABASE_URLやSTRIPE_SECRET_KEYのような名前付きの設定のことで、アプリの実行時に渡されるものです。コードに直接書き込むことはしません。シークレットとは、値を非公開にしておかなければならない環境変数のことです。APIキー、パスワード、署名用のキーなどが該当します。こうした値をコードの外に置いておくと、アプリを編集せずに値を変更でき、テスト用と実際の顧客向けで別の値を使い分けられ、コードを共有・公開したときに漏えいするのを防げます。
AIでアプリを作るときに重要な理由
アプリが別のサービスを使って何か有用なことをするとき(決済を処理する、メールを送る、AIモデルを呼び出すなど)、キーが必要になります。AIアプリビルダーは頻繁にこうしたキーを求めてきますが、キーがどこに置かれるかで、アプリが安全かどうかが決まります。
AIで作られたアプリでは、次の2つの問題がよく起きます。
- キーをチャットやコードに貼り付けてしまう。 そうすると、キーはチャット履歴、プロジェクトのファイル、エクスポートやリポジトリに残ります。それを見た人は誰でもあなたのアカウントを使えてしまいます。
- キーをブラウザで使ってしまう。 StripeやOpenAIを呼び出すコードがページ内で動くと、キーがすべての訪問者に送られます。実際にそれを見る人はいますし、公開されたキーを探す自動スキャナーも常に動いています。
環境変数の仕組みを理解しておけば、この2つの問題に気づき、修正を依頼できるようになります。
身近なたとえ:ホテルの金庫
アプリのコードはホテルの部屋のようなものです。宿泊客(そして清掃スタッフや、カードキーを渡した人)は誰でもその部屋に入ります。パスポートを机の上に置いたままにはしないはずです。
環境変数は、部屋に備え付けの金庫にあたります。部屋には金庫があり、必要なときにどう開けるかを知っていますが、パスポートが出しっぱなしになっているわけではありません。そして、テスト用の環境から実際のサイトに移るときは、部屋を模様替えするのではなく、その部屋の金庫に別のパスポートを入れ替えるだけです。
仕組み
コードは値そのものではなく、名前を参照します。サーバー上のJavaScriptではprocess.env.STRIPE_SECRET_KEYのように書きます。アプリが起動すると、実行基盤がその名前に対応する値を埋め込みます。実行基盤の設定で値を変更して再起動または再デプロイすれば、コードを変えなくても新しい値が使われます。
値がどこから来るかは、アプリがどこで動くかによって異なります。
| 実行される場所 | 値の保存場所 |
|---|---|
| 開発者のノートPC | 通常は.envというローカルファイル(gitにコミットしてはいけません) |
| AIビルダーのプレビュー | プロジェクトのシークレットまたは設定パネル |
| ホスティングプラットフォーム | そのプラットフォームの環境変数の設定 |
| GitHub Actionsなどの自動化 | そのサービスが暗号化して保存するシークレットストア |
公開される設定とシークレット
すべての環境変数がシークレットというわけではありません。次の2つに分けて考えると分かりやすくなります。
| 種類 | 例 | ブラウザから見えてよいか |
|---|---|---|
| 公開される設定 | サイト名、公開用の分析ID、Stripeの公開可能なキー、機能のオン・オフ | 見えても問題ない |
| シークレット | Stripeのシークレットキー、OpenAIやAnthropicのAPIキー、データベースの接続文字列、メール送信サービスのキー、Webhookの署名用シークレット | 見えてはいけない |
Webフレームワークはこの区別を明示しています。Viteでは、名前がVITE_で始まる変数だけがブラウザ用のコードに含まれます。Next.jsでは、接頭辞はNEXT_PUBLIC_です。これは安全のための仕組みで、こうした接頭辞が付いた値はすべての訪問者がダウンロードするファイルに入るため、シークレットには決して付けてはいけません。
具体例:AIで要約するボタン
「このメモを要約する」ボタンを作り、AIモデルを呼び出したいとします。
安全でない方法: ボタンのコードがブラウザ上で動き、APIキーを直接書き込んだ状態でAIプロバイダーを呼び出します。プレビューでは動きますが、誰でもブラウザの開発者ツールを開けばキーをコピーでき、あなたのアカウントで料金を使われてしまいます。
安全な方法:
- AIプロバイダーでキーを作成し、プロジェクト設定に
OPENAI_API_KEY(または同様の名前)のシークレットとして保存します。 - バックエンドに
POST /api/summariseというルートを用意します。このルートはprocess.env.OPENAI_API_KEYを読み取り、ユーザーがログインしているか確認してから、プロバイダーを呼び出します。 - ボタンはプロバイダーではなく自分のルートを呼び出します。ブラウザはキーを一切見ません。
- 同じシークレットを公開済みアプリの設定にも追加し、再デプロイすれば、本番サイトでも使えるようになります。
この「ブラウザがご自身のサーバーを呼び出し、サーバーがキーを保持してサービスを呼び出す」というパターンは、決済、メール、地図など、有料のすべてのAPIに当てはまります。AIの場合については、LLM APIの使い方ガイドでより詳しく扱っています。
主な用語
.envファイル: ローカル開発で使う、NAME=valueという行からなるテキストファイルです。誤ってコミットされないよう.gitignoreに追加してください。.env.example: 名前だけを記載し、実際の値は入れていないファイルです。他の人が設定すべき変数を知れるよう、コミットしておきます。- ローテーション(入れ替え): シークレットを新しいものに置き換え、古いものを無効化することです。
- スコープ・権限: 多くのプロバイダーでは、特定の操作だけができるキーを作成できます。メール送信だけができるキーは、すべての操作ができるキーより危険性が低くなります。
- テスト用キーと本番用キー: Stripeのようなプロバイダーは、テスト用と実際の決済用で別々のキーを提供します。公開するまではテスト用キーを使ってください。
- 署名用シークレット: Webhookなどのメッセージが、本当に送信者から届いたものかを確認するために使うシークレットです。
よくある間違いと誤解
- 「リポジトリが非公開だから、キーを入れても問題ない」。 非公開のリポジトリも、共有・フォーク・エクスポート・ノートPCへのクローンが行われます。キーを入れてよい場所ではありません。プロジェクトをGitHubに接続する場合は、
.envファイルが含まれていないか確認してください。 - 「削除したのだから、もう残っていない」。 Gitは履歴を保持し、チャットのログにもメッセージが残ります。一度でも漏えいした可能性があるキーは、入れ替えてください。
- シークレットに公開用の接頭辞を付けてしまう。
VITE_OPENAI_KEYと名付けると、キーがブラウザ用のバンドルに入ってしまいます。 - 再デプロイを忘れる。 設定で変数を変更しても、通常はアプリを再起動するか、再度公開しなければ反映されません。
- すべてに同じキーを使う。 テスト用と本番用、アプリごとに別々のキーを使えば、他に影響を与えずに一つのキーだけを無効化できます。
- 利用上限を設定していない。 有料のAPIでは、キーが漏えいしたときに備えて、プロバイダーの管理画面で予算や上限を設定してください。
AIビルダーに依頼すること
- 「
STRIPE_SECRET_KEYという環境変数からStripeのシークレットキーを読み取ってください。サーバー側でのみ使用してください。」 - 「クライアント側のコードでシークレットを使わず、
VITE_/NEXT_PUBLIC_の接頭辞も付けないようにしてください。」 - 「アプリに必要なすべての変数を、値を含めずに列挙した
.env.exampleを作成し、.envがgitの対象外になっていることを確認してください。」 - 「ビルドされたフロントエンドのファイルに、APIキーのように見える文字列がないか確認してください。」
公開前に行うべきチェックの一環として、シークレットについても扱っているのが、AIで作ったアプリのセキュリティチェックリストです。
Mythexでのシークレット
Mythexでは、シークレットはプロジェクトの環境変数として、プレビューのサンドボックスと公開済みアプリの両方に注入されます。プロジェクト設定 → Secretsから追加するか、チャットで/secretsと入力して追加できます。エージェントがキーを必要とすると、チャットにシークレットのカードが表示され、値はチャットの履歴ではなく入力フォームに入力されます。公開済みアプリでシークレットを変更した場合は、デプロイに反映されるよう再度公開してください。プロジェクトのエクスポートにはシークレットが含まれず、インポートした.envファイルは取り除かれるため、設定画面で再度追加する必要があります。詳しくは、ドキュメントの環境変数とシークレットとチャットでのシークレットをご覧ください。
よくある質問
環境変数とは何ですか?
環境変数とは、STRIPE_SECRET_KEYやDATABASE_URLのような名前付きの設定のことです。プログラムの実行時に渡され、コードの中に直接書き込まれることはありません。そのため同じコードでも、開発環境と本番環境で別の値を使えます。
環境変数とシークレットの違いは何ですか?
シークレットとは、値を非公開にしておく必要がある環境変数のことです。APIキー、データベースのパスワード、Webhookの署名用シークレットなどが該当します。サイト名や機能のオン・オフの設定のような他の環境変数は公開しても問題ありません。
APIキーをフロントエンドに書いても安全ですか?
いいえ、安全ではありません。フロントエンドのコードはすべての訪問者のブラウザにダウンロードされ、誰でも読めてしまいます。シークレットキーはサーバー側でのみ使い、ブラウザはご自身のサーバーを呼び出し、そのサーバーが提供会社のAPIを呼び出す構成にしてください。
APIキーが漏えいしたらどうすればよいですか?
すぐに提供会社の管理画面でキーを無効化(失効)するか、新しいキーに入れ替えてください。その後、アプリがシークレットを保存している場所で新しいキーに更新し、再デプロイします。コードやチャット履歴から削除するだけでは不十分です。コピーがすでに存在している可能性があるからです。