生产单点登录反复跳认证排查
记录时间:2026-09-09
环境:生产单点登录门户(外层 nginx + K8s ingress-nginx + CAS 多副本 + TongWeb WAR 业务系统)
一、问题现象
生产环境切换业务系统时,登录态反复丢失,被踢回 /cas 认证;测试环境一切正常。
最初的排查点就错了:同事拿着 AI 认定是 j_s_id 跨应用冲突解决方案,要求全量加 proxy_cookie_path / /xxx。我按领导要求配置落地后引发其他访问无法加载,回滚;后续还坚持在 /oa、443 内网端口的两轮验证均证明这条路无效(后面我也把整个过程告诉他) —— 因为proxy_cookie_path 只能改本 location 响应里带了 Path 的 cookie,够不着 SSO 登录链路,和 ingress 配置叠加还会双重前缀。其实他们一开始就错了! 根本不是 j_s_id path 的问题。
二、排查过程
- 全站核查:21 个 ingress + 27 个 nginx sticky upstream,全在用同名亲和 cookie
route(Path=/); - 源码核实:
j_s_id是开发在代码里写死的(SSO client SDK 里setName("j_s_id")+setPath("/")),由服务端下发、前端不生成;代码不是生产/测试的差异点;这就是为什么proxy_cookie_path / /xxx不生效;因为后端本来就写死了! - 生产/测试配置对比:唯一关键差异是生产 12 个 ingress 显式配置了
session-cookie-path: /。
三、根本原因
生产 12 个 ingress 配置了 session-cookie-path: /,同域名下所有服务的亲和 cookie route 同名同路径互相覆盖。CAS 是多副本、登录票据(TGT)存在 pod 内存里,粘性失效后请求落到别的 pod 就找不到 TGT,判定未登录,反复跳认证。
这样配置的初衷:这些 WAR 都是旧服务,多副本部署是为了解决 js/css 静态资源跨 pod 无法请求的问题,所以把亲和 cookie 路径设成 /,让所有请求都粘在同一个 pod 上。初衷没问题,但同域名下 12 个服务的 route 互相覆盖,把 CAS 的粘性也一起覆盖掉了。
测试环境没配这个注解(单副本),亲和 cookie 按各自 ingress 路径天然隔离,所以测试环境没问题,生产存在异常。
(j_s_id 跨应用覆盖只是伴随的次问题,TGC 还在就能静默换票恢复,不是主因。)
四、解决办法
- 删除生产 12 个 ingress 的
session-cookie-path: /(对齐测试环境),已上线生效; - 此前批量加的
proxy_cookie_path全部撤离; - TGC cookie 保持不动(全局令牌必须跨路径下发)。
五、验证
生产实测:清 cookie 登录后切换多个业务系统,不再跳认证;route 按各自 ingress 路径隔离(如 Path=/wmyc)。
六、注意事项
proxy_cookie_path管不到 SSO 登录链路下发的 cookie,与 ingress 配置叠加还会双重前缀,不要用来做 cookie 隔离;- 同域名下多套系统共用亲和 cookie 名时,名字或路径必须错开;
- sticky 模块默认
route+Path=/,查同域 cookie 覆盖时别漏这一层。
七、参考资料
- Nginx 文档:proxy_cookie_path、nginx-sticky-module-ng 默认参数(name=route、path=/)