認可フローで利用されるnonceパラメータについて。
nonceとは何か
nonceもまたcode_challengeやstateとともに認可コードリクエストに含まれるパラメータです。
この値の用途は何なのでしょうか。
OAuth2.0には無くOIDCにのみ登場する値であるので守りたいのはID Tokenであることはなんとなく想像がつきます。
公式ドキュメント 曰く、
nonce
Client セッションと ID Token を紐づける文字列値. リプレイアタック防止のために用いられる. Authentication Request で指定されたままの値を ID Token に含める. ID Token に nonce が含まれる場合, Client は Authentication Request に含めた nonce 値が ID Token に含まれる nonce Claim Value と一致することを検証しなければならない (MUST). Authentication Request に nonce が含まれていた場合, Authorization Server は ID Token に Authentication Request で受け取ったそのままの Claim Value で nonce Claim を含めねばならない (MUST). Authorization Server は, 受け取った nonce に対して上記以外のなんらの処理も行うべきではない (SHOULD). nonce は大文字小文字を区別する文字列である.
- IdPサーバーは認可リクエストに含まれるnonceをそのままIDTokenに格納しなくてはならない
- 認可リクエストで送ったときのnonceとIDTokenに含まれるnonceが同じか検証しなくてはならない
図解してみましょう。
nonceが一致すれば、ID Tokenが 自分の認可リクエストに対応するものであることを確認できます。
nonceが防ぐリプレイ攻撃
nonce
Client セッションと ID Token を紐づける文字列値. リプレイアタック防止のために用いられる.
ここで述べられたリプレイ攻撃とは何でしょうか。これは「傍受した他人のIDトークンを利用すること」を意味します。
攻撃者の使うIDトークンが他人のものであってもIDトークン自体は正当であるため、IDトークンを利用した処理に成功してしまう可能性があります。
nonceが無い場合
nonceによる検証が無い場合、次のような攻撃が成立する可能性があります。
Client上でnonceを比較することによって、上記のような攻撃を防げることがわかります。
まとめ
OpenID Connectでは、ID Tokenの正当性を検証するためにnonceパラメータが利用されます。
この検証を行わない場合、他人のID Tokenを利用するリプレイ攻撃が成立してしまう可能性があります。
nonceの検証は、Clientの認証セッションとID Tokenを結び付けることにより攻撃を防ぐ役割を持っています。