跨域情况下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.