OpenID Connectにおける「nonce」の役割とリプレイアタック対策
SSO(Single Sign-On)を導入するにあたり、セキュリティを確保するためのキー概念の1つが nonce(ノンス)です。
本記事では、OpenID Connectにおける nonce の具体的な使われ方と、リプレイアタックをどのように防いでいるのかを、初心者にもわかりやすく整理してみました。
nonce(ノンス)とは?
nonce(ナンス、Number used once)とは、一度しか使えない一意のランダム値のこと。
主に以下のような目的で使われます:
- 暗号化における初期ベクトル
- 一時的なトークン(ワンタイムトークン)
- 認証の整合性確認(OpenID Connectなど)
つまり、「使い捨ての鍵」のようなものです。
OpenID Connectにおけるnonceの流れ
OIDC(OpenID Connect)では、nonceはIDトークンの再利用(リプレイ)を防ぐためのセキュリティ対策として使用されます。
① 認証リクエストでnonceを生成
クライアント(例:Webアプリ)は、IdP(Identity Provider)にリクエストを送る際に、ランダムな nonce を生成します。
import os
nonce = os.urandom(20).hex() # 例: Pythonでの生成方法
② nonceをセッションに保持
生成した nonce は、セッションや一時的なストレージに保存しておきます(後で検証するため)。
③ IdPがIDトークンにnonceを埋め込む
ユーザーが認証に成功すると、IdPは nonce をIDトークンのpayload内に含めてクライアントに返します。
④ トークン受信時にnonceを検証
クライアント側では、IDトークンに含まれる nonce とセッションストアに保存された nonce を照合します。
一致 → トークン有効
不一致 → 不正なトークンとして拒否
⑤ nonceを削除して再利用を防止
照合後、セッションから nonce を削除します。
そのため、同じIDトークンを使い回そうとする攻撃者は、nonceが一致せず失敗するという仕組みです。
リプレイアタックとは?
リプレイアタックとは、攻撃者が一度使われた正規のIDトークンを再利用して、不正にアクセスを試みる攻撃です。
しかし、nonceがあることで以下のように防げます:
攻撃者が盗んだIDトークン → 使おうとする
でも、正しいnonceはもう存在しない!
よって認証エラー!
まとめ:一言でいうと…
nonceを使えば、IDトークンは“一度きりしか使えない”仕組みになるってことです!
SSOやOIDCを安全に導入したいなら、nonce の概念は必ず押さえておきたいポイントですね。