Open ID Connectのnonceパラメータの意義についても整理してみる

前回OAuth2.0でのstateパラメータの役割について簡単にまとめましたが、OAuth2.0ではなくOpen ID Connectではstateパラメータに加えてnonceも利用されます。この二つのパラメータの違いが最初は理解しづらい部分もあったので、今回はこちらのnonceパラメータの役割についてもかいつまんで記載したいと思います。

Open ID Connectの流れ

OAuth2.0は「認可」を目的としたフレームワークということで、ユースケースで理解するのに苦労したのですが、Open ID Connectは認証に主眼が置かれている仕組みということもあり、もう少しオンライン寄りな例も可能かなと思います。

例えば昨今ニーズの増えているオンラインライブにLINEアカウント(外部IdP)のIDでログインしたいようなケースを考えてみます。

f:id:ybnskk:20201202044533p:plain

  1. 参加者はオンラインライブのサイトへアクセスします。
  2. 参加者がまだ認証されていないので、認証サーバ=LINEの認証エンドポイントへリダイレクトされます。
  3. 参加者はLINEの認証画面で認証を実施します。
  4. LINEは参加者にコードを返却します。
  5. 返却されたコードとともにオンラインライブのサイトへリダイレクトされます。
  6. オンラインライブのサイトはコードをLINEへ送信します。
  7. LINEはそのコードを元にIDトークンをオンラインライブのサイトへ返却します。

ここまで終了すると、オンラインライブのサイトに対して参加者が誰か、という情報が伝わり、参加者マイページ等の表示が可能となります。

セキュリティリスク:IDトークンの横取り

しかし、こちらの図を見ていると、もし⑦のIDトークンを返却する際にこのトークンを通信を傍受されるなどをして横取りされた場合、正規の参加者のふりをして悪意あるユーザがログインできてしまうのではないか?という懸念があります。

f:id:ybnskk:20201202044600p:plain

ここで登場するのがnonceパラメータとなります。nonceパラメータは、②の認証サーバへリダイレクトされる際に発行され、最後⑦のIDトークンの中にもnonceパラメータの値が含まれています。

悪意あるユーザの横取りを防ぐ仕組みは下記のイメージです。

f:id:ybnskk:20201202044614p:plain

  • 参加者Aさんが認証サーバへリダイレクトされる際、オンラインライブのサイトはAさんのセッションに紐づくnonceを発行します(①~②)。
  • Aさんは外部IdPで認証を実施し、IDトークンが発行されます(③~⑦)。
  • ここでIDトークンを悪意あるユーザが横取りします。が、同時にオンラインライブのサイトは認証完了時点でAさんセッションに紐づくnonceを破棄します。
  • 悪意あるユーザがIDトークンをオンラインライブのサイトへ送信しますが、IDトークンに含まれるnonceはすでに破棄されているので一致が確認できず、認証が失敗します。

このようにnonceパラメータを正しく発行・検証することで安全に外部IdPを用いた認証が実現できます。

stateとの違い

前回書いたstateと今回のnonceはセキュリティに関するパラメータだとは理解しつつ、違いを理解するのが難しかったりしますが(nonceはOIDCで出てくる、くらいの認識だったり、CSRF攻撃を防ぐという目的は一緒だったり)

それぞれ役割だったり検証方法が違うものであるということがCSRF攻撃を防ぐという観点だけでもわかるかなと思います。

項目 state nonce
防ぎたいこと ユーザが攻撃者として認識されること(攻撃者のコードを使わされること) 攻撃者がユーザとして認識されること(IDトークンを横取りされること)
攻撃ポイント アクセストークン発行前 IDトークン発行後
方法 クライアントが保存しているデータとパラメータの一致を検証 クライアントが保存しているデータとIDトークン内のパラメータの一致を検証

OAuth2.0、Open ID Connectのセキュリティという面ではさらに実装ポイントもありますが、よく使う機会のあるstate、nonceに関して簡単にですがまとめてみました。