Next.js/ルーティング/Lesson 11
Middleware — すべてのリクエストを横断して認証・リダイレクト・ヘッダー操作
30分·theory
このチャプター
3/3
TypeScript
Middleware — すべてのリクエストを横断して認証・リダイレクト・ヘッダー操作
💡 なぜ学ぶ必要があるのか — ページコンポーネントごとに if(!session) を書かないために
🎯
保護されたページごとに「セッションがなければログインへ転送」するコードを書く必要がなく、ミドルウェア1か所にまとめるだけで完結します。
💼
Edge Runtime で実行されるため、ページコンポーネントに到達する前にリクエストをブロックします。より速いレスポンスを実現します。
⚡
matcher config を使って、どのルートに適用するかを正確に制御できます。
🔗
A/Bテスト、国別リダイレクト、ボットブロック、レスポンスヘッダーの追加など、ルーティング直前に必要なすべてのロジックを処理できます。
📈
codemaster40のNext.jsアプリも [`src/middleware.ts`](src/middleware.ts) を使って `/dashboard`・`/admin` などの保護されたルートを処理しています。
🏢 실무에서는
このプロジェクトのmiddleware.tsはまさにその役割を担っています — `/dashboard`・`/bookmark`・`/memo-notes` などのパーソナライズされたルートへのアクセス時にセッションを検証し、セッションがなければ `/login?next=...` へリダイレクトします。ページコンポーネントはセッションが存在することを前提として実装できます。
middleware.ts · matcher · NextResponse
1. 場所とシグネチャ
- ▸Edge Runtime で実行(一部の Node API は制限あり)。
- ▸matcher に記述したパスにのみ適用。
2. matcher パターン
3. 主要な動作 4 種
4. 実践 — 認証 Middleware
5. レスポンスの Cookie・ヘッダー操作
6. Edge Runtime の制約
- ▸
fs・net・dnsなどの Node 専用モジュールは使用不可。 - ▸レスポンスタイムは 25ms 以内を推奨(Vercel 基準)。
- ▸重い DB 呼び出し禁止 — 軽量な検証のみ。
💡 💡 Middleware 実践 Tips 5 選
1. matcher に否定先読みパターン — 「除外」の表現
頻繁な静的アセットリクエストを Middleware が処理しないようにする。
2. Edge Runtime の制約 — 重い DB 呼び出し禁止
Cookie 検証・シンプルな JWT デコードなど軽量な処理のみ。実際の DB クエリはページコンポーネントで行う。
3. NextResponse.next() でヘッダーをまとめて設定
4. レスポンス Cookie の設定
httpOnly + secure がデフォルト。SameSite=Lax も推奨。
5. デバッグ — console.log はサーバーログへ
Middleware 内の console.log は Vultr・Vercel のサーバーログに出力される。ブラウザのコンソールには表示されない。
⚡ 自分で試してみよう — Middleware 動作シミュレーション
各リクエストパスが Middleware でどのように処理されるかをシミュレーションする。
✏️ JS 코드
📟 コンソール出力
▶ 実行ボタンを押してください
⚠️ ブラウザのサンドボックスで実行 — console.log()のみ対応、alert/fetchは不可
確認クイズ
middleware.ts の matcher 設定で実現できることはどれか?
先に読むとよい概念: Layout vs Template — 状態維持 vs 毎回マウント