筆者は認証保護のため、Next.jsのmiddleware(Proxy)のmatcherを、保護したいパス「/dashboard」だけに絞って設定しました。ところが公開ページを閲覧している間はプロキシがそもそも実行されずトークンの更新も行われず、1時間後にセッションが切れてログアウトされてしまったといいます。
matcherはアクセスを保護する範囲を決める設定ではなく、あくまでプロキシが実行される「スコープ」を指定するものです。対象外のパスではセッション更新が効かないだけでなく、そこに置かれたServer Actionの保護も及ばなくなります。matcherの変更や、Server Functionをmatcherにマッチしないルートへ移すリファクタが、静かにProxyのカバレッジを外してしまうことがあるといいます。
厄介なのは動作確認をした時点では問題が見えないことです。matcherの値はビルド時に静的解析されるため、変更した場合はdevサーバーの再起動が必要になる点も含め、筆者は手順書に「matcherは保護対象ではない」と自ら書いていたにもかかわらず、実装時に同じ誤りを犯したと振り返っています。
出典が伝えている要点
- matcherはアクセスを保護する範囲ではなく、プロキシ(middleware)が実行される範囲を指定する設定である
- 筆者はmatcherを「保護したいパス」である/dashboardのみに絞って設定した
- matcherの対象外のページを閲覧している間は、プロキシが実行されずトークンの更新が行われない
- 公開ページを閲覧し続けた結果、1時間後にセッションが期限切れとなりログアウトされた
- matcherの値はビルド時に静的解析されるため、matcherを変更した場合はdevサーバーの再起動が必要である
- matcherで除外されたパスにあるServer Actionは、プロキシによる保護を受けない
- 筆者は手順書に「matcherは保護対象ではない」と記載していたにもかかわらず、自身の実装時に同じ誤りを犯した
- 動作確認をした時点では保護が機能しているように見えたが、1時間後に初めて問題が顕在化した
原文より
matcher change or a refactor that moves a Server Function to a different route can silently remove Proxy coverage
出典: zenn.dev