TLS 会话恢复是什么?Session ID、Session Ticket 和 0-RTT 有什么区别?
简化版
TLS 会话恢复是客户端和服务器复用之前协商过的会话信息,减少完整握手开销。TLS 1.2 常见方式有 Session ID 和 Session Ticket;Session ID 需要服务端保存会话状态,Session Ticket 把状态加密后交给客户端保存,服务端用密钥解开。TLS 1.3 使用 PSK 机制,并支持 0-RTT 早期数据,但 0-RTT 有重放风险,通常只适合幂等请求。
详细版
完整 TLS 握手需要密钥协商、证书校验和多次往返。会话恢复通过复用之前的共享密钥材料减少延迟和 CPU 成本。
| 机制 | 状态保存 | 特点 |
|---|---|---|
| Session ID | 服务端保存 | 简单,但集群共享状态麻烦 |
| Session Ticket | 客户端保存加密票据 | 服务端可无状态,但要保护 ticket key |
| TLS 1.3 PSK | 基于预共享密钥恢复 | 握手更短,可配合 0-RTT |
| 0-RTT | 客户端提前发送数据 | 延迟低,但有重放风险 |
面试要强调:会话恢复优化的是握手成本,不改变 TLS 认证、加密和完整性保护的目标;0-RTT 不能随便用于转账、下单等非幂等操作。
完整版教学
一、为什么 TLS 需要会话恢复
HTTPS 连接建立时,TCP 先握手,TLS 再握手。完整 TLS 握手涉及证书、密钥协商、签名验证等步骤,延迟和 CPU 成本都不低。
TCP 握手 -> TLS 完整握手 -> HTTP 请求
如果用户频繁访问同一站点,每次都完整握手会浪费资源。会话恢复就是让客户端和服务器复用之前协商出的会话信息,缩短后续连接建立过程。
二、Session ID:状态保存在服务端
TLS 1.2 中,服务器可以给客户端一个 Session ID。客户端下次连接时带上这个 ID,服务器如果还保存着对应会话,就恢复它。
第一次握手:
server -> Session ID = abc
第二次握手:
client -> 我想恢复 Session ID abc
server -> 找到会话,恢复
缺点是服务端要保存状态。单机没问题,但多台服务器或负载均衡场景下,需要会话共享、粘性会话或集中缓存,否则客户端命中另一台机器时可能恢复失败。
三、Session Ticket:状态交给客户端保存
Session Ticket 的思路是:服务端把会话状态加密成票据发给客户端,客户端下次带回来,服务端用 ticket key 解密。
server -> 加密(ticket_state) -> client
client -> ticket -> server
server -> 解密 ticket,恢复会话
优点是服务端可以少保存状态,更适合集群。风险是 ticket key 很关键:
- key 泄露可能影响历史或未来会话安全;
- key 轮换太慢会削弱前向安全;
- key 轮换太快会降低恢复命中率。
Session Ticket 的面试关键词是“服务端无状态”和“ticket key 管理”。
四、TLS 1.3 的 PSK 和 0-RTT
TLS 1.3 把会话恢复统一到 PSK 思路。恢复握手比完整握手更短,还可以支持 0-RTT early data。
普通恢复:
client hello(带 PSK) -> server hello -> 加密通信
0-RTT:
client hello + early data -> server
0-RTT 的诱人之处是客户端可以在第一趟就发送数据,降低延迟。但早期数据可能被攻击者重放,所以不能随便用于有副作用的请求。
五、0-RTT 为什么有重放风险
假设客户端发送:
POST /pay
amount=100
如果这段 early data 被攻击者捕获并重放,服务端可能重复处理。TLS 本身无法完全理解业务语义,所以工程上要限制 0-RTT 的使用。
适合 0-RTT 的请求:
- 幂等 GET;
- 可重复执行且无副作用的查询;
- 服务端有防重放机制的请求。
不适合 0-RTT 的请求:
- 下单;
- 支付;
- 修改密码;
- 扣库存。
六、会话恢复和连接复用的关系
两者都能提升 HTTPS 性能,但层次不同:
| 优化 | 作用对象 | 收益 |
|---|---|---|
| HTTP Keep-Alive | 已建立 TCP/TLS 连接 | 多个请求复用同一连接 |
| TLS 会话恢复 | 新建 TLS 连接 | 缩短握手 |
| HTTP/2 多路复用 | 单连接多 stream | 减少并发连接数 |
如果连接还活着,优先复用连接;如果连接已经断开,再考虑 TLS 会话恢复降低重新连接成本。
七、常见误区与追问
- 误区:会话恢复等于不加密。 会话恢复仍然建立加密通信,只是复用之前的密钥材料减少握手成本。
- 误区:Session Ticket 不需要任何服务端密钥。 服务端必须保护和轮换 ticket key,否则会带来安全风险。
- 误区:0-RTT 可以用于所有请求。 0-RTT 有重放风险,只适合幂等或具备防重放能力的请求。
- 误区:连接复用和会话恢复是一回事。 连接复用是不关闭现有连接,会话恢复是新连接缩短 TLS 握手。
- 追问:Session ID 和 Session Ticket 最大区别是什么? Session ID 状态在服务端,Session Ticket 状态加密后由客户端保存。
- 追问:为什么集群更偏向 Ticket? 因为它减少服务端共享会话状态的压力,但需要统一和轮换 ticket key。
八、加强记忆
TLS 会话恢复记住三层:Session ID 是服务端记住会话,Session Ticket 是客户端带回加密票据,TLS 1.3 用 PSK 恢复并可支持 0-RTT。它优化的是重新握手成本,不是替代 Keep-Alive。0-RTT 虽快但怕重放,尽量只给幂等请求或有防重放设计的接口使用。面试答到 ticket key 轮换和 0-RTT 重放风险,就比较深入。