by addy 原创文章,欢迎转载,但希望全文转载,注明本文地址。

本文地址:https://www.iamaddy.net/2023/09/cookie-cors-get-set/

一直对跨域共享cookie有个误区,以为只要满足了某些条件,就能让A域名的页面读取到B域名的cookie,经过一番研究,发现根本是不可能的,因为cookie遵循严格的同源策略,不管什么条件,都不能共享。

1、能跨域写Cookie吗?

前端JavaScript写cookie

document.cookie = 'check_sum=dbef7f72ab12d3f7ba7dc007b25a200a; Expires=Wed, 13 Sep 2023 23:59:24 GMT; Max-Age=28800; path=/; domain=sub1.example.com; SameSite=None; Secure'

在sub2.example.com 写sub1.example.com这个域名是无效的,因为不是同样的domain

服务端set-cookie

Cookie 能跨域读写吗?

chrome 浏览器报惊叹号

this attempt to set a cookie via a set-cookie header was blocked because it’s domain attribute was invalid with regards to the current host url

同样是不能设置成功。

所以两点结论:
1.在setcookie中省略domain参数,那么domain默认为当前域名。
2.domain参数可以设置父域名以及自身,但不能设置其它域名,包括子域名,否则cookie不起作用。

但是chrome调试器里又可以有其他域名的cookie,这是怎么回事呢?

Cookie 能跨域读写吗?

是因为mbd.baidu.com 调用了miao.baidu.com 的接口,并且miao.baidu.com接口的response 头设置了set-cookie

Cookie 能跨域读写吗?

2、能跨域获取cookie吗?

即miao.ciccwm.com的接口获取mbd.baidu.com的cookie? 答案是不能。Cookie遵循同源政策

即使是跨域请求,设置了withCredentials, cookie也只能是自身域名或者父域名的,不能是mbd.baidu.com

Cookie 能跨域读写吗?

Cookie 能跨域读写吗?

那么在mbd.baidu.com页面下调用miao.baidu.com接口能获取到miao.baidu.com自身的cookie吗?答案是可以的,但有条件。 三个条件 1、Ajax请求要设置withCredentials=true 2、Access-Control-Allow-Origin=origin 3、Access-Control-Allow-Credential=true

需要注意的是,如果要发送Cookie,Access-Control-Allow-Origin就不能设为星号,必须指定明确的、与请求网页一致的域名。同时,Cookie依然遵循同源政策,其他域名的Cookie并不会上传,且(跨源)原网页代码中的document.cookie也无法读取服务器域名下的Cookie。

设置了withCredentials=true

Cookie 能跨域读写吗?

设置withCredentials=false

Cookie 能跨域读写吗?

结论总结

Cookie 能跨域读写吗?

参考: https://www.ruanyifeng.com/blog/2016/04/cors.html

本文为原创文章,可能会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,谢谢合作

本文地址:https://www.iamaddy.net/2023/09/cookie-cors-get-set/

个人知乎,欢迎关注:https://www.zhihu.com/people/iamaddy

欢迎关注公众号【入门游戏开发】 入门游戏开发