見出し画像

OAuthとOpen ID Connectの違い(1/n)

イントロ

今回はOAuthとOpen ID Connectの違いについて説明したいと思います。
このネタについて調べている人の多くが、自分が作っているアプリケーションに、以下のようなプラットフォームに認証してもらうログイン機能つけたいと思っている人だと思います。

Canvaのログイン画面

ただ調べてみたはいいけど、OAuthを使えば良いのか?Open ID Connectを使えば良いのか?よく分からないという人もいるかと思います。そういった方向けに今回、説明したいと思います。

結論

まず結論から、「Open ID Connect」を使って下さい。
そして、「Open ID Connect」は「OAuth2.0」の拡張なので、まずは「OAuth2.0」を理解して下さい。
だだし、以下の図のようにその拡張部分は小さく、「OAuth2.0」を理解してしまえばほぼ「Open ID Connect」を理解したことになります(以下図)。

Open ID ConnectにおけるOAuth2.0の割合(筆者主観)

Open ID Connect(100%) = OAuth2.0(95%) + IDトークン(5%)

これは私が両者を理解してみての主観ですが、「Open ID Connect」は「OAuth2.0」の拡張と言っても、その拡張は微々たるもの(5%程度)で、理解しなければいけない事柄の量はOpen ID Connect ≒ OAuth2.0だと思います。その微々たるポイントがIDトークンの部分ですが、ここに関しては後述したいと思います。

OAuth2.0に関して

OAuth2.0に関しては別の記事で3回に分けて説明しておりますので、以下を参照して下さい。

Open ID Connectに関して

上記記事を読むことで、OAuthに関して理解できたと思います。次はOAuthとOpen ID Connectの違いについて説明したいと思います。
以下ではOpen ID ConnectをOIDCと省略します

各登場人物の呼び方が異なる

OAuth2.0では登場人物が4つ出ていきたと思いますが、OIDCでは、それらの呼び名が異なります。目的が「認可」から「認証」が変わったので名前を変えざる負えないという感じです。個人的には変えない方がいいのでは・・・と思います。わかりずらいので

OIDCの処理フロー

OIDCの処理フローは以下になります。名称など細かい違いはありますがほぼ同じです。異なるフローの部分を赤色の背景色にしています。

OIDCの処理フロー

IDトークン

1番の違いであるIDトークンについて説明します。

IDトークン

このIDトークンはアクセストークンがランダムな文字列だったに対して、
ユーザー情報が付加されたJson Web Token(JWT)になっております。JWTにはJSON Web Encryption(JWE)JSON Web Signature(JWS)の2種類がありますが、署名が施されていて中身を見ることが可能なJWSの方になります。
実際にどんな情報が入ってるかというと、以下のようなユーザー情報が入っています。ユーザーの氏名やアイコンの画像のURLなどが入ってます。この情報によりリライングパーティーはユーザーの基本情報を取得できます。

IDトークンのペイロード部分

このIDトークンをリライングパーティー受け取った際に、検証を行います。その詳細に関しては説明しようとすると長くなりますので、次回このフローに対する攻撃と対策の説明したいと思います。この検証を持って、リライングパーティーはユーザーの認証が完了したということになります。

UserInfoエンドポイント

IDトークンのペイロードから、基本的なユーザー情報は取得できますが、それ以外の情報が必要な場合(住所など)、このUserInfoエンドポイントから取得します。IDトークンから得られる情報で十分な場合は、このエンドポイントへの問い合わせは省略可能です。

疑問点

さて、こんな疑問が浮かびませんでしょうか?

  • IDトークンはなぜいるの?

  • アクセストークンだけで認証して、ユーザー情報はUserInfoエンドポイントから取得してはダメなのか?

この回答としては、なりすましなどの脆弱性があるからですが、この詳細な説明は次回にしたいと思います

実装

今回、OIDCのリライングパーティーをNode.jsのExpressを使って実装しましたので、興味がある方は自身で環境を作って、動きを確かめてみて下さい。

環境構築の仕方に関しては以下を参照して下さい。

ソースコード

ここから先は

2,268字

¥ 300

この記事が気に入ったらチップで応援してみませんか?