Cookie 能跨域读写吗?
by addy 原创文章,欢迎转载,但希望全文转载,注明本文地址。
一直对跨域共享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
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,这是怎么回事呢?
是因为mbd.baidu.com 调用了miao.baidu.com 的接口,并且miao.baidu.com接口的response 头设置了set-cookie
2、能跨域获取cookie吗?
即miao.ciccwm.com的接口获取mbd.baidu.com的cookie? 答案是不能。Cookie遵循同源政策
即使是跨域请求,设置了withCredentials, cookie也只能是自身域名或者父域名的,不能是mbd.baidu.com
那么在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
设置withCredentials=false
结论总结
参考: https://www.ruanyifeng.com/blog/2016/04/cors.html
本文为原创文章,可能会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,谢谢合作
个人知乎,欢迎关注:https://www.zhihu.com/people/iamaddy
欢迎关注公众号【入门游戏开发】
近期评论