同源策略和跨域解决
2020-04-30 本文已影响0人
caoxingyu
同源策略
1、定义
所谓"同源"指的是"三个相同"
- 协议相同
- 域名相同
- 端口相同
举例来说,http://www.example.com/dir/page.html这个网址,协议是http,域名是www.example.com,端口是80(默认端口可以省略)。它的同源情况如下: - http://www.example.com/dir2/other.html 同源
- http://example.com/dir/other.html 不同源(域名不同)
- http://v2.www.example.com/dir/other.html 不同源(域名不同)
- http://www.example.com:81/dir/other.html 不同源(端口不同)
2、目的
同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。
设想这样一种情况:A网站是一家银行,用户登录以后,又去浏览其他网站。如果其他网站可以读取A网站的 Cookie,会发生什么?
很显然,如果 Cookie 包含隐私(比如存款总额),这些信息就会泄漏。更可怕的是,Cookie 往往用来保存用户的登录状态,如果用户没有退出登录,其他网站就可以冒充用户,为所欲为。因为浏览器同时还规定,提交表单不受同源政策的限制。
由此可见,"同源政策"是必需的,否则 Cookie 可以共享,互联网就毫无安全可言了。
3、限制范围
随着互联网的发展,"同源政策"越来越严格。目前,如果非同源,共有三种行为受到限制。
- Cookie、LocalStorage 和 IndexDB 无法读取。
- DOM 无法获得。
- AJAX 请求不能发送。
下面重点介绍解决AJAX 请求不能发送的方法
- 服务器代理(浏览器请求同源服务器,再由后者请求外部服务,比如常用的nginx代理)
- JSONP
JSONP是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,老式浏览器全部支持,服务器改造非常小。
它的原理是html中的src和href属性不受同源策略限制。它的基本思想是,网页通过添加一个<;script>元素,向服务器请求JSON数据,这种做法不受同源政策限制;服务器收到请求后,将数据放在一个指定名字的回调函数里传回来。JSONP只能发GET请求。 - cors
CORS是跨域资源分享(Cross-Origin Resource Sharing)的缩写。它是W3C标准,是跨域AJAX请求的根本解决方法。相比JSONP只能发GET请求,CORS允许任何类型的请求。
详情参考阮一峰的博客