绝对自由的web应用
- web应用可以访问互联网各处的内容。正因如此,自身没有特定资源的终端可以访问到别的主机上的HTML文档、图片、视频等等。
- 如果给web应用绝对自由呢?会引发其他的弊端,比如电脑上同时打开了多个网站,A网站可以获取B网站中的用户信息,B网站可改变C网站的页面元素......可怕的场景:用户网购信息被泄漏、银行账户信息被泄露、导航页面指向被更改......
- 所以,浏览器需要安全策略限制网站的权限,常见的基础的就是同源策略。
同源策略
同源
当两个URL使用的HTTP协议、域名和端口都相同,称两个URL同源。如:
http://39.107.123.245/miaomiao/movie/nowPlaying和http://39.107.123.245/miaomiao/cinema。
同源策略下的表现
- 限制不同源JS脚本对当前页面DOM对象的读写。
- 限制不同源站点读取当前页面的Cookie、indexDB、localStorage等等。
- 限制通过XMLHttpRequest、fetch等方式将资源发送给不同源站点(日常)。
同源策略中的“后门”
以上同源策略的表现过于死板,影响了web应用的灵魂。更可行的方案,在安全上开口子,带来更高的灵活性,主要有以下三点。
允许加载非同源站点资源
- 可在当前站点嵌入非同源站点资源,比如其他源的JS、CSS文件。
- 同时出具内容安全策略(CSP),由服务端决定站点可嵌入哪些资源、是否执行内嵌JS代码。
跨域资源共享(CORS)
此策略可使页面可在安全范围内进行跨域访问控制。简单而言,可使XMLHttpRequest和fetch更加自由。
跨文档消息机制
此策略可与不同源的DOM通信,通过 window.postMessage 的 JavaScript 接口。