Web的同源策略探析

86 阅读3分钟

写在前面

最近一个小项目验收的时候,被问到是否了解Web的同源策略如何解决跨资源共享的问题,结果草草回答。近日搜寻了一些资料,感觉有些说的并不透彻,希望可以记录自己的一些理解,同时可以帮助到需要的人。同时,笔者技术知识较为浅薄,发现不合理的地方请多多指正。

Web为什么会有同源策略?

任何一项技术或策略都不是为了作秀,而是为了解决现实的某种问题而出现的。Web的同源策略也不例外。如果没有同源策略,那么所有互联网中的资源都是开放的,个人就可以任意地访问其他人的银行账号和密码,此时安全和隐私将不复存在。为了在现实中避免这种情况,前辈们设计了Web的同源策略。

Web如何具体执行同源策略?

以在浏览器上浏览博客为例。

  1. 当我们打开浏览器,想要获取信息时,浏览器会根据输入的统一资源定位符(URL),向对应的服务器请求对应的html、javascript等文件。

  2. 对应的服务器接收到请求后,通过一系列操作后,返回所需要的文件。

  3. 浏览器接收到文件后,会验证返回文件的服务器的域名是否与刚才输入的URL的域名同域。这一次,域名当然相同。于是,浏览器开始加载相关文件,开始渲染。

  4. 在加载文件的过程中,浏览器发现有些程序语句又在请求资源,而且这次请求的资源放在其他人的服务器上。浏览器会顺从地按照所写的语句向其他人的服务器发送请求

  5. 其他人的服务器接收到请求后,经过一系列操作后,也会返回相应的资源文件。

  6. 浏览器接收到返回的资源文件后,会首先检查返回文件的服务器的域名是否与输入的URL的域名同域。显然,这一次的域名并不相同。于是,浏览器会拒绝加载所返回的资源,用户也得不到相对应的资源。

在上面的例子中,浏览器检查返回文件的服务器的域名是否与输入的URL的域名同域,除非同源,否则拒绝加载相关资源。在这个过程中实施的策略,我们称之为同源策略

如何用CORES的方式来实现跨域资源共享?

很明显,同源策略虽然可以保证资源的安全性,但是使访问不同域名的资源变得异常麻烦。很多的前辈给出了不同的解决方法。比如把imag、video等常用但不需要保证安全性的资源直接取消同源策略。

其他的,常用的有采用CORES来解决。这里主要讲一下核心思路,主要是在服务器里的资源上设置一个白名单(列举哪些域名可以访问这些资源),返回资源时连带这个白名单一起返回。浏览器检查是否同域时,如果发现不同域,可以查看当前域名是否在返回的白名单上,除非不是,否则就允许加载这些返回的资源。