Core problem: POST /charge timeout — charge may succeed, response lost. Client lose-lose: retry → double charge, don't retry → lost charge.
Idempotency key breaks tie. Mint unique key once before first attempt; every retry same key. Server records k → R; second k replays R.
Attempt 1: POST /charge Idempotency-Key: k9f… ─▶ server charges $10, stores k9f→receipt
✗ response lost in the network (but the charge HAPPENED)
Attempt 2: POST /charge Idempotency-Key: k9f… ─▶ server sees k9f, REPLAYS receipt
✓ exactly one charge, client gets its answer
Same key = same operation. Per «Pay» click, not per HTTP attempt.
Итог
Networks duplicate; idempotency keys make POST as safe to retry as PUT for the client.
идемпотентность и дедупликация запросов: ментальная модель · Sobeso