masakiのブログ Written by masaki shibayama

【Web系エンジニア必見】OAuthとは何かについてわかりやすく解説【図解あり】

Programming WebApp

こんにちは。masakiです。
今までOAuthについてなんとなく理解していたものの、詳しいところまでは理解していなかったので、今回の理解をきっかけにブログで解説したいと思います。

OAuthとは何か

OAuthの登場人物

OAuthとは何かについて理解するためには、まずOAuthの登場人物について把握しておかなければなりません。
OAuthの登場人物は以下の図のとおり、4種類です。

それぞれ順番に詳しく解説していきます。

ユーザー

アプリを使用する人のことです。

サードパーティーアプリ

開発者によって開発されたアプリです。
ここではわかりやすい例として、Google Photoに保存されている写真を加工できるアプリを考えます

ユーザーはこのアプリを使って、Google Photoに保存されている写真を加工できます。
ちなみに、なぜサードパーティーという名前が付いているのかというと、Google Photoから見れば、その機能を利用するアプリというのは第三者だからです。

認可サーバー

今回の例で言うと、Google Photoの認証周りをつかさどるサーバーになります。
このサーバーがユーザーに対して許可を出すことで、ユーザーは次に説明するリソースサーバーのリソースを使用することができます。

リソースサーバー

今回の例で言うと、Google Photoの写真を保存しているサーバーになります。
Google Photo側がサードパーティーアプリに対して提供しているAPIを介して、サードパーティーアプリはGoogle Photoの写真を扱うことができます。

APIとは何かについて知らない方は、以下の記事を読んでからこの記事を読んでいただくと良いと思います。
【中学生でもわかる】APIとは何かについてわかりやすく解説【エンジニアが噛み砕いて説明します】

以上の4つをまとめると、以下のとおり。

  • ユーザーはサードパーティーアプリを使い、その中でリソースサーバーのリソースを利用する
  • リソースサーバーのリソースをサードパーティーアプリが利用するためには、認可サーバーによる許可が必要

登場人物の関係性

次に、上記の登場人物がOAuthの文脈でどのように関係しているのかを、以下の図を用いて説明します。

OAuthによる認証の大まかな流れは以下のとおりです。

  • ①サードパーティーアプリが認可サーバーに対して、リソースへのアクセス権を要求する
  • ②認可サーバーは、リソースのアクセス権をサードパーティーアプリに渡していいのかをユーザーに確認する
  • ③リソースのアクセス権をサードパーティーアプリに渡していいことをユーザーが同意する
  • ④認可サーバーがサードパーティーアプリに対して、アクセストークン(アクセス権が渡された証)を発行する
  • ⑤そのアクセストークンを持つことによって、サードパーティーアプリはリソースサーバーのリソースにアクセスする

つまり、OAuthとは、サードパーティーアプリがリソースに対して限定的にアクセスすることを可能にするための、アクセストークン発行方法の仕組みのことになります。

※ここでいう「限定的なアクセス」とは、例えば「自身のGoogle Photoの写真を参照することのみを許可する」といった具合です。その場合、アクセストークンがあるからといってGoogle Photoの写真を更新・削除したり、別の人のGoogle Photoの写真を参照したりするといったことはできません。

OAuthを使うと何がいいのか

では、このOAuthという仕組みがあると何が嬉しいのでしょうか?
僕が思うに、OAuthを使うメリットは以下のとおりです。

  • ユーザーはサードパーティーアプリに、Google PhotoのID, Passwordを教える必要がない
  • 仮にアクセストークンが漏れてしまったとしても、被害が限定的になる

こちらも順番に解説していきます。

ユーザーはサードパーティーアプリに、Google PhotoのID, Passwordを教える必要がない

先ほどのOAuthの図を見てもらうとわかるのですが、Google PhotoのID, Passwordといったものは登場していませんね。

代わりにアクセストークンという仕組みを使うことによって、リソースへのアクセスを許可しているからです。
これにより、ID, Passwordが漏れる心配がなくなります。

仮にアクセストークンが漏れてしまったとしても、被害が限定的になる

仮にアクセストークンが第三者に漏れてしまったとしても、アクセストークンには有効期限があります
有効期限の長さはサービスによって異なりますが、例えば1時間とか1日といった具合です。

また、アクセストークンは、「どのリソースに対してどんな振る舞いができるか」という情報と紐付いているので、アクセストークンが漏れてしまったからといってリソースに対して何でもできるわけではありません。

今回の例で言えば、アクセストークンが漏れてしまったとしても、Google Photoの写真を参照されるといった被害に限定され、写真を書き換えられるとか削除されるみたいな心配はないわけですね。

リフレッシュトークンとは

ここで、OAuthを勉強しているとリフレッシュトークンという概念を目にすることがあると思いますので、そちらについても少し補足しておきます。
アクセストークンの有効期限が切れた時、サードパーティーアプリが認可サーバーに対してアクセストークンを再発行してもらう際に渡すトークンのことです。

アクセストークン:サードパーティーアプリがリソースサーバーに渡すもの
リフレッシュトークン:サードパーティーアプリが認可サーバーに渡すもの

という違いがあるので、ちょっとややこしいですが注意が必要です。

参考書籍

OAuthの理解はこちらの1冊で問題ないと思います。とてもわかりやすく書かれているので、OAuthについてもっと詳しく知りたい方は読んでみてください。
 

参考動画

以下のYouTubeもとてもわかりやすいのでオススメです。
 

参考記事

一番分かりやすい OAuth の説明