Nginx 安全透传 Cookie 需主动过滤字段、屏蔽敏感名(如 token/_csrf)、保留 Secure/HttpOnly 属性,并配合上游签名验证与 auth_request 鉴权。

要让 Nginx 安全地将用户 Cookie 透传给上游集群,核心是明确控制哪些 Cookie 被转发、避免敏感字段泄露,并防止中间篡改。默认情况下,Nginx 会原样转发 Cookie 请求头,但这不等于“安全”——关键在于主动过滤、校验与隔离。
只透传必要且可信的 Cookie 字段
Nginx 本身不解析 Cookie 内容,但可通过 map 和正则提取指定键值,再用 proxy_set_header 构造精简后的 Cookie 头。例如只保留 session_id 和 locale:
- 在
http块中定义映射:
map $http_cookie $safe_cookie {
default "";
~*session_id=([^;]+) $1;
~*(session_id=[^;]+;\s*locale=[^;]+) $2;
~*(locale=[^;]+;\s*session_id=[^;]+) $2;
}
- 在
location中设置:
proxy_set_header Cookie $safe_cookie;
这样可避免透传如 admin_token、_csrf 等不应下游服务接触的敏感 Cookie。
禁止透传敏感 Cookie 名称
更稳妥的做法是显式屏蔽已知高危字段。使用 map 将含敏感名的 Cookie 清空:
map $http_cookie $stripped_cookie {
~*(?i)(auth|token|_csrf|password|otp) "";
default $http_cookie;
}
再配合 proxy_set_header Cookie $stripped_cookie;。注意大小写不敏感匹配,且正则需覆盖常见变体(如 AuthToken、X-CSRF-Token)。
启用 Secure 和 HttpOnly 属性透传(不修改)
Nginx 不会自动添加或删减 Cookie 属性,但若上游服务依赖 Secure 或 HttpOnly 标志,需确保原始请求头未被意外覆盖。检查是否误用了 proxy_pass_request_headers off 或手动重写了 Cookie 却丢弃了属性。正确做法是:
- 不干预原始 Cookie 字符串结构,仅做字段筛选
- 确保
proxy_pass_request_headers on(默认即开启) - 若需强制
Secure(例如反向代理走 HTTPS 到 HTTP 上游),应由上游应用生成带Secure的 Set-Cookie,Nginx 不应伪造该属性
结合 upstream 的信任边界做二次校验
透传只是第一步。真正安全依赖上下游协同:
- 上游集群应在入口层验证 Cookie 签名(如 JWT 或加密 session ID),拒绝未签名/过期/篡改的凭证
- Nginx 可配合
auth_request模块,对携带特定 Cookie 的请求先调用鉴权服务,再决定是否代理 - 生产环境建议关闭
proxy_cookie_path/proxy_cookie_domain的自动重写,避免意外暴露域路径


















