最可靠cookie脱敏方式是用proxy_set_header cookie覆盖原始值;nginx不解析cookie,只能丢弃重建,需手动构造最小化安全cookie,配合proxy_hide_header屏蔽后端set-cookie。

直接用 proxy_set_header Cookie 覆盖原始值,是最可靠、最可控的 Cookie 脱敏方式。Nginx 本身不解析 Cookie 字符串,也不支持正则替换字段,所以不能“编辑”原有 Cookie,只能丢弃后重建。
只传必要字段,手动构造安全 Cookie
在 location 块中显式设置 Cookie 请求头,完全绕过客户端原始 Cookie 头:
- 用
$cookie_XXX变量提取客户端携带的指定 Cookie 值(如$cookie_session_id) - 拼接成最小化字符串,例如:
"session_id=$cookie_session_id; secure_cookie=1" - 这样后端收到的只有你允许的内容,
user_token、auth_key、user_email等敏感字段根本不会到达
用 if + set 动态提取(适合简单规则)
当需要根据条件决定是否透传某个字段时,可在 location 内使用 if 和 set 组合:
- 先初始化空变量:
set $safe_cookie ""; - 匹配并提取:
if ($http_cookie ~* "session_id=([^;]+)") { set $safe_cookie "session_id=$1"; } - 再通过
proxy_set_header Cookie $safe_cookie;发出 - 注意:不支持多字段拼接或嵌套逻辑,复杂场景建议用 Lua 或前置服务处理
配合 proxy_hide_header 屏蔽后端 Set-Cookie
脱敏不只是入向请求,也包括防止后端返回敏感会话信息:
- 加上
proxy_hide_header Set-Cookie;,可阻止后端设置的新 Cookie(如刷新 token)被透传给客户端 - 这对公开接口、静态资源路径或无状态 API 尤其重要
- 若后端需返回合法 Cookie(如登录成功),应单独配置对应 location,避免全局屏蔽
不推荐依赖 map 做字段拼接
虽然 map 可用于提取单个键值,但它无法拼接多个字段,也不能做条件判断:
- 例如想同时保留
session_id和lang,map很难做到干净表达 - 实际中容易漏匹配、分隔符处理错,维护成本高
- 真有此需求,优先考虑用
ngx_lua模块或把脱敏逻辑下沉到网关层











