実機検証で確認した挙動 (PR #58 の 4 ノード mesh 検証)
- 受信者が委譲 JWT で read → 初回は成功 (member 直・relay 経由とも 200)
- 同じ JWT での 2 回目の read は 403 —
UcanAdapter::verify_auth_token が check_and_record_nonce(jti) で jti を消費するため
矛盾
- monas-account の
/issuer/delegate は TTL (デフォルト 3600 秒) 付きのトークンを発行し、SDK は ShareContentOutput.delegated_access として1 個を受信者に渡す設計
- しかし state node 側では jti が nonce として一度で消費されるため、この 1 個のトークンでは read が 1 回しかできない
- 受信者の通常利用 (history 取得 → version data 取得だけで既に 2 リクエスト) が成立しない
論点
- リプレイ防止は request signature の timestamp freshness (5 分窓) で既に担保されている。jti の nonce 消費は「リクエストのリプレイ」ではなく「トークンの再利用」を禁止しており、これが意図か要確認
- 意図的なら: SDK/gateway はリクエストごとに
/issuer/delegate でトークンを再発行する設計にする必要がある (レイテンシ・可用性への影響大)
- 意図でないなら: jti nonce は PoP 署名の (timestamp とセットの) リプレイ防止に置き換え、トークンは TTL 内再利用可へ
🤖 Generated with Claude Code
実機検証で確認した挙動 (PR #58 の 4 ノード mesh 検証)
UcanAdapter::verify_auth_tokenがcheck_and_record_nonce(jti)で jti を消費するため矛盾
/issuer/delegateは TTL (デフォルト 3600 秒) 付きのトークンを発行し、SDK はShareContentOutput.delegated_accessとして1 個を受信者に渡す設計論点
/issuer/delegateでトークンを再発行する設計にする必要がある (レイテンシ・可用性への影響大)🤖 Generated with Claude Code