ウェブシステムの設計やセキュリティの議論で必ず登場する「認証(Authentication)」と「認可(Authorization)」。 名前が似ているため混同されがちですが、これらは明確に役割が異なります。
エンジニアとしてこれらを混同して設計してしまうと、重大なセキュリティリスクにつながることもあります。それぞれの違いと関係性を整理しました。
簡潔に言うと
一言で表現するなら、以下のようになります。
- 認証(Authentication):そのユーザーが「誰か」を確認する
- 認可(Authorization):そのユーザーが「何をしてよいか」を決める
1. 認証(Authentication)
認証は、いわば「身分証明書」の提示です。システムが「アクセスしてきたのは、自称している通りの人物か?」を確認するプロセスです。
- 目的:身元の特定
- 具体例:
- メールアドレスとパスワードによるログイン
- Google や GitHub アカウントを使った OAuth ログイン
- 指紋や顔認証による生体認証
- 結果:「このリクエストを送っているのは、ユーザー A さんである」と確定すること
2. 認可(Authorization)
認可は、「権限」の付与と判定です。特定のユーザーが、あるリソースに対してどのような操作(閲覧・編集・削除など)を許可されているかを決定します。
- 目的:アクセス制御
- 具体例:
- 「管理者だけがユーザーの削除ボタンを押せる」
- 「ログイン済みでも、他人のプライベートな日記は見られない」
- 「有料プランのユーザーだけが、高度な分析機能を使える」
- 結果:「ユーザー A さんは、このデータを削除しても良い(またはダメ)」と判定すること
認証と認可の関係性
一般的なアプリケーションでは、以下の順序で処理が行われます。
- 認証:ユーザーを特定する(「あなたは A さんですね」)
- 認可:特定されたユーザーの権限をチェックする(「A さんは管理者ではないので、削除は禁止です」)
重要なのは、**「認証が成功したからといって、認可が不要なわけではない」**という点です。 「ログインできているから安全」と考えて認可のチェックを怠ると、一般ユーザーが管理者の API を叩けてしまうといった「権限昇格」の脆弱性が生まれてしまいます。
まとめ
- 認証は、ドアを開けるための「本人確認」。
- 認可は、その部屋の中で「何に触っていいか」の許可。
この 2 つを明確に区別して設計することが、安全なアプリケーション開発の第一歩です。