0-RTT 是什么
0-RTT 是 TLS 1.3 的早期数据机制:客户端在会话恢复时把应用数据放进第一个飞行,与握手同时发出,从而省掉一个往返。代价是这些早数据不具备抗重放能力,攻击者可以截获并重复发送。因此它只适合幂等请求,比如读取类接口;涉及下单、扣款等写操作应当拒绝或降级处理,这一判断必须由后端完成。
基本信息
| 前提 | 基于 PSK 会话恢复 |
|---|---|
| 风险 | early data 可被攻击者重放 |
| 适用范围 | GET 等幂等请求 |
| 服务端控制 | Nginx 的 ssl_early_data 与 Early-Data 头 |
| 后端处置 | 对带 Early-Data 头的请求拒绝非幂等操作 |
| 观测影响 | 早数据被拒绝时客户端会重试,压测数据可能失真 |
典型使用场景
- 移动端首屏优化:读取类接口用 0-RTT 降低首次请求延迟
- 静态资源与查询接口:天然幂等,适合开启早数据
- 写操作防护:下单、支付类接口明确拒绝早数据请求
- 压测与容量评估:区分早数据请求与被拒绝后的重试,避免结论失真
- 安全评审:确认会话票据是否做了单次使用约束
nginx 开启 0-RTT 并标记请求
nginx 开启 0-RTT 并标记请求
ssl_early_data on;
proxy_set_header Early-Data $ssl_early_data; # 供后端识别早数据请求
# 后端对带该头的非幂等请求应直接拒绝或要求重试
# 测试时可观察握手是否走了 0-RTT:s_client 提供早数据相关选项风险与缓解
| 风险 | 说明 | 缓解 |
|---|---|---|
| 重放 | 早数据可被重复发送 | 只允许幂等请求 |
| 票据滥用 | 票据未做单次约束时窗口更大 | 轮换票据密钥,敏感接口关闭 0-RTT |
| 统计失真 | 被拒绝的请求会自动重试 | 压测与监控区分两类请求 |
| 中间设备兼容 | 部分设备处理早数据异常 | 上线前逐跳验证 |
后端若对带 Early-Data 头的请求执行非幂等操作(下单、扣款),必须自行拒绝或降级处理。
0-RTT 并不等于「更快的 TLS」:它只在会话恢复且客户端愿意发送早数据时生效,首次访问没有任何收益。
关闭 0-RTT 只是不接受早数据,不影响正常的会话恢复,因此性能回归通常很小,敏感业务不必勉强开启。