ガイド

環境変数とシークレットとは?わかりやすい入門ガイド

環境変数とは、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プロバイダーを呼び出します。プレビューでは動きますが、誰でもブラウザの開発者ツールを開けばキーをコピーでき、あなたのアカウントで料金を使われてしまいます。

安全な方法:

  1. AIプロバイダーでキーを作成し、プロジェクト設定にOPENAI_API_KEY(または同様の名前)のシークレットとして保存します。
  2. バックエンドにPOST /api/summariseというルートを用意します。このルートはprocess.env.OPENAI_API_KEYを読み取り、ユーザーがログインしているか確認してから、プロバイダーを呼び出します。
  3. ボタンはプロバイダーではなく自分のルートを呼び出します。ブラウザはキーを一切見ません。
  4. 同じシークレットを公開済みアプリの設定にも追加し、再デプロイすれば、本番サイトでも使えるようになります。

この「ブラウザがご自身のサーバーを呼び出し、サーバーがキーを保持してサービスを呼び出す」というパターンは、決済、メール、地図など、有料のすべての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キーが漏えいしたらどうすればよいですか?

すぐに提供会社の管理画面でキーを無効化(失効)するか、新しいキーに入れ替えてください。その後、アプリがシークレットを保存している場所で新しいキーに更新し、再デプロイします。コードやチャット履歴から削除するだけでは不十分です。コピーがすでに存在している可能性があるからです。

Mythex · Pricing · AIでなんでも作ろう · ウェブサイト・アプリのテンプレート · Mythexを比較 · AIアプリ開発用語集 · AIアプリ開発の無料ツール · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)