Webhook / signature / replay boundary

Webhook署名とreplay条件を分ける

受信時に混同しやすい署名、timestamp、replay、idempotencyを合成caseで確認します。実Webhookやsecretは扱わず、受信レビュー票だけをローカルで作ります。

受信レビューの5つの境界

署名が一致しても、時刻の窓、重複受信、処理の冪等性は別の条件です。受信前の確認軸を分けて記録します。

signature ≠ fresh ≠ idempotent / verify → reject → record
レビュー
signature署名の一致を確認し、secretそのものは受け渡さない。
timestamp許容時間窓を決め、古い通知を受け入れない。
replay同じeventやnonceの再送を検出して拒否する。
idempotency再試行されても処理結果を二重に作らない。
fail-closed確認できない通知は処理せず、運用へ戻す。

安全な確認の順番

  1. 署名とtimestampの確認条件を分ける。
  2. replay検出のevent識別子を決める。
  3. idempotencyで再試行時の結果を確認する。
  4. 実受信へ戻す前にローカルレビュー票を承認する。

このページは実Webhookを送受信せず、secretやユーザーpayloadも受け取りません。合成caseだけを扱います。

6つの合成case

case結果
signature-validSignature valid
timestamp-windowTimestamp window
replay-detectedReplay detected
idempotency-keyIdempotency key
signature-mismatchReject mismatch
local-noteLocal handoff