背景:
使用oauth2.0单点登陆进去不同服务器的同一系统。
同一浏览器存储的COOKIE名称,COOKIE PATH COOKIE DOMAIN一致,会认为是同一个COOKIE
当单点登陆进去c1平台后,前端浏览器会存入一个cookie,而后当单点登陆进入c2平台后,因为COOKIE信息一致,会导致覆盖前面的COOKIE信息,导致前面C1系统登出。
cookie覆盖的条件:
相同的Cookie名称:如果多次设置具有相同名称的Cookie,后一个Cookie将覆盖前一个Cookie。
相同的路径:如果Cookie的名称相同,但路径不同,它们不会互相覆盖。每个Cookie的路径属性定义了它的有效路径范围。例如,如果一个Cookie的路径为/app1,另一个的路径为/app2,它们不会互相覆盖,因为它们在不同的路径下。
相同的域:如果Cookie的名称和路径都相同,但域名不同,它们也不会互相覆盖。每个Cookie的域属性定义了它的有效域。例如,如果一个Cookie的域为example.com,另一个的域为sub.example.com,它们不会互相覆盖,因为它们在不同的域下。
相同的安全属性:如果Cookie的名称、路径和域名都相同,但安全属性不同,它们也可能不会互相覆盖。具有安全属性的Cookie只会与安全的HTTPS连接一起发送,而没有安全属性的Cookie会在HTTP和HTTPS连接中都发送。
解决办法
了解原因后,有如下方案
1 springboot 项目中application.yml
配置cookiename cookie path,确定cookie唯一,不会被覆盖,但是如果module过多,需要修改的文件也比较多
2 配置nginx
配置 #proxy_cookie_path / /test;
可以将不同服务器的nginx上下文配置不一样,通过cookie path确保cookie不会被覆盖,改起来比较简单。