SSO(single sign on)の実装を検討していた時に、nonceについて取り纏めていたメモです。
OpenID Connectにおけるnonceパラメーターについて
セキュリティの重要な概念の1つとして、nonce(ノンス)が挙げられます。
※nonce(number used once)は一度のみ使用される番号で、その重複や再利用を避けるために用いられます。
主に、暗号の初期ベクトルや認証トークンとしての役割を果たします。一部の文脈ではワンタイムトークンとも呼ばれます。
OpenID Connect(OIDC)におけるnonceの活用とリプレイアタックの防止方法:
- リクエスト時の生成:クライアント(例:ウェブアプリケーション)は認証リクエストをIdP(Identity Provider)に送信する際、nonceをランダムに生成します。
例)Pythonでの生成方法:nonce = os.urandom(20).hex()
- セッションの保持:生成されたnonceは、クライアント側のセッションストアや一時的ストレージに保存される。
- IDトークンへの組み込み:IdPは認証が成功すると、nonce値をIDトークンに組み込んでクライアントへ返す。
- トークンの検証:クライアントは、受け取ったIDトークン内のnonce値とセッションストアに保存したnonce値を比較。値が一致しなければ、トークンは拒否される。
攻撃者が既に使用されたIDトークンを再利用してクライアントへアクセスを試みる場合、システムはエラーを返します。
具体的には、クライアントがIDトークン内のnonceとセッションストアのnonceを比較・確認した後、
保存していたnonceは削除されます。そのため、後からIDトークンを不正利用しようとする攻撃者は、
正当なnonceが存在しないためエラーとなります。これにより、リプレイアタックの試みを効果的に防ぐことができます。
ものすごく簡単に言うと、nonceを活用すると、認証に使用するIDトークンは一度しか使えなくなるって言う事です。