跨域情况下SameSite属性对Cookie的作用
前提假设
- 假设前端页面的运行地址为 http://localhost:8848/demo-cors/index.html,后端接口的运行地址为 http://127.0.0.1:10071/domain-one/method-a。注意,对
cookie 来说, domain=127.0.0.1 和 domain=localhost 是不同的,可以认为是两个域名。
响应的情况
- 后端设置cookie时如果没有显式的指定
domain 和 path ,那么默认是后端项目的上下文地址,例如,对于 http://127.0.0.1:10071/domain-one/method-a 来说就是 domain=127.0.0.1 , path=/domain-one 。当这种cookie返回给前端时,前端是能接收到的,但是在开发者工具中的application.cookies中并不能查看到该cookie,注意,这不是因为 127.0.0.1 和 localhost 域名不同导致的没有显示,而是浏览器没有将该 cookie 进行保存。 - 在
cookie 没有设置 SameSite 属性的情况下,浏览器默认会把该属性设置为 Lax 。如果要改变上面提到的默认行为,让浏览器能够保存第三方的 cookie ,我们需要在设置 cookie 时显式的将 SameSite 属性设置为None ,并将Secure 属性设置为true 。 - 对什么是第三方cookie解释一下,例如,前端运行的地址是 http://192.168.0.199:8848/demo-cors/index.html,而
cookie 的domain=192.168.0.100 ,那么对于该网站地址来说,这个cookie 就是第三方cookie ,反过来说,这个网站地址对于这个cookie 来说就是第三方网站。
请求的情况
- 当第三方网站对cookie的来源站发起请求时,
SameSite=None 的cookie 能够被携带并发送出去,SameSite=Lax 和SameSite=Strict 有其各自的规则,所以在跨域情况下并且对cookie 有操作时,建议把cookie 的SameSite 设置为None ,注意SameSite 设置为None 的同时一定要把Secure 属性设置为true 。
SpringBoot中如何设置SameSite属性
ResponseCookie rc = ResponseCookie.from("hjf", "jinf")
.secure(true)
.sameSite("None")
.build();
response.setHeader(HttpHeaders.SET_COOKIE,rc.toString());
参考: SameSite cookies.
|