一、浏览器的“同源策略”
1、同源三要素
协议、域名、端口
三者只要用一个不同,即不满足同源。
(1)http\https的互相访问限制
在https(安全)的域名所在页面中访问http(不安全)的资源,会受限。
二、cookie的作用域
1、协议、域名、path
学过Java的同学都应该知道想往response里设置cookie之前会设置一些属性。这些属性包括domain(域)、security(协议)、path、version、age等等,这里可以和“同源策略”对应起来。
2、cookie的作用域与“同源策略”
接着第一点的说,cookie的作用域与“同源策略”三要素基本是对应关系。但是,但是,但是!我看有很多网站说不满足“同源策略”时,cookie是获取不到的。这里有一个例外,就是端口号。我在本地实验的结果告诉我,同协议、同域名、不同端口之间,既可以获取互相的cookie,也可以互相种cookie。为什么?学过Java的同学们,你们想想,什么时候见过设置cookie属性的时候,还要设置端口号的...
3、经验之谈
(1)不同域名之间是无法跨域种cookie的。eg:在页面上发起一个请求,这个请求域名是aaa.lenovo.com.cn,但是我在response里设置domain为bbb.lenovo.com的cookie,请求完成后,去bbb.lenovo.com.cn的页面上查看,并不会有我刚刚设置的cookie。
(2)子父域问题
lenovo.com.cn是aaa.lenovo.com.cn的父域。子域可以获取到父域的cookie,反之则不行。所以我们在种全站cookie的时候(比如登录状态),都会种到全站域名的父域上,这样全站可以共享登录状态。当然这里说的全站域名都是一个父域的情况。
(3)跨域种cookie问题
既然第一点已经说到,无法跨域种cookie,但是我们就是想给bbb.lenovo.com种cookie,这时候可以申请个reg.bbb.lenovo.com的域名,在response里设置cookie的domain为bbb.lenovo.com不就行了。当然,会有人说,为什么不设置domain为lenovo.com呢?这也是可以的。但是我们在设置cookie作用域时,出于安全角度考虑,尽量将cookie作用域设置的越小越好。
(4)Safari
还记得当年苹果公司拒绝配合FBI调查用户信息,这也就是说苹果对于个人信息的保密程度相当之高,但这也给我们跨域种cookie带来困扰。
在高版本Safari浏览器下,会存在这样的问题:
我在aaa.lenovo.com.cn的页面上发起一个bbb.lenovo.com的跨域请求,希望这个请求的response里能够设置domain为lenovo.com的cookie,这在其他浏览器上是被允许的,但是Safari会跟你说:NO!我认为,Safari的判断中,还会加上种cookie请求所在页面的域名。即,页面域名+请求域名+cookie的domain这三者必须同源...这近似苛刻的条件会使跨域种cookie变得异常困难。所以,在Safari中,利用跨域种cookie实现的功能只能换一种方案了。(可以参考taobao.com与tmall.com如何实现SSO,具体我也还在研究中)
目前发现IOS12版本的机型中,refer与跳转页面的根域不同时,cookie无法带上的问题。
当然除了Safari,在华为、小米的最新版型号手机自带浏览器中也出现了诸如此类的问题。安全无小事,这样的设定可能是为了最大限度保护用户的隐私,这样一想,也未必是一件坏事。
(5)tomcat
what?tomcat?跟它有啥关系?对的,你没看错。tomcat8.5版本之前,在设置cookie的domain属性时,你可以在域名前面加个点(eg:.lenovo.com.cn),表示这个cookie要种在父域上。但是tomcat8.5之后,你猫会给你返回一个大大的500报错。原因是你猫会认为你的domain是个非法参数,所以,你代码里之前有设置cookie,在domain前面加过点的,请谨慎升级tomcat到8.5....
三、跨域请求(Ajax)
1、不满足“同源策略”的请求是不允许使用ajax调用的。
2、跨域请求的方式,接触最多的方式的思想应该是将动态请求变成静态资源请求。
jsonp\new img()\iframe等等,可以自行百度。
以上为自己的工作之中的思考与总结,如有错误,请斧正,多谢!