React Academy · レッスン

シークレット管理と環境変数

サーバー側とクライアント側の環境変数を区別し、バンドルへのシークレット漏洩を防ぎ、ランタイム注入を使用します。

レッスン 4/413 ステップ

「シークレット管理と環境変数」はCoddyKit上の無料React Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。

環境変数の2つの分類

Reactアプリケーションの環境変数は、サーバーサイド(ブラウザーには一切送信されません)とクライアントサイド(JavaScriptバンドルに埋め込まれます)の2種類に分類されます。変数がどちらに属するかを理解することが、シークレット管理の第一歩です。クライアントサイドの変数は、バンドルをデプロイした時点で実質的に公開情報になるためです。

Viteのプレフィックス規約

Viteプロジェクトでは、VITE_で始まる変数だけがクライアントバンドルに含まれます。VITE_PUBLIC_API_URL=https://api.example.comは、ブラウザーコードからimport.meta.env.VITE_PUBLIC_API_URLを介して利用できます。それ以外の変数はビルド時にバンドルから除外され、サーバー専用のままになります。

Next.jsのプレフィックス規約

Next.jsでは、NEXT_PUBLIC_プレフィックスを付けると、変数がブラウザーのJavaScriptに公開されます。NEXT_PUBLIC_ANALYTICS_ID=UA-123はクライアントバンドルに埋め込まれます。プレフィックスのない変数(DATABASE_URLなど)は、サーバーサイドのコード(Server Components、API routes、Server Actions)からのみアクセスでき、ブラウザーに送信されることはありません。

意図しない公開のリスク

プレフィックスのない変数でも、誤ってシリアライズされるとアクセス可能になります。たとえば、Server Componentが完全な設定オブジェクトをClient Componentにpropsとして渡し、その設定にDATABASE_URLが含まれている場合、そのシークレットはブラウザーに送信されるHTMLに現れます。propsの受け渡しとシリアライズを注意深く監査することで、これを防げます。

クライアントコードに決して含めてはいけないもの

次の情報は、クライアントバンドルに決して含めてはいけません。データベース接続文字列とパスワード、サードパーティAPIのシークレットキー(Stripe secret key、OpenAI API key)、RSA/ECの秘密鍵、JWT署名シークレット、内部サービスの認証トークンです。API呼び出しにこれらのいずれかが必要な場合は、その呼び出しをサーバーエンドポイント経由でプロキシしてください。

Backend for Frontendパターン

Backend for Frontend(BFF)パターンでは、Reactアプリケーションと機密性の高い外部サービスの間に薄いサーバーレイヤーを配置します。クライアントは/api/stripe/chargeを呼び出し、BFFサーバーがStripe secret keyを付けてStripe APIを呼び出し、BFFが必要なレスポンスデータだけを返します。シークレットは常にサーバー上に保持されます。

dotenv-vaultとマネージドシークレットストレージ

dotenv-vaultは.envファイルを暗号化し、平文のシークレットをバージョン管理に登録することなく、環境間で安全に共有およびデプロイできるようにします。本番環境の代替手段には、HashiCorp Vault(エンタープライズ)、AWS Parameter Store(SSM)、GCP Secret Managerがあります。いずれも、ビルド時ではなく実行時にAPI経由でシークレットを取得できます。

CI/CDパイプラインのシークレット

CI/CDプラットフォーム(GitHub Actions、GitLab CI)は、ビルド中に環境変数としてアクセスできる暗号化済みのシークレットストレージを提供します。シークレットはGitHub Secretsに保存し、ワークフローでは${{ secrets.STRIPE_SECRET_KEY }}として参照してください。シークレットはログでマスクされ、ビルド成果物に含まれることはありません。

環境別の設定ファイル

Next.jsとViteは複数の.envファイルに対応しています。.env(すべての環境)、.env.local(ローカルでの上書き、gitignore対象)、.env.development、.env.productionです。ローカルファイルの値は共有ファイルの値より優先されるため、他の環境に影響を与えずに開発者ごとの設定を行えます。

シークレットがないかバンドルを監査する

ビルド後にJavaScriptバンドルを監査し、シークレットが誤って公開されていないか確認してください。grep -r "password|secret|api_key" dist/を実行するか、ビルド済みファイルに対してstrings分析などの専用ツールを使用します。誤って含まれたシークレットの中には、UUID、base64文字列、sk_live_のようなキーのプレフィックスなど、形式から明確に識別できるものがあります。

最小限の公開原則

各環境と各サービスには、必要なシークレットだけへのアクセスを許可してください。Reactクライアントにはシークレットは一切必要なく、公開識別子だけを受け取るべきです。BFFサーバーに必要なのは、呼び出すAPIに必要なシークレットだけです。開発環境では、本番環境用ではないAPIキーを使用し、権限と利用額に上限を設けてください。

NEXT_PUBLIC_プレフィックス

NEXT_PUBLIC_プレフィックスが付いたNext.jsの環境変数はどうなりますか?

レッスンのまとめ

ViteはVITE_、Next.jsはNEXT_PUBLIC_を使用して、変数をブラウザーバンドルに公開します。それ以外の変数はすべてサーバーサイド専用です。データベースのパスワード、APIのシークレットキー、JWT署名シークレットをクライアントコードに決して含めないでください。機密性の高いAPI呼び出しをプロキシするには、BFFパターンを使用します。本番環境のシークレット管理には、dotenv-vault、AWS Parameter Store、GitHub Secretsを使用してください。ビルド済みバンドルを監査し、シークレットが誤って公開されていないか確認してください。

無料で開始

AI チューターと学ぶ React — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
88
レッスン
324

よくある質問

「シークレット管理と環境変数」レッスンは無料ですか?

はい。「シークレット管理と環境変数」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。

「シークレット管理と環境変数」で何を学びますか?

サーバー側とクライアント側の環境変数を区別し、バンドルへのシークレット漏洩を防ぎ、ランタイム注入を使用します。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

React Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「シークレット管理と環境変数」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このReact Academyレッスンでコードを書いて実行できますか?

はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ReactのXSS:dangerouslySetInnerHTMLとサードパーティスクリプト
  2. ReactとAPI構成におけるCSRF対策
  3. ReactアプリのContent Security Policy
  4. シークレット管理と環境変数
← React Academyに戻る