ウェブシステムの設計やセキュリティの議論で必ず登場する「認証(Authentication)」と「認可(Authorization)」。 名前が似ているため混同されがちですが、これらは明確に役割が異なります。

エンジニアとしてこれらを混同して設計してしまうと、重大なセキュリティリスクにつながることもあります。それぞれの違いと関係性を整理しました。

簡潔に言うと

一言で表現するなら、以下のようになります。

  • 認証(Authentication):そのユーザーが「誰か」を確認する
  • 認可(Authorization):そのユーザーが「何をしてよいか」を決める

1. 認証(Authentication)

認証は、いわば「身分証明書」の提示です。システムが「アクセスしてきたのは、自称している通りの人物か?」を確認するプロセスです。

  • 目的:身元の特定
  • 具体例
    • メールアドレスとパスワードによるログイン
    • Google や GitHub アカウントを使った OAuth ログイン
    • 指紋や顔認証による生体認証
  • 結果:「このリクエストを送っているのは、ユーザー A さんである」と確定すること

2. 認可(Authorization)

認可は、「権限」の付与と判定です。特定のユーザーが、あるリソースに対してどのような操作(閲覧・編集・削除など)を許可されているかを決定します。

  • 目的:アクセス制御
  • 具体例
    • 「管理者だけがユーザーの削除ボタンを押せる」
    • 「ログイン済みでも、他人のプライベートな日記は見られない」
    • 「有料プランのユーザーだけが、高度な分析機能を使える」
  • 結果:「ユーザー A さんは、このデータを削除しても良い(またはダメ)」と判定すること

認証と認可の関係性

一般的なアプリケーションでは、以下の順序で処理が行われます。

  1. 認証:ユーザーを特定する(「あなたは A さんですね」)
  2. 認可:特定されたユーザーの権限をチェックする(「A さんは管理者ではないので、削除は禁止です」)

重要なのは、**「認証が成功したからといって、認可が不要なわけではない」**という点です。 「ログインできているから安全」と考えて認可のチェックを怠ると、一般ユーザーが管理者の API を叩けてしまうといった「権限昇格」の脆弱性が生まれてしまいます。

まとめ

  • 認証は、ドアを開けるための「本人確認」。
  • 認可は、その部屋の中で「何に触っていいか」の許可。

この 2 つを明確に区別して設計することが、安全なアプリケーション開発の第一歩です。