認証と認可の違い
はじめに
こんにちは。マイペースを極めつつある診断員の百田です。
最近、認証と認可の違いについて考えさせられることがありましたので、今回はそれについてのんべんぐらりと書きつづります。
なお、ここでいう「認証」と「認可」はWebアプリケーションにおけるものとします。また、毎度Webアプリケーションと表現するのも冗長なので、以降では「Webアプリ」とします。
ターゲット
以降の内容を読む意味がありそうな人はどんな人か考えてみたので、列挙します。
- 認証と認可という言葉の意味を知らない
- 認証と認可の違いがよくわかっていない気がする
- 認証と認可を分けて考えるべき理由がわからない
- 暇人
コンセプト
わりと長旅になりましたので、何に重きを置いたのかを明確にしておきます。
今回は、認証と認可の違いを なぜ分けて考える必要があるのか という点から攻めています。
これには理由があります。自分は正直なところ認証と認可の違いを知った時点で、その二つをなぜ分けて考える必要があるのかがわかりませんでした。ですが、紆余曲折を経てそれがわかったときには、認証と認可の違いを理解できたという実感を得ることができました。
そのため、自分は
認証と認可の違いを理解するための根幹は、なぜ分けて考える必要があるのかを理解すること
にあると考え、今回はこれを主軸としています。
構成
今回の構成を簡単に紹介しておきます。以下の項目にてまとめています。
- 認証をざっくり
- 認可をざっくり
- なぜ分けて考える必要があるのか
認証と認可がどんなものであるかを知った上で、なぜ分けて考える必要があるのかを突き詰めよう。というものです。そのため、認証と認可の違いを既に知っている方であれば、なぜ分けて考える必要があるのか だけを読んでいただいても良いかなと思います。
諸注意
今回、認証と認可の違いをまとめていますが、ここに書いたことがすべてではありません。とくに、なぜ分けて考える必要があるのかでは、ある「ひとつの例」から、認証と認可を分けて考えたい理由を「ひとつ見つける」という内容になっています。そのため、「そういう考え方もありますよね」くらいの感覚で読んでいただけると幸いです。
認証をざっくり
相手が誰かを確認することです。
現実世界では「身分証明書」によって人物を確認することが一例として挙げられます。
Webアプリでは「ログインID」と「パスワード」で利用者が誰かを確認することがこれにあたります。
認可をざっくり
権限(権利)を与えることです。
現実世界では、電車の切符によって「電車に乗る権限」を、利用者へ与えることが一例として挙げられます。
Webアプリでは利用者に有料記事の閲覧権限を与えることが一例として挙げられます。「お金を払った人ならこの記事を読めます!」という類のものですね。この場合は利用者をログインによって認証し、その利用者が料金を支払っていれば有料記事を読めるという流れになることが多いと思われます。
つまり、この例の場合は
認証を前提とした認可が行われている
ということになります。
なぜ分けて考える必要があるのか
認可をざっくり説明したところにもあるように、Webアプリにおいては、認証を前提とした認可が行われることが多いように思われます。これでは、なぜ認証と認可を分けて考える必要があるのかというところには納得が行きづらいです。
そのため、まず
認証と認可を分けない場合どうなるのか
を考え、そのうえで
なぜ認証と認可を分けて考えたいのか
を突き詰めてみます。
以下の項目にてまとめています。
- 認証によって認可が行われるWebアプリのイメージ
- Webアプリへの機能的な需要
- 需要に応えることによって発生する問題
- 問題の解決方法
認証と認可を分けないで考える場合、認証以外では認可が行われないことになります。そのため、まずは 認証によって認可が行われるWebアプリ をイメージします。次に、Webアプリへの機能的な需要を例示します。そのうえで、認証と認可を分けない場合のWebアプリでその需要を満たすときに発生する問題について考えます。そして、最後にどうすれば問題を解決できるかを考えるという流れです。
認証によって認可が行われるWebアプリのイメージ
よくあるSNSのWebアプリをイメージします。
イメージしやすいのは、ユーザがログインすることでメッセージや写真の投稿ができるようになるWebアプリです。他によくあるWebアプリの機能(利用者情報の変更、退会など)についてもイメージしてみます。
イメージしたWebアプリにログイン(認証)したらできるようになることを簡単にまとめます。
- メッセージの投稿
- 写真の投稿
- 利用者情報の変更(メールアドレス、パスワードなど)
- 退会
以降では、ここでイメージしたようなWebアプリのことを総称して「SNSアプリ」とします。
Webアプリへの機能的な需要
ここで例とする機能的な需要は簡単に言うと、SNSアプリと他のWebアプリの連携がしたい です。
以降では、連携したいWebアプリのことを「連携先のWebアプリ」とします。
昨今では写真を投稿できるSNSアプリが複数存在します。もし、利用者が複数のSNSアプリを使用していた場合、「あの写真はどこに投稿したんだっけ?」のようなことが発生し、「まとめて管理できると便利では?」という発想にいたります。そして、その需要に応えるため、SNSアプリと連携し、SNSアプリに投稿した写真を管理するWebアプリが登場しました。
つまり、ここでいう需要の本質は
利用者がSNSアプリに登録しているデータ(写真)を連携先のWebアプリでも使用したい
ということになります。
需要に応えることによって発生する問題
しかし、認証と認可が分かれていない場合、利用者がSNSアプリに登録しているデータを、連携先のWebアプリで使用できるようにすると問題が発生します。
その問題は
SNSアプリへのログインIDとパスワードを連携先のWebアプリに登録する必要がある
というものです。
SNSアプリ上の写真が管理できる権限を連携先のWebアプリが得るには、連携先のWebアプリが利用者としてSNSアプリに認証される必要があります。そのため、利用者は認証が行えるログインIDとパスワードを連携先のWebアプリに教えることになります。
これによって、連携先のWebアプリは写真の管理以外にもメッセージの投稿や利用者情報の変更、退会処理などが可能となります。もし、この連携先のWebアプリに機能的な不備があったり、そもそも悪意のあるWebアプリだったりする場合は、利用者からみて想定外の操作が行われるかもしれません。
つまり、ここでいう問題の本質は
不必要な権限を連携先のWebアプリに与えてしまう
ということになります。
問題の解決方法
問題が発生する原因は、SNSアプリには 必要な権限1だけを与える手段が存在しない ところにあります。認証と認可が分かれていないSNSアプリは、認証によってあらゆる権限をまとめて認可するため、必要な権限だけ認可することができません。
問題の解決方法は、必要な権限だけが与えられる手段を用意することです。ひとつ具体例を挙げると、SNSアプリに認証された利用者が、連携先のWebアプリに対し必要な権限だけを与えられるようにするということになります。
つまり、SNSアプリに「認証」された利用者が連携先のWebアプリに対し、必要な権限だけ「認可」できるようにしたい という需要が発生したことになります。そしてこれこそが、認証と認可を分けて考えたい理由 のひとつなのです。
おわりに
今回は認証と認可の違いについて「Webアプリの連携」を例にまとめてみました。
認証と認可の違いを理解するだけであれば、わざわざ連携を例にせずとも複数の権限が存在するWebアプリをイメージするだけで良いと思います。ただ、自分としては「どんな嫌なことがあるか」がわかると実感が得やすいので、それがわかりそうな「Webアプリの連携」を例としました。そのせいで後半だいぶごちゃごちゃした印象がありますが、読んでいただけて幸いです。
-
データ(写真)へのアクセス権限やメッセージの投稿権限といった、機能やデータ単位 で考えた権限のことを指します。↩