OAuthとOpen ID Connectの違い(1/n)
イントロ
今回はOAuthとOpen ID Connectの違いについて説明したいと思います。
このネタについて調べている人の多くが、自分が作っているアプリケーションに、以下のようなプラットフォームに認証してもらうログイン機能つけたいと思っている人だと思います。
ただ調べてみたはいいけど、OAuthを使えば良いのか?Open ID Connectを使えば良いのか?よく分からないという人もいるかと思います。そういった方向けに今回、説明したいと思います。
結論
まず結論から、「Open ID Connect」を使って下さい。
そして、「Open ID Connect」は「OAuth2.0」の拡張なので、まずは「OAuth2.0」を理解して下さい。
だだし、以下の図のようにその拡張部分は小さく、「OAuth2.0」を理解してしまえばほぼ「Open ID Connect」を理解したことになります(以下図)。
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の処理フローは以下になります。名称など細かい違いはありますがほぼ同じです。異なるフローの部分を赤色の背景色にしています。
IDトークン
1番の違いであるIDトークンについて説明します。
このIDトークンはアクセストークンがランダムな文字列だったに対して、
ユーザー情報が付加されたJson Web Token(JWT)になっております。JWTにはJSON Web Encryption(JWE)とJSON Web Signature(JWS)の2種類がありますが、署名が施されていて中身を見ることが可能なJWSの方になります。
実際にどんな情報が入ってるかというと、以下のようなユーザー情報が入っています。ユーザーの氏名やアイコンの画像のURLなどが入ってます。この情報によりリライングパーティーはユーザーの基本情報を取得できます。
このIDトークンをリライングパーティー受け取った際に、検証を行います。その詳細に関しては説明しようとすると長くなりますので、次回このフローに対する攻撃と対策の説明したいと思います。この検証を持って、リライングパーティーはユーザーの認証が完了したということになります。
UserInfoエンドポイント
IDトークンのペイロードから、基本的なユーザー情報は取得できますが、それ以外の情報が必要な場合(住所など)、このUserInfoエンドポイントから取得します。IDトークンから得られる情報で十分な場合は、このエンドポイントへの問い合わせは省略可能です。
疑問点
さて、こんな疑問が浮かびませんでしょうか?
IDトークンはなぜいるの?
アクセストークンだけで認証して、ユーザー情報はUserInfoエンドポイントから取得してはダメなのか?
この回答としては、なりすましなどの脆弱性があるからですが、この詳細な説明は次回にしたいと思います
実装
今回、OIDCのリライングパーティーをNode.jsのExpressを使って実装しましたので、興味がある方は自身で環境を作って、動きを確かめてみて下さい。
環境構築の仕方に関しては以下を参照して下さい。
ソースコード
ここから先は
¥ 300
この記事が気に入ったらチップで応援してみませんか?