nginx-sticky模块仅实现会话粘滞,不提供限流能力,也无法阻止更换cookie绕过限流;其route cookie无签名、时间戳等安全机制,易被清空、伪造或批量生成;限流需依赖limit_req等模块,且key应优先选用$binary_remote_addr等不可伪造标识,或复合key增强约束。

nginx-sticky 模块本身不提供限流能力,也不识别或阻断“更换会话绕过限流”的行为。它只负责会话粘滞:通过 cookie(如 route)把同一客户端后续请求固定到某台后端服务器。而限流(如 limit_req)是独立模块,按 IP、token 或其他 key 统计并控制请求频率。
为什么 sticky 无法阻止换 cookie 绕限流
sticky 的 cookie(如 route=abc123)只是路由标识,不携带时间戳、签名、访问次数等安全信息。攻击者可轻松:
- 清空浏览器 cookie 后重发请求 → 触发新 route 分配 → 获得全新限流计数器
- 用脚本批量生成不同 route 值的请求(若后端未校验 route 合法性)
- 伪造合法 route(若使用明文 hash 或弱 salt,且未启用
secure/httponly)
真正起作用的是限流模块自身的设计
要防“换会话绕限流”,关键不在 sticky,而在限流 key 的选择和组合:
-
别只依赖 $cookie_route:单独用
$cookie_route作限流 key 是危险的,因为 route 可被重置或伪造 -
优先绑定不可伪造的源头标识:例如
$binary_remote_addr(客户端真实 IP)、$http_x_forwarded_for(需可信代理链)、或结合 JWT 用户 ID(需鉴权前置) -
多维度复合 key 更可靠:比如
limit_req_zone "$binary_remote_addr$cookie_route" zone=sticky_limit:10m rate=5r/s;—— 即使 route 变了,IP 不变仍受约束;若 IP 也变了(如代理/移动网络),再辅以其他维度
增强 sticky 本身的安全边界
让 route cookie 更难滥用,间接提高绕过门槛:
- 启用
hash=sha1或hash=md5:避免明文 route 暴露后端节点编号 - 设置
expires=30m:限制 route 有效期,避免长期复用 - 加上
secure httponly:防止 JS 窃取或非 HTTPS 下传输 - 指定
domain和path:缩小 cookie 作用域,降低跨站泄露风险
业务层协同防御更有效
纯 Nginx 难以彻底解决“伪造会话”问题,建议在关键路径叠加验证:
- 后端服务收到请求时,校验
Cookie: route=xxx是否由本机签发(如用 shared secret 签名 route 值) - 对登录态用户,将限流 key 绑定到
user_id(从 token 解析),而非 route 或 IP - 对高频操作(如秒杀、短信发送),引入人机挑战(验证码、设备指纹)作为前置条件











