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の意味なくない?