同源策略

平时大家提到的跨域问题存在的原因是浏览器的同源策略限制

简言之,跨域是因为浏览器为了安全问题产生的拦截,非浏览器环境就不存在跨域问题,

如直接从服务端nodeJS向另一个服务器发起请求,就不会出现跨域问题。

同源策略是浏览器的安全策略,不是HTTP协议的一部分。

什么是同源策略呢?

同源策略是浏览器的安全策略。是一种约定,是浏览器最核心最基本的安全功能。

如果没有同源策略,浏览器很容易收到XSS,CSRF攻击。

什么是同源呢?

同源指“协议+域名(主机)+端口”三者相同。任一不同,都属于非同源。即使不同域名对应同一IP地址也非同源。

如: localhost 和 127.0.0.1属于非同源。

注意:

跨域请求只支持以下协议:http, data, chrome, chrome-extension, https.

不支持:file协议

示例:  

// script type="module"默认开启cors安全请求模式

/*****index.html 本地文 ****/
// index.html文件的位置 file:///Users/lyralee/Desktop/reactInit/index.html
<script type="module" src="./index.js" />
或者
<script type="module">
   import xxx from './index.js';
</script>

// 运行结果报错:Access to script at 'file:///Users/lyralee/Desktop/reactInit/index.js' from origin 'null' has been blocked by CORS policy:
Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.

上面index.html和index.js其实协议之类都相同,但是因为开启了type="module",则请求头自动默认

Sec-Fetch-Mode: cors

而cors不支持file协议,所以报错。

如果没有type="module", 即<script src="index.js"></script>。系统默认请求头是:

Sec-Fetch-Mode: no-cors

所以普通script标签,不存在跨域问题。

同源策略作用是什么?

保证用户信息安全,防止恶意网站窃取数据。

对于前端开发来说,最主要的限制是:

1) 当非同源时,ajax跨域请求可以发送,但是拒绝接受响应。

  但是通过document.cookie可以获取到cookie的值。(同主机的情况下)

   如果使用form表单请求,则不存在上面的问题。因为form表单提交不存在跨域问题。

      

2)无法读取非同源的DOM。

const iframe = document.querySelector('iframe');// src指向非同源
iframe.contentWindow.document;//无法读取DOM,也无法读取iframe.contentWindow
// 但是可以读取窗口的9个属性和四个方法
1)属性
window.window
window.self
window.top
window.parent
window.opener
window.location
window.length
window.closed
window.frames
2)方法
window.close();
window.blur();
window.focus();
window.postMessage();

3)无法读取非同源的Cookie,localStorage,indexedDB。

A,B页面不同源,那么在A页面读取不到B页面的存储信息;反之亦然

 

posted @ 2019-06-18 20:18  Lyra李  阅读(766)  评论(0编辑  收藏  举报