3秒でわかる
ログイン済みの相手に、その操作を許すかどうかを判定する仕組み。誰であるかを確かめる認証の次に来る、何をしてよいかを決める工程です。
もう少し詳しく
どういうものか
認可は、すでに身元の分かっている利用者に対して、要求された操作を許可するか拒否するかを決める処理です。英語では authorization、権限チェックとも呼ばれます。
判定の材料になるのは、利用者の役割(管理者、一般、閲覧のみ)、対象のリソース、操作の種類の 3 つです。「一般ユーザーが、他人の注文を、削除する」は拒否、「自分の注文を、参照する」は許可、といった形で決まります。
なぜ必要か
認証だけ通してしまうと、ログインさえできれば何でもできる状態になります。実際の情報漏えいの多くは、外部からの侵入ではなく、正規の利用者が本来見られないデータに到達できてしまう設計の穴から起きます。
URL の ID を書き換えたら他人の請求書が開けた、という類の事故は、認証は成功しているのに認可が抜けている典型です。
具体例
// 認証 — <a href="/glossary/token" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">トークン</a>から「誰か」を確定する
function authenticate(req, res, next) {
const token = req.headers.authorization?.replace("Bearer ", "");
const payload = verifyJwt(token);
if (!payload) return res.status(401).json({ error: "unauthenticated" });
req.user = payload;
next();
}
// 認可 — その人がこの注文を触ってよいか判定する
async function canEditOrder(req, res, next) {
const order = await db.order.findUnique({ where: { id: <a href="/glossary/req-params" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">req.params</a>.id } });
if (!order) return res.status(404).json({ error: "not found" });
const isOwner = order.userId === req.user.id;
const isAdmin = req.user.role === "admin";
if (!isOwner && !isAdmin) {
return res.status(403).json({ error: "forbidden" });
}
req.order = order;
next();
}
app.patch("/orders/:id", authenticate, canEditOrder, updateOrder);401 は「あなたが誰か分からない」、403 は「分かったうえで許可しない」を意味します。
つまずきやすいところ
似た用語との違い
| 用語 | 問い |
|---|---|
| 認証 (authentication) | あなたは誰か |
| 認可 (authorization) | あなたはそれをしてよいか |
| 監査ログ | 実際に誰が何をしたか |
覚え方
空港でたとえると、パスポートの照合が認証、搭乗券に書かれた便と座席の確認が認可です。本人だと分かっても、別の便には乗れません。