IT-Q

認可チェックを proxy(旧 middleware)に寄せて、Server Function 側では省略できませんか。

できません。proxy は未ログインを弾く粗い網には向きますが、この行を触ってよいかまでは判断できません。Server Function は独立した入口なので、関数の中で認可を行います。

面接官が見ているのは「入口で守れば中は要らない」という誤った設計を検出する。3手目の本命。

これは「Server Function のセキュリティで、気をつけることは何ですか。」への追撃質問です。

よくある答えと、面談でどう見られるか

  • 省略できない。入口での防御と、操作対象に対する認可は別のもの
    その通りです。認可はデータに一番近いところで確認します。
  • 省略できる。全リクエストが必ず通るので漏れがない
    「必ず通る」ことと「正しく判定できる」ことは違います。ログイン済みのユーザーが他人の id を指定する経路は、入口では止められません。
  • 省略できないが、共通のヘルパー関数にまとめれば書き忘れは防げる
    まとめること自体は良い実践です。ただし呼び出しを書き忘れれば同じなので、「まとめたから安全」にはなりません。レビューや型で呼び出しを強制する工夫まで言えると強いです。
  • 省略できる。認可は DB の制約で担保すべきもの
    DB の制約は整合性を守るもので、「誰が操作してよいか」は表現できません。所有者チェックはアプリ側の責任です。

面接官は何を見ているか

  • 省略できないと答えた
  • 入口での防御と、実行箇所での認可は別物だと説明できた
  • データに近いところで確認する、という原則を言えた

模範解答

省略できません。ここは面談で踏み絵になりやすいところです。

proxy(Next.js 16 で middleware から改名されたもの)は、リクエストがルートに入る前に走る層です。未ログインを弾いてログイン画面へ飛ばす、といった粗い制御には向いています。

ですが、それは「そのユーザーがこの操作をしてよいか」の判定ではありません。ログイン済みユーザーが、他人の id を指定して delete を呼ぶことは止められません。公式が「どの Server Function でも」と書いているのは、入口の防御があっても各関数で確認しろ、という意味です。

原則としては、認可はデータに一番近いところで確認します。Server Function、Route Handler、データアクセス層のどこかで、「操作対象がこのユーザーのものか」を必ず引き当てます。

公式のセキュリティ指針でも、proxy と route はとくに権限が大きいので追加の監査対象として扱うよう書かれています。「入口があるから中は素通しでよい」ではなく、「入口が強力だからこそ、そこだけに頼らない」という読み方が正しいです。