Yihui’s Blog

网关层如何防止接口重放攻击?

日期:2026-07-12
标签:#面试 #八股 #后端 #API网关 #安全 #重放攻击

一句话答案

请求携带身份、时间戳、一次性 nonce、幂等键和签名,网关验证时间窗口及签名,并原子记录 nonce 防重复;高价值操作还要绑定请求体和业务状态。

面试口语版

客户端对 method、path、规范化 query、body hash、timestamp、nonce 和 clientId 进行 HMAC/非对称签名。网关先校验凭证和签名,再检查时间戳在允许窗口内,用 Redis SET NX EX 原子记录 clientId:nonce;已存在就拒绝。时间窗口只能限制旧包,nonce 才阻止窗口内重复。业务写接口还携带 idempotencyKey,服务端保存首次结果,防网关状态丢失或合法网络重试造成重复扣款。全链路使用 TLS,密钥定期轮换。

校验流程

flowchart LR
  A[请求] --> B[校验身份与时间窗]
  B --> C[计算规范化请求签名]
  C --> D[Nonce原子去重]
  D --> E[业务幂等校验]
  E --> F[转发]

关键细节

  • 签名必须包含 body hash,否则攻击者可改正文。
  • 多节点共享 nonce 状态或使用一致分片,TTL 覆盖时间窗口。
  • 客户端时钟漂移需有限容忍并提供校时机制。
  • 防重放不等于防 XSS、Token 窃取或越权。

面试官追问

  1. 只有时间戳为什么不够?
  2. Redis 挂了 nonce 如何处理?
  3. 合法请求超时重试会被拒绝吗?

面试官追问参考答案

1. 只有时间戳为什么不够?

攻击者可在允许的几十秒窗口内重复发送同一个有效包,时间戳仍合法。nonce/请求 ID 需要在窗口内只接受一次,业务幂等键进一步保证副作用不重复。

2. Redis 挂了 nonce 如何处理?

按风险分级:支付等高风险接口 fail-close 或切高可用去重存储,普通读可降级。本地缓存只能防单节点重复,无法保证全局;Redis 集群需跨故障域并保留容量告警。

3. 合法请求超时重试会被拒绝吗?

网络层 nonce 重试可以使用新 nonce,但业务 idempotencyKey 保持不变,服务端返回首次执行结果。也可允许同 nonce 返回缓存结果而不再次执行,协议需明确。

学习清单

  • 掌握 timestamp、nonce、签名和业务幂等。
  • 理解高风险接口的故障策略。
Maintained by · YihuiEdit on GitHub

Keep reading

View all posts

设计 API 网关要考虑哪些功能?如何实现动态路由和限流?

日期:2026-07-12 标签:#面试 #八股 #后端 #API网关 #微服务 #限流 #系统设计 一句话答案 API 网关是统一流量入口,负责路由、认证、限流、协议转换、灰度、观测和安全;控制面管理动态配置,数据面使用不可变快照高速匹配并本地执行限流。 面试口语版 我会拆成控制面和数据面。控制面维护路由、服务…

Read article

配置中心挂了,微服务如何保证可用?

日期:2026-07-12 标签:#面试 #八股 #后端 #配置中心 #微服务 #高可用 一句话答案 数据面不依赖配置中心实时在线:服务使用内存中的最后有效配置和本地持久快照继续运行,启动策略按配置风险分级,并限制过期时间、告警和变更操作。 面试口语版 客户端每次成功获取配置都保存带版本、校验和和时间的本地快照。…

Read article