🔐

認証と認可の違いを分かりやすくまとめてみる

2021/10/24に公開

サインアップやログイン周りの実装を行う際には、認証・認可の知識が必要になります。
今回は認証と認可の違いについてまとめてみました。

要点

先に結論を述べると、認証と認可は何を確認しているかという点で違いがあります。

認証: 「あなたは誰ですか?」 を確認
認可: 「あなたには、リソースにアクセスする権限がありますか?」 を確認

※リソース:情報自体や、情報を閲覧・編集する権利などのこと

もう少し詳しく

認証とは

認証は 「あなたは誰ですか?」 を確認することです。
例えば、次に挙げたものを確認することが認証です。

  • What you are:相手自身の特徴を確認
    例)指紋認証や顔認証
  • What you have:相手が持っているものを確認
    例)免許証やパスポート
  • What you know:相手が知っていることを確認
    例)email と password

認可とは

一方、認可は 「あなたには、リソースにアクセスする権限がありますか?」 を確認することです。
例えば次のような事例が認可です。

  • 家の鍵を持っているから、家に入ることができる
  • バスの乗車券を持っているから、バスに乗ることができる

認証と認可の違い

認可で例示した「家の鍵を持っているから、家に入ることができる」ケースを考えると、認証と認可が異なる概念であることが分かります。

  • その人は、家の鍵を持っていたので家に入ることができた(認可された)
  • しかし、その鍵は奪ったものかもしれないし、一時的に借りたものかもしれない。
    つまり、鍵を持っていたからといって、その家の住人であるとは限らない(認証はされていない)

一方、次のようなケースでは認証と認可を同時に行っています。

  • パスポートは本人確認に用いられつつ(認証)、これにより渡航する権利を得られる(認可)
  • 免許証は本人確認に用いられつつ(認証)、これにより自動車を運転する権利を得られる(認可)

日常生活に限らず、実際のサービスにおいても多くの場合、認証した上で特定の権限に対する認可を行うことになります。

例えば Facebook ログインができるサービスを思い出してみてください。そのサービスから Facebook にリダイレクトされ、そこで email / password を入力 (認証) 、その後「◯◯(サービス名) にプロフィールへのアクセスを許可しますか?」のような文言が表示され「許可」ボタンを押す (認可) 。このような流れで利用しているはずです。

認証と認可は異なるものですが、密接に関わり合っているのです。

まとめ

今回は認証と認可の違いについてまとめてみました。
認証・認可周りを開発していく上で、両者の違いを理解しておくことはとても大切だと思います。
この記事が理解の助けになれば幸いです。

補足

英語と省略表記について

認証と認可、同じような日本語ですが、実は英語も似ています。

  • 認証:Authentication、AuthC や AuthN と略されることも
  • 認可:Authorization、AuthZ と略されることも

HTTP Status Codes の 401, 403について

HTTP Status Codes の 401 と 403 は、それぞれ認証・認可の失敗を意味しています。

  • 401 Unauthorized
    • (認可のような名前をしており紛らわしいですが、、) 認証の失敗を意味しています
    • つまり「このリクエストを通すためには認証を完了させてください」というメッセージ
  • 403 Forbidden
    • 認可の失敗を意味しています
    • つまり「認証はしました。だけどあなたにはリクエストを通すための権限がありません」というメッセージ

内容に間違いがあれば、コメントでご指摘いただけると嬉しいです。
いいね、フォローもぜひお願いします 🐳🐣🐙

https://twitter.com/t2ape

Discussion