• 浏览器原理 - 同源策略和跨域


    1. 同源策略

    跨域问题其实就是浏览器的同源策略造成的。

    同源策略限制了从同一个源加载的文档或脚本如何与另一个源的资源进行交互。这是浏览器的一个用于隔离潜在恶意文件的重要的安全机制。同源指的是:协议端口号域名必须一致。

    下表给出了与 URL [http://store.company.com/dir/page.html](http://store.company.com/dir/page.html) 的源进行对比的示例:

    URL 是否跨域 原因
    store.company.com/dir/page.ht… 同源 完全相同
    store.company.com/dir/inner/a… 同源 只有路径不同
    store.company.com/secure.html 跨域 协议不同
    store.company.com:81/dir/etc.htm… 跨域 端口不同 ( http:// 默认端口是80)
    news.company.com/dir/other.h… 跨域 主机不同

    同源策略:protocol(协议)、domain(域名)、port(端口)三者必须一致。**同源政策主要限制了三个方面:

    • 当前域下的 js 脚本不能够访问其他域下的 cookie、localStorage 和 indexDB。
    • 当前域下的 js 脚本不能够操作访问操作其他域下的 DOM。
    • 当前域下 ajax 无法发送跨域请求。

    同源政策的目的主要是为了保证用户的信息安全,它只是对 js 脚本的一种限制,并不是对浏览器的限制,对于一般的 img、或者script 脚本请求都不会有跨域的限制,这是因为这些操作都不会通过响应结果来进行可能出现安全问题的操作。

    2. 如何解决跨越问题

    (1)CORS

    下面是MDN对于CORS的定义:

    跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个 origin (domain)上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域HTTP 请求。

    CORS需要浏览器和服务器同时支持,整个CORS过程都是浏览器完成的,无需用户参与。因此实现CORS的关键就是服务器,只要服务器实现了CORS请求,就可以跨源通信了。

    浏览器将CORS分为简单请求非简单请求

    简单请求不会触发CORS预检请求。若该请求满足以下两个条件,就可以看作是简单请求:1)请求方法是以下三种方法之一:

    • HEAD
    • GET
    • POST

    2)HTTP的头信息不超出以下几种字段:

    • Accept
    • Accept-Language
    • Content-Language
    • Last-Event-ID
    • Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

    若不满足以上条件,就属于非简单请求了。

    **(1)简单请求过程:**对于简单请求,浏览器会直接发出CORS请求,它会在请求的头信息中增加一个Orign字段,该字段用来说明本次请求来自哪个源(协议+端口+域名),服务器会根据这个值来决定是否同意这次请求。如果Orign指定的域名在许可范围之内,服务器返回的响应就会多出以下信息头:

    Access-Control-Allow-Origin: http://api.bob.com// 和Orign一直
    Access-Control-Allow-Credentials: true // 表示是否允许发送Cookie
    Access-Control-Expose-Headers: FooBar // 指定返回其他字段的值
    Content-Type: text/html; charset=utf-8 // 表示文档类型 
    
    • 1
    • 2
    • 3
    • 4

    如果Orign指定的域名不在许可范围之内,服务器会返回一个正常的HTTP回应,浏览器发现没有上面的Access-Control-Allow-Origin头部信息,就知道出错了。这个错误无法通过状态码识别,因为返回的状态码可能是200。

    在简单请求中,在服务器内,至少需要设置字段:Access-Control-Allow-Origin

    (2)非简单请求过程非简单请求是对服务器有特殊要求的请求,比如请求方法为DEL

  • 相关阅读:
    手把手教你如何编写一个Makefile文件
    Vue3+elementplus搭建通用管理系统实例十:动态表单及详情页实现上
    Python网络爬虫的实践与应用
    win系统安装sql server报错,已经安装了Visual C++ 2017 Redistributable,也是以系统管理员身份运行
    Android 运营商与APN配置简介
    学习笔记-Speed-Linux
    气膜建筑在施工工期方面的优势
    Shell
    每日一博 - 反向代理、API 网关、负载均衡
    【面试题】Vue的this.$nextTick方法,异步更新dom详解
  • 原文地址:https://blog.csdn.net/weixin_53312997/article/details/127774619