ミドルウェア

リクエストとレスポンスの間に挟まる処理層で、認証 / ログ / エラーハンドリングを横断的に適用する

設計Web

ミドルウェアとは

ミドルウェアは、リクエストとレスポンスの間に挟まる処理層で、認証、ログ、エラーハンドリング、CORS などの横断的関心事を一元的に適用する。Express、Koa、Hono などの Web フレームワークに共通する基本概念である。

ミドルウェアの流れ

リクエストはハンドラに到達する前に、認証、ログ、CORS などのミドルウェアを順番に通過する。各ミドルウェアはリクエストの検査・加工を行い、next() で次のミドルウェアに処理を渡す。

戻りの挙動はフレームワークによって異なる点に注意したい。Koa は await next() で下流を呼び出し、制御が上流へ戻ってから残りの処理を実行するため、下流の結果を見てレスポンスを加工できる。一方 Express の next() は後続のミドルウェアを呼び出すだけなので、ハンドラが res.json() で応答を送り終えた後に本文を書き換えることはできない。Express で応答を加工したい場合は res.writeres.end を差し替えるか、圧縮ミドルウェアのようにその仕組みを内包したライブラリを使う。

リクエスト → [認証][ログ][CORS] → ハンドラ → [エラー処理] → レスポンス
              ↑                              ↑
          ミドルウェア                    ミドルウェア

Express の例

Express の例を示す。

import express from 'express';
const app = express();

// ログミドルウェア
app.use((req, res, next) => {
  console.log(`${req.method} ${req.path}`);
  next(); // 次のミドルウェアへ
});

// 認証ミドルウェア
app.use('/api', (req, res, next) => {
  const token = req.headers.authorization;
  if (!token) return res.status(401).json({ error: 'Unauthorized' });
  next();
});

app.get('/api/users', (req, res) => res.json({ users: [] }));

ミドルウェアのパターン

典型的なミドルウェアには、トークンの検証や権限チェックを行う認証・認可、リクエスト/レスポンスの記録を行うログ、例外をキャッチして統一レスポンスを返すエラーハンドリング、クロスオリジンヘッダーを付与する CORS、リクエストボディを検証するバリデーション、リクエスト数を制限するレート制限がある。

API Gateway のミドルウェア的機能

API Gateway のミドルウェア的機能を以下にまとめる。

機能REST APIHTTP API
認証Cognito オーソライザー、Lambda オーソライザーJWT オーソライザー (Cognito などを発行元に指定)、Lambda オーソライザー
CORSOPTIONS メソッドを自分で用意CorsConfiguration
スロットリング使用量プラン (API キー単位)、ステージとメソッド単位ステージ単位、ルート単位
リクエスト検証Request Validator非対応 (Lambda 側で実装)
WAF統合あり非対応

表は 2026 年 8 月時点。API Gateway が横断的関心事を引き受ける分だけ Lambda のコードは薄くなるが、使用量プラン、Request Validator、WAF 統合はいずれも REST API 向けの機能である。安価さで HTTP API を選んだ後にこれらを前提とした設計が崩れる、という手戻りが起きやすい。

ミドルウェアの順序

ミドルウェアの順序を図で示す。

重要: ミドルウェアの実行順序は定義順

1. CORS (最初に実行、OPTIONS を早期返却)
2. ログ (全リクエストを記録)
3. 認証 (未認証は早期返却)
4. バリデーション
5. ハンドラ
6. エラーハンドリング (最後に実行)

実務での活用方法は関連書籍にも詳しい。

この記事は役に立ちましたか?

関連用語

関連する記事