The Replay Problem
Early data has no replay protection by design.
An attacker who captures the ClientHello + early_data can re-send it to the server.
The server cannot distinguish a replayed ClientHello from a fresh one.
TLS 1.3 provides 0-RTT data with no forward secrecy and no replay protection.
RFC 8446 §8 requires servers to implement at least one anti-replay mechanism:
- Single-use tickets: each ticket can only be used once (requires distributed state)
- Client Hello recording: hash of ClientHello within a time window
- One-RTT fallback: reject early data entirely