← inaro.devAI駆動開発 学習ツール
中級

環境変数とNEXT_PUBLIC

なぜ学ぶか: 「あるキーはブラウザに見えてよく、あるキーは絶対に見えてはいけない」— Next.jsはこの区別をNEXT_PUBLIC_という名前の頭で行います。取り違えると即、秘密の漏えい事故。数少ない「事故直結ルール」なので、例で確実に覚えてください。

まずはこの例を見てみましょう

# .env.local(環境変数を書くファイル。Git には入れない)

API_SECRET=sk-xxxx             ← 無印 = サーバー専用(ブラウザから見えない)

NEXT_PUBLIC_APP_URL=https://…  ← NEXT_PUBLIC_ = ブラウザに埋め込まれる
                                  (=世界中の誰でも見られる!)

NEXT_PUBLIC_を付ける=「全世界に公開してよい」という宣言。秘密のキーには絶対に付けません。

環境変数=コードの外に置く設定値

APIキーなど「コードに直書きしてはいけない値」を.env.localに書き、process.env.名前で読みます。

無印=サーバー専用

例のAPI_SECRETは、サーバー側でだけ読めます。ブラウザ向けコードからは読めません(安全)。

NEXT_PUBLIC_=ブラウザに公開

この頭が付いた変数だけがブラウザに埋め込まれます。つまり「見られて困らない値」専用です。

判断基準は「見られて困るか」

困る(秘密キー)→ 無印。困らない(公開URL)→ NEXT_PUBLIC_可。秘密キーにNEXT_PUBLIC_が付いていたら即・重大事故です。

コード例

// ===== .env.local(Git には入れない)=====
// API_SECRET=sk-very-secret-key
// NEXT_PUBLIC_APP_URL=https://learn.example.com

// ===== サーバー側(Route Handler など)=====
export async function GET() {
  const secret = process.env.API_SECRET; // ✓ サーバーでだけ読める
  console.log("キー設定済み:", Boolean(secret));
  return Response.json({ ok: true });
}

// ===== ブラウザ側('use client')=====
// const url = process.env.NEXT_PUBLIC_APP_URL; // ✓ 公開前提の値のみ OK
// const leak = process.env.API_SECRET;         // ✗ 読めない(かつ設計ミス)

迷ったら無印(サーバー専用)が安全側です。公開は後からでもできますが、漏れたキーは取り消せません。

ステップ 1 / 2

※ カリキュラムの内容はAIが生成しており、誤りが含まれる場合があります。正確な情報は公式ドキュメント等でご確認ください。