背景:
使用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不会被覆盖,改起来比较简单。
坑
上文配置的nginx【 proxy_cookie_path / /user】表示将请求的cookie path都由默认的 / 挂载在 /user目录下,
细说cookie
cookie的属性
NAME=VALUE 赋予 Cookie 的名称和其值(必需项)
expires=DATE Cookie 的有效期(若不明确指定则默认为浏览器关闭前为止)
path=PATH 将服务器上的文件目录作为Cookie的适用对象(若不指定则默认为文档所在的文件目录)
domain=域名 作为 Cookie 适用对象的域名 (若不指定则默认为创建 Cookie的服务器的域名)
Secure 仅在 HTTPS 安全通信时才会发送 Cookie
HttpOnly 加以限制, 使 Cookie 不能被 JavaScript 脚本访问
如下图为cookie的样例,表示该cookie value存储在192.168.3.82:/user 目录下,如果当浏览器中的cookie只有一个,且cookie path = /user; 192.168.3.82:/test就会拿不到cookie,那么请求的时候不携带cookie,后端服务器认为该请求为第一次访问,后端向前端发起Set-Cookie操作,前端浏览器会在覆盖之前的cookie
仅此记录!