一人前エンジニア道場

Webセキュリティの基礎 / 約20分

認証(Authentication)と認可(Authorization)を区別する

なぜこれを学ぶか

セキュリティ事故の多くは「ログインはできているのに権限チェックが抜けている」ケースです。この2つを明確に区別できるかが出発点になります。

認証(Authentication) は「あなたは誰か」を確認する処理です。ログインフォームでメールアドレスとパスワードを照合するのが典型例です。

認可(Authorization) は「あなたはこれをしてよいか」を判定する処理です。ログイン済みであることと、特定の操作が許可されていることは別問題です。

セッション管理 では、ログイン状態をCookieで維持するのが一般的です。CookieにはブラウザのJSからアクセスできないようにするhttpOnly属性、HTTPS通信でのみ送信するsecure属性を必ず付けます。

JWT(JSON Web Token) はサーバー側にセッション状態を持たない認証方式です。便利ですが、発行したトークンを個別に無効化しにくい(失効の難しさ)という弱点があります。

典型的な事故パターンは「認証だけ確認して認可を忘れる」ことです。ログイン済みかどうかは見ているが、「そのユーザーがこの操作をしてよいか」を見ていないコードは、他人のデータを操作できてしまいます。

重要ポイント

  • 認証=本人確認、認可=権限確認は別物
  • セッションCookieにはhttpOnly/secure属性を付ける
  • JWTは便利だが失効管理が難しい

理解度チェック

選ぶと即座に解説が表示されます。

ログイン済みユーザーがURLの投稿IDを書き換えて他人の投稿を削除できてしまった。何が抜けていたか?

ヒントを見る

「ログインしているか」の確認と「その投稿を削除してよいか」の確認は別のチェックです。今回どちらは通っていて、どちらが抜けていたでしょうか。

スキルセルフチェック

このレッスンの内容をどの程度理解できましたか?