OIDCのnonceの役目は何?

0x00 背景

略。

0x01 nonceとstateの違いは?

結論で言うと違いはとても簡単明瞭だ。stateパラメータで防ぎたいのはCSRF攻撃だ。OAuthの文脈でのCSRFは攻撃者のcode/tokenを被害者に強制使わせ、被害者を攻撃者の身分でログインさせる攻撃である。一方、nonceで防ぎたいのはtoken/code横取り攻撃。CSRFと逆で、token/code横取り攻撃は攻撃者が被害者のtoken/codeを取得し、被害者の身分になりすます攻撃である。

0x02 なぜnonceでtoken横取り攻撃を防げるのか

nonceはSPが発行して、idPがこのnonceを発行したtokenに入れる。SPがtokenをもらった時に、まずtokenに含まれたnonceをユーザーのsessionに記録したnonceと比較する。一致しない場合このtokenを破棄する。要するにtokenはユーザーのsessionと紐づいている。ここで気づいたかもしれないが、stateパラメータはユーザーのログイン状態としか紐づいてないので、nonceがわりにならない。

0x03 疑問

sessionを持っているSPだとnonceの検証はできるが、APIサーバーだと通常session持っておらず、来たtokenはそのまま信用するしかないがnonceの意味なくない?

0x03 参考

OpenID Connectのstateとnonceの違いがわからなかった