目录
- 跨域概念
- 为何限制跨域?
- 如何安全跨域?(如何实现跨域主要参考这里)
- 如何实现cookie跨域共享?
- cookie的概念
- cookie的特性
- 跨多域共享cookie( a.com和b.com共享 )
跨域概念
在域a下通过 ajax 的方式访问域b下的资源。
域相同满足的条件:域名相同(子域名不同视为不同),端口号相同
为何限制跨域?
请了解跨站脚本攻击(XSS)
如何安全跨域?(如何实现跨域主要参考这里)
在XMLHttpRequest v2标准下,提出了CORS(Cross Origin Resourse-Sharing)的模型,试图提供安全方便的跨域读写资源。目前主流浏览器均支持CORS。(IE10+)
详细参见:http://www.ruanyifeng.com/blog/2016/04/cors.html
如何实现cookie跨域共享?
cookie的概念
由于http请求的无状态,需要在每次交互时通过cookie传递服务器在浏览器中存放的用户信息进而标识用户。
cookie的特性
- 由服务器端设置
- 包含key,value,domain,path,expireTime等信息(domain,path指定了在访问哪些域的哪些路径下会携带cookie信息)
- 服务器端设置cookie时,domain只可以指定自身或者父域,比如sub.a.com只可以指定domain为:sub.a.com或者a.com,而不可以指定sub1.a.com或者subchild.sub.a.com
- 在显示指定了cookie域时,访问自身域或者子域时,都会携带cookie,所以,很容易实现当前域及子域的cookie共享。
跨多域共享cookie( a.com和b.com共享 )
方式1:通过隐藏iframe的方式
step1. 用户在a.com登录,登录成功后设置cookie
step2. 登录成功后,浏览器端通过脚本动态生成iframe,通过iframe请求a.com/setCookie
step3. a.com发出重定向请求(http://b.com?cookie1=1&cookie2=2)
step4. b.com接受到上面的请求,并设置b.com下的cookie写回浏览器
step5. 完成
方式2:通过setCookie的方式
step1. 用户在a.com登录,登录成功后设置cookie
step2. 登录成功后,通过脚本读取a.com下的cookie,然后通过ajax跨域请求http://b.com?cookie1=1&cookie2=2
step3. b.com接受到上面的请求,并设置b.com下的cookie写回浏览器
step4. 完成
方式2相较于方式1,存在无法访问httponly类型的cookie的问题。
通过共享了cookie的方式,在访问b.com时,会携带对应域下的cookie信息,从而达到共享的目的。
第二种方式需要服务器端配置跨域(并且开启允许跨域发送cookie)。