🤔

OpenID Connectはなぜ必要か

に公開

はじめに

OpenID Connectは,OAuth 2.0を拡張した,認証を行うためのプロトコルです.
OAuth 2.0は認可のためのフレームワークですが,しばしばOAuth認証として,認証のためのプロトコルとしても利用されます.
では,なぜOpenID Connectが認証のためのプロトコルとして用意されているのでしょうか?
この記事では,OAuth 2.0で発行されるAccess Tokenと,OpenID Connectで発行されるID Tokenに注目して,その違いによるOIDCの必要性と,それぞれのトークンの適切な扱い方について説明します.

OAuth 2.0とAccess Token

端的に言うと,OAuth 2.0とは,ユーザー自身の持つリソースについて,他者にアクセス権限を委譲するためのAccess Tokenを発行するためのフレームワークです.
Access Tokenは,「どのリソースにアクセスして良いか」を表すものであり,これを受け取ったアプリケーションは,ユーザーの代わりにリソースにアクセスできるようになります.

重要なのが,Access Tokenはリソースに対するアクセスの認可を示すものであって,それ以上でも以下でもないということです.

OAuth認証とその問題点

OAuth認証とは俗称であり,OAuth 2.0を認証に用いるパターンのことを指します.
メジャーなソーシャルログインでも用いられており,GitHubのソーシャルログインもOAuth認証で実装されています.
OAuth認証では,「ユーザーのプロフィールに対するアクセスの認可」を表すAccess Tokenを用いて,ユーザーのIDなどを取得し,認証を行います.
以下のようなロジックで認証(ユーザーが誰であるかの特定)を行なっています.

  1. ユーザーから送付されたAccess Tokenで,GitHubユーザーID等の取得を行なった
  2. このAccess Tokenは,取得したユーザーIDを持つユーザーが認可したものである
  3. したがって,Access Tokenを送付してきたのは,取得したユーザーIDのユーザー本人である

しかし,このロジックには穴があり,素朴な実装では脆弱となってしまいます.

トークンハイジャック

一例として,トークンハイジャックとして知られる攻撃があります.
これは,何らかの手段で取得した他人のAccess TokenでOAuth認証を行うと,その人になりすますことができる,というものです.

あるアプリAと,攻撃者の作成した悪意のあるアプリBがあるとして,それぞれがOAuth認証を行なっている状況を考えます.
ユーザーがアプリBにOAuth認証を行うと,攻撃者はユーザーのプロフィールを取得できるAccess Tokenを入手することができます.
このAccess TokenをアプリAに送付することで,攻撃者はユーザーになりすましてアプリAにログインできてしまいます.

これ以外にも,様々な攻撃があります.

実装依存の対策とOIDCの必要性

実際には,GitHubやFacebookなどのOAuthプロバイダーでは,Access Tokenを発行したクライアントアプリケーション(Client ID)に紐付けるなど,独自の実装によって様々な攻撃への耐性を持たせています.
しかし,これはあくまで各プロバイダーの実装依存であり,OAuth 2.0の仕様レベルで保護されているわけではありません.
この問題を仕様レベルで解決し,認証のための標準化されたプロトコルとして策定されたのがOpenID Connectなのです.

OpenID ConnectとID Token

OpenID Connectでは,「ユーザーが何者であるか」を表す,ID Tokenを発行します.
ID TokenはJWT形式で発行され,issuer(発行者)やsubject(認証されたユーザーのID),audience(ID Tokenを受け取る対象)などの情報を含んでいます.

OpenID Connectを用いることで,OAuth認証のような脆弱性の心配なく,安全に認証を行うことができます.
では,それはどのように達成されているのでしょうか?

audience

Access TokenとID Tokenには様々な違いがあります.
一例として,audience(トークンを受け取る対象)の有無です.
ID Tokenにはaudienceが必ず含まれており,どのクライアントアプリケーションのために発行した認証情報かがわかるようになっています.

これによって,先ほどのトークンハイジャック攻撃を防ぐことができます.
先ほどのようにアプリA,攻撃者の作った悪意のあるアプリBがあるとします.
アプリBで発行したID TokenにはaudienceとしてアプリBが指定されているので,アプリAで仮にこのID Tokenを受け取っても,それが自分向けのものでないことがわかります.
このように,ID Tokenはトークンハイジャックに対して耐性を持ちます.

他にも,nonceによる再送攻撃への対策など,OpenID Connectは様々な工夫によって,多様な攻撃への耐性を持ち,安全に認証を行うことができます.

まとめ

この記事では,OpenID Connectがなぜ必要か?をなるべく簡潔に説明しました.
認証が脆弱というのは,アプリケーションとして致命的です.
また,様々な攻撃への対策を立てるというのも,個人や1つの会社で行うのは困難です.
OpenID Connectを使うことで,安全なアプリケーションを構築しましょう.

PrAha

Discussion