🔐

認証と認可の違いをまとめてみる

2021/04/05に公開

※この記事は別アカウント(hyiromori)から引っ越しました

はじめに

認証と認可の違いを自分の理解のためにまとめてみた記事です。
参考にした記事のリンクも貼っておきますので、そちらもご参照ください。

おことわり

コンピューターやインターネットにおける認証と認可についての話です。
例には出てきたりもしますが、上記以外の認証・認可や、保育園の話は対象外です。

そもそも認証と認可ってなんだっけ?

まずは Wikipedia をみてみます。

認証 - Wikipedia

認証(にんしょう)とは、何かによって、対象の真正性を確認する行為を指す。
https://ja.wikipedia.org/wiki/認証

対象が確かに誰(もしくは何)かを確認する行為という感じでしょうか。
アクセスしてきた人(もしくはコンピュータなど)が誰(もしくは何)かを確認する行為と言えると思います。

認可 (セキュリティ) - Wikipedia

認可(英: authorization)とは、一般的には情報セキュリティおよびコンピュータセキュリティに関わるリソースへの、とりわけアクセス制御へのアクセス権限を特定する機能である。
https://ja.wikipedia.org/wiki/認可_(セキュリティ)

とてもざっくり言うと、特定のリソースへのアクセスを許可するか禁止するか、と言う話だと思います。

具体例

ちょっとわかりにくいのでもうちょっと現実に即した例を挙げてみます。

認証

現実世界で言えば、パスポートやマイナンバーカードなどによる本人確認が当てはまると思います。

インターネットの世界であれば、ID+パスワードやメールアドレス・電話番号による確認とかでしょうか。
ただ、知っている or 所有していることを確認するだけなので、現実世界の「誰」なのかと直接は紐づきません。
インターネットバンキングなど、現実世界の本人確認と紐づける必要がある場合は本人確認書類を提出しないといけない、という場合もありますね。

ポイントとしては、純粋な認証はそれ自体で何か認可が行われるわけではない、と言うことです。
認証によって誰かがわかったことと、それによって何ができるかは切り離して考えた方が混乱しません。

ただ、現実的には認証と認可が同じ条件になっていることも多い気がします。
例えばTwitterであれば、ログインした=ツイートできる、みたいな図式になっていると思います。
この辺が混同しやすく、また分かりにくい部分だと私は思いました。

認可

現実世界であれば、電車の切符とかがわかりやすいと思います。
電車の切符は「支払った料金以内の範囲で電車に乗車する」ことを許可されたものです。
誰が使うかは決められていませんので、購入した人以外が使うことも可能です。

ただ運転免許証のように、認証と(自動車を運転する)認可の両方が含まれているものもありますね。
それだけ認証と認可は近い概念なのだと私は感じました。

認証と認可を混同することによるリスク

ここまでで認証と認可を分けて考えてきましたが、なぜ分けて考えないといけないのでしょうか?

今回ちゃんと調べようと思ったきっかけでもあるのですが、OAuth2.0と言う「認可」の規格を「認証」に用いてしまう事例があり、またそれによって大きなリスクが発生することがあります。

https://www.sakimura.org/2012/02/1487/

前述の電車の切符の例にすると、切符を購入したのはAさんだから、この切符を持って改札を通ったのはAさんだと見なしてしまう、と言うことです。
切符を譲渡したり、落として他の誰かが拾って使ってしまう、悪用する目的で切符を盗む、などのリスクを考慮できていません。

例として最適ではないですが、OAuth2.0 を「認証」に使ってしまうのは、このようなリスクを孕んでいます。
OAuth2.0 を「認証」に使うと一見正しく認証できているように見えるのですが、こういったリスクがあることを知っておく必要があります。

「認証」を行うのであれば、OAuth2.0 を拡張した OpenID Connect を使いましょう。
詳しい話は、こちらのブログに書いていますので、興味がありましたらご覧ください。

https://zenn.dev/hyiromori/articles/2021-01-30-oidc

まとめ

  • 認証と認可は違う概念
    • ただし同時に行われることも多いので概念として分かりにくい
    • 使うときにはきちんと違いを考慮して考えていく必要がある
  • OAuth2.0 を認証に使ってはいけない
  • 認証をするなら OpenID Connect を使う

参考資料

GitHubで編集を提案

Discussion