+ 作るログイン
図を読み込んでいます…
1 / 7
図でつながる 認証と暗号の基礎 / 全9章

認証と認可 ―「誰か」と「何をしてよいか」を分ける

発行
アニメモ公式
版
第2版
改訂
コマ
全7

ログイン済みなのに編集を拒否するのはなぜ? 一つのリクエストを追い、認証・所有者確認・APIの認可を図解します。

同じログインでも、できることは違う

アニメモにログインしたアオイさんが、ある教材の編集ボタンを押しました。ログインは成功しています。それでも、その教材が別の人の作品なら編集を許してはいけません。

ここには二つの問いがあります。認証は「あなたは誰か」、認可は「その操作を許してよいか」。図の人物カードが二つの関門を進む様子を追ってみてください。

「ログイン済みだから全部OK」と考えると、他人の作品を書き換える穴が生まれます。OWASPの認可ガイドも、この区別を出発点にしています。

  • 01 / SECURITY NOTES
  • 1 / 7
  • 「誰?」と「していい?」を分ける
  • 利用者A
  • 認証
  • 認可
  • アオイさん
  • あなたは誰?
  • 編集していい?
  • Aからの要求
  • 二つとも確認する
  • ログイン成功と、操作の許可は別の問い。

認証で、リクエストの主語を確定する

まず、アオイさんがアカウントの認証手段を持つことを確認します。パスワード、パスキー、外部の認証サービスなどは、そのための手段です。

認証結果からアプリが得るのは「このリクエストは利用者Aとして扱える」という情報です。人間の実名や法的な身元まで必ず確認する、という意味ではありません。

ログイン後のリクエストでも、サーバーはセッションやトークンを検証します。フォームから送られた user_id: "A" という自己申告だけでは主語を決めません。

  • 01 / SECURITY NOTES
  • 2 / 7
  • 認証で、主語を確かめる
  • 利用者A
  • 認証 OK
  • 認可はこれから
  • 認証手段を持つ
  • セッションを検証
  • 対象と操作を確認
  • 主語 = A
  • 自己申告の user_id を、そのまま信用しない。

認可は「人・対象・操作」の組み合わせ

認証で利用者Aと分かったら、次は対象の作品と操作を照合します。「作品Xの所有者がA」かつ「編集が許される状態」なら、編集を許可できます。

主語対象操作判定の例
利用者AAの下書き編集許可
利用者ABの下書き編集拒否
購入者A購入した教材閲覧許可

同じ人でも対象や操作が変われば答えは変わります。図では、同じ人物カードを保ったまま判定先が変わります。

  • 01 / SECURITY NOTES
  • 3 / 7
  • 自分の作品なら、編集を許可
  • 利用者A
  • 作品X
  • 編集を許可
  • 認証済み
  • 所有者 = A
  • 条件が一致
  • 主語 = A
  • 認証済みのA × Aの作品X × 編集 → 許可。

URLを知っていても、権限は増えない

アオイさんが作品IDをXからYへ書き換えたとします。ログイン情報は同じでも、Yが他人の非公開作品ならアクセスを拒否します。

画面の編集ボタンを隠すだけでは防げません。ブラウザの開発者ツールや別のプログラムから、APIへ直接リクエストを送れるためです。

認可はサーバー側で毎回行うことが重要です。IDが推測しにくいUUIDでも、所有者やアクセス権の検査を省略できません。OWASP: リクエストごとの権限検証

  • 01 / SECURITY NOTES
  • 4 / 7
  • 対象が他人の作品に変わったら?
  • 利用者A
  • 作品Y
  • 編集を拒否
  • 認証済み
  • 所有者 = B
  • 編集権限がない
  • 主語 = A
  • 認証は同じでも、認可の結果は変わる。

判定をデータの読み書きに結び付ける

編集処理なら、検証済みの利用者IDを更新条件に含めます。次は仕組みを示すSQLの例です。

sql
UPDATE animemos
SET title = $1
WHERE id = $2
  AND user_id = $3
RETURNING id;

$3 は認証済みのセッションやJWTからサーバーが得た値です。クライアントが指定した所有者IDではありません。更新結果が0件なら、成功したことにしてはいけません。

閲覧も同様です。有料ページを購入者にだけ見せるなら、未購入者に返すレスポンスから本文と図のデータを除きます。

  • 01 / SECURITY NOTES
  • 5 / 7
  • サーバーで、所有者条件を照合
  • サーバーの更新条件
  • 利用者A
  • WHERE id = 対象の作品 AND user_id = 認証済みA
  • 要求を送る
  • Aは検証済みJWTから得る
  • 画面のボタンを隠すだけでは、データを守れない。

OAuth・OIDC・JWTは、同じ種類の言葉ではない

用語主に答えること
OAuthアプリに限定したアクセスを委ねる方法
OIDC認証結果をアプリへ伝える方法
JWTクレームを運ぶデータ形式

OAuthやOIDCを導入しても、自分のアプリの所有者チェックが自動的に完成するわけではありません。正当なトークンであっても、対象の教材を編集してよいかは別途判断します。

図の三枚のカードは、同じ関門へつながる別々の道具です。「認証方式の名前」としてひとまとめにせず、担当する仕事で整理しましょう。OAuthの役割・OIDCの概要

  • 01 / SECURITY NOTES
  • 6 / 7
  • 道具の役割を、混ぜない
  • OAuth
  • OIDC
  • JWT
  • アクセスを委ねる
  • 認証結果を伝える
  • 情報を運ぶ形式
  • 対象への操作はサーバーで認可
  • どの方式を使っても、アプリの認可は必要。

確認:ログイン済みのAは、Bの下書きを編集できる?

答えは、Bから編集権限を与えられるなどの許可条件がなければ、できません。認証に成功しても、認可が成功したことにはなりません。

実装を読むときは、リクエストの主語を確定する箇所と、対象への操作を判定する箇所を探してください。二つを別の問いとして説明できれば、この教材の要点をつかめています。

図の最後では人物カードは同じまま、許可と拒否に分岐しています。権限は「ログイン済み」という一個のスイッチではなく、主語・対象・操作に対する答えです。

  • 01 / SECURITY NOTES
  • 7 / 7
  • 確認:ログイン済みなら全部OK?
  • 自分の作品を編集 → 許可
  • 所有者・状態などを照合
  • 利用者A
  • 同じログイン状態
  • 他人の下書きを編集 → 拒否
  • 編集権限がなければ通さない
  • 答えは NO。主語・対象・操作を毎回確かめる。

0 件のコメント

読み込み中…

権利侵害・不適切な内容の連絡: [email protected]