sameSite
当页面访问出现跨站访问的时候,是否需要携带 cookie
| 页面域 | 请求域 | 是否同站 |
|---|---|---|
| a.foo.com | b.foo.com | ✔️ |
| foo.com | b.foo.com | ✔️ |
| a.foo.com | a.bar.com | ❌ |
| a.foo.com | b.foo.com.cn | ❌ |
| sameSite 取值 | 解释 |
|---|---|
| None | 允许跨站发送Cookie,适用于需要在跨域请求中携带Cookie的情况,需要同时配合Secure属性,即Cookie只能在Https中发送 |
| Lax | 阻止发送 Cookie,但对超链接放行【默认值】 |
| Strict | 阻止发送 Cookie |
跨域Cookie共享
这里要讨论的是跨域中Cookie的存储问题:默认情况下,浏览器是不会去为你保存下跨域请求响应的Cookie的。具体现象是:跨域请求的Response响应了即使有Set-Cookie响应头( 且有值),浏览器收到后也是不会保存此cookie的。
要实现Cookie的跨域共享,有3个关键点:
- 服务端负责在响应中将Set-Cookie发出来(由Access-Control-Allow-Credentials响应头决定)
- 浏览器端只要响应里有Set-Cookie头,就将此Cookie存储(由异步对象的withCredentials属性决定)
- 浏览器端发现只要有Cookie,即使是跨域请求也将其带着(由异步对象的withCredentials属性决定)
总结
服务端的 Access-Control-Allow-Credentials: true,浏览器端 withCredentials 也为 true(相同 domain)
set-cookie
当服务器地址为 a.com 的时候,domain 只能为 a.com 的子域或本身,不能为 b.com 如果设置了 sameSite,那么就必须要包含 Secure(仅当 https 的时候才允许携带本 cookie) 属性

