什么是浏览器的同源策略?以及跨域的解决方法
我们可能会问,浏览器为什么会设置同源策略这个东西? 说起同源策略,最早要追溯到:NetScape,那么可能又有人要问NetScape是个什么东西?
所谓NetScape是指美国网景通信公司,他的英文全称是:Netscape Communications Corporation ,这个公司因为他的同名网页浏览器Netscape Navigator而闻名。
同源策略是由NetScape提出的一个著名的安全策略。所谓的同源,指的是协议,域名,端口号相同,同源策略的目的为了保证用户信息的安全,防止恶意的网站窃取数据,
只允许本域名下的接口之间的交互。只要协议,域名,端口、其中一个不同,就会导致跨域出现。一般出现以下报错提示,就是跨域了。
No 'Access-Control-Allow-Origin' header is present on the requested resource.
为什么会有这种限制呢?那么我们来举个例子。
比如: 某网站是一家银行的官网,当用户登陆该网站办理完业务后,用户又去其他网站浏览。如果此时没有同源策略的限制,那么其他网站也可以访问该银行官网,那么这样其他网站也就能读取该银行官网的cookie信息,很显然这样就会存在很大的完全隐患,加入银行官网的cookie中包含客户的隐私和保留的登陆账户和密码,那么一些不法分子就可能会盗取客户隐私做一些不法之事,对用户而言,也就是一个很大的威胁。
所以NetScape在最初就对浏览器的安全方面有所考虑,使用同源策略这个安全措施,一旦不同源,那么浏览器就会自动拦截访问,也就是平常所说的跨域问题。
说到同源肯定要分别解释协议,域名,端口这三个东西。
协议:
常见的有两种协议:http 和 https 协议
例如:http://www.xxx.com/ 这里使用的就是http协议, 而https://www.xxx.com/使用的就是https 协议。
两者区别:HTTP协议是一种使用明文数据传输的网络协议,所以存在安全隐患。而HTTPS协议可以理解为HTTP协议的升级,就是在HTTP的基础上增加了数据密。
所以相对于http而言,https 相对更安全,所以现在大多数网站都在使用https协议。
域名:
例如:http://www.xxx.com/ 这里www.xxx.com就是他的域名
端口号:
http默认端口为 80
https默认端口为 443
当采用默认端口的时候端口号可以省略不写
现在对跨域的解决方法大概有以下几种:
1、 通过jsonp跨域
2、 document.domain + iframe跨域
3、 location.hash + iframe
4、 window.name + iframe跨域
5、 postMessage跨域
6、 跨域资源共享(CORS)
7、 nginx代理跨域
8、 nodejs中间件代理跨域
9、 WebSocket协议跨域