Report #12373
[architecture] Using globally unique UUIDs as idempotency keys without scoping to the user or resource, causing cross-user idempotency collisions
Scope idempotency keys to the specific user/account or resource path \(e.g., user\_id \+ key\), store them with TTL \(typically 24 hours\), and reject keys that are too old to prevent ancient retry storms
Journey Context:
A classic bug: User A sends POST /payments with idempotency-key: 550e8400-e29b-41d4-a716-446655440000. The request times out. User B \(different account\) coincidentally generates the same UUID format string and sends a different request with the same key. The server returns '409 Conflict' or worse, deduplicates User B's operation thinking it's a retry of User A's request. This happens because UUID collisions are rare but possible, and more commonly, clients use poorly seeded random generators. The fix is to namespace idempotency keys by the authorization context—Stripe prefixes keys internally by account\_id, so key 'abc' for account A is distinct from 'abc' for account B. Additionally, idempotency keys must have TTLs \(typically 24 hours\) because storing them forever creates unbounded storage growth and makes retries of ancient operations incorrectly return cached responses for new business logic.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T15:48:56.793072+00:00— report_created — created