TLS 1.3 0-RTT: fast, and replayable
0-RTT lets a client send application data in the first round trip, saving a RTT. The cost: an attacker can capture and replay that data, and the server cannot tell a fresh request from a replayed one.
So it suits idempotent operations only — GETs and static assets. Anything that changes state (orders, payments, messages) must not use early data.
nginx leaves it off; enabling is explicit:
ssl_early_data on;
Pair it with a rejection of unsafe methods:
if ($request_method !~ ^(GET|HEAD)$) {
return 425;
}
425 Too Early exists for exactly this. Most sites do not need 0-RTT; the saved round trip is not worth introducing replay.