同源策略与跨域

同源策略与跨域前言 最近业务上前端同学多次联系说访问腾讯云 cos 资源的时候因为跨域的问题访问不到 大致看了下腾讯云关于设置跨域访问的教程 按照前端同学给的域名等选项就给配了 而且测试下来也是好的 但是呢一直不知道什么是跨域这里就做一个简单的学习记录 一 同源策略同源策略 SameOriginPo 是一种约定 它是浏览器最核心也是最基本的安全功能 同源策略会阻止一个域的 javascrip 脚本和另一个域的内容进行交互 是用于隔离潜在恶意文件的关键安全机制 关于这一点我们后面会举例说明

前言:最近业务上前端同学多次联系说访问腾讯云cos资源的时候因为跨域的问题访问不到。大致看了下腾讯云关于设置跨域访问的教程,按照前端同学给的域名等选项就给配了,而且测试下来也是好的。但是呢一直不知道什么是跨域这里就做一个简单的学习记录。

一、同源策略

        同源策略(Same Origin Policy)是一种约定,它是浏览器最核心也是最基本的安全功能。同源策略会阻止一个域的javascrip脚本和另一个域的内容进行交互,是用于隔离潜在恶意文件的关键安全机制;关于这一点我们后面会举例说明。如果缺少了同源策略浏览器的安全使用会受到很大的影响。可以说web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

1、同源的定义

当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。

如下表给出了相对http://www.example.com/dir/page.html的同源检测示例:

URL 结果 原因
http://www.example.com/dir2/other.html 成功 协议、域名、端口相同
http://www.example.com/dir/inner/another.html 成功 协议、域名、端口相同
https://www.example.com/secure.html 失败 协议不同 ( HTTPS )
http://www.example.com:81/dir/etc.html 失败 端口不同 ( 81 )
http://news.example.com/dir/other.html 失败 域名不同

同源策略目的就是为了保证用户信息的安全,防止恶意的网站窃取用户数据。如果网页之间不满足“同源”的要求,那么它们之间:

(1)不能共享Cookie、LocalStorage、IndexDB (2)不能获取DOM (3)AJAX请求不能发送

 

2、同源策略作用举例

        下面举一个例子说明针对接口的请求没有同源策略会怎么样?

       显然,同源策略是非常重要的。否则网站站长、广告联盟、流量统计商、xss黑客,随便哪个人都将无障碍的获取私密信息,例如各个网站的Cookie、email的邮件内容、OA页面的内容、空间里设置为隐私的照片等。

        

3、同源策略的让步

    几乎任何时候安全性和便利性都是负相关的,追求安全性的时候肯定会对便利性造成负面影响。同样,同源策略提升了web前端的安全性,但是却牺牲了web扩展上的灵活性。所以,现代浏览器在安全性可可用性之间选择了一个平衡点。即在遵循同源策略的基础上,选择性的为同源策略“开放了后门”。例如img、script、style等变迁都允许跨域引用资源,严格来说这都是不符合同源要求的。只不过这里只是引用这些资源,并不能读取到这些资源的内容。因此浏览器降低了一点点的安全性,缺大大提升了网站布置的灵活性。

二、跨域问题

        由于同源策略存在带来的问题就是跨域问题了。

1、跨域访问限制的流程

同源策略,它是由Netscape提出的一个著名的安全策略。 所有支持JavaScript 的浏览器都会使用这个策略。 所谓同源是指,域名,协议,端口相同。 当一个浏览器的两个tab页中分别打开来 百度和谷歌的页面 当浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的, 即检查是否同源,只有和百度同源的脚本才会被执行。 [1] 如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。 同源策略是浏览器的行为,是为了保护本地数据不被JavaScript代码获取回来的数据污染,因此拦截的是客户端发出的请求回来的数据接收,即请求发送了,服务器响应了,但是无法被浏览器接收。

同源策略与跨域

如上图所示,跨域访问限制的作用流程大致如下:

即,同源策略并不是浏览器不让请求发出去、或者后端拒绝返回数据。实际情况是请求正常发出去了,后端也正常相应了,只不过数据到了浏览器后浏览器不去作用加载而是丢弃了。

 

三、跨域问题的解决

1、JSONP:以后涉及到在说。

2、CORS(Cross-Origin Resource Sharing)跨域资源共享机制

        简称为跨域访问,允许 Web 应用服务器进行跨域访问控制,从而使跨域数据传输得以安全进行。CORS 需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE 浏览器要求版本 IE10 或以上。

        整个 CORS 通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS 通信与同源的 AJAX 通信没有差别,代码完全一样。浏览器一旦发现 AJAX 请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户无感知。

        因此,实现 CORS 通信的关键是服务器。只要服务器实现了 CORS 接口,即可跨源通信。

(1)CORS使用场景

        用户在使用浏览器的情况下会使用到 CORS,因为控制访问权限的是浏览器而非服务器。因此使用其它客户端的时候无需关心任何跨域问题

        对于我们遇到的问题来说,CORS 的主要应用是实现在浏览器端使用 AJAX 直接访问 COS 的数据或上传、下载数据,而无需通过用户本身的应用服务器中转。

(2)CORS原理:

我们看一眼之前跨域报错的信息:

同源策略与跨域

 浏览器判断后端有没有返回CORS头(Access-Control-Allow-Origin),发现没有就认为后端不允许跨域,即认为返回的数据不可靠。

所以只要后端能够返回浏览器需要的请求头,即可跨域(相应数据不会被同源策略抛弃)。

上面是表面原理,底层原理比较复杂。

浏览器会将ajax请求分为两类,其处理方案略有差异:简单请求、特殊请求。

简单请求

只要同时满足以下两大条件,就属于简单请求。:

(1) 请求方法是以下三种方法之一:

  • HEAD
  • GET
  • POST

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

  • Accept
  • Accept-Language
  • Content-Language
  • Last-Event-ID
  • Content-Type:只限于三个值application/x-www-form-urlencodedmultipart/form-datatext/plain

当浏览器发现发起的ajax请求是简单请求时,会在请求头中携带一个字段:Origin.

刚才说过,CORS需要客户端和服务端同时支持。上面这个小操作,算是客户端的支持行为(IE10以下不行)。

同源策略与跨域

 

Origin中会指出当前请求属于哪个域(协议+域名+端口)。服务会根据这个值决定是否允许其跨域。

如果服务器允许跨域,需要在返回的响应头中携带下面信息(算是服务端的支持):

同源策略与跨域

 

  • Access-Control-Allow-Origin:可接受的域,是一个具体域名或者*(代表任意域名)。上图CORS策略配置的允许跨域请求来源是“*”,表示全部域名都允许。
  • Access-Control-Allow-Credentials:是否允许携带cookie,默认情况下,cors不会携带cookie,除非这个值是true

有关cookie:

要想操作cookie,需要满足3个条件:

  • 服务的响应头中需要携带Access-Control-Allow-Credentials并且为true。
  • 浏览器发起ajax需要指定withCredentials 为true
  • 响应头中的Access-Control-Allow-Origin一定不能为*,必须是指定的域名

这样一来,前后端都支持跨域了,那就跨吧。

 

注意:

(1)测试截图是根据腾讯云手册的设置实例来的,这里 

(2)关于web网页的部署,参见 草稿“Linux下的web服务器搭建”。

(3)另外配置web服务器的时候要注意安全组规则的设置;另外可以通过调整COS的跨域策略对比能否成功跨域在请求和相应方面的差异。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208434.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午11:36
下一篇 2026年3月19日 上午11:36


相关推荐

  • 服务器显示连接网络连接失败是怎么回事儿,app出现网络连接失败是什么原因

    服务器显示连接网络连接失败是怎么回事儿,app出现网络连接失败是什么原因下载 APP 后使用时会提示 无法连接网络 是因为首次打开 APP 时弹出的网络使用权限没有选允许 或者没有弹出 手动设置网络权限 以某抄 APP 为例 操作步骤如下 1 打开手机 设置 的 蜂窝移动网络 如图 2 点击 使用无线 zd 局域网与蜂窝数据 选项 如图 3 点击此 APP 如图 4 打开 无线局域网与蜂窝移动数据 选项 如图 网卡故障 或者网卡驱动程序故障解决 检查网卡 重新安装网卡驱动程序 Er

    2026年3月17日
    2
  • PCB(进程控制块)讲解

    PCB(进程控制块)讲解PCB 进程控制块 实际是一个结构体 放在 sched h 文件中 Linux 下可以通过 whereissched h 命令查看具体路径该结构体主要包含 1 进程 id2 进程的状态 就绪 运行 挂起 停止 3 进程切换时需要保存和恢复的一些 CPU 寄存器寄存器放在 CUP 中 A 程序和 B 程序分时执行的时候 A 占用 CPU 执行一定时间 CPU 便被 B 占用了 然后又轮到 A 执行 A 的资源如寄存器如何恢复到挂起

    2026年3月18日
    2
  • 决策树模型入门学习

    决策树模型入门学习一 基本介绍决策树模型就是为了求出一系列规则 按照规则划分数据 得到预测结果 可以把决策树看做有决策块和终止块组成 如下图 上图图是女孩对是否与男生见面的决策过程 典型的分类树决策 相当于通过年龄 长相 收入和是否公务员对将男人分为两个类别 见和不见 假设这个女孩对男人的要求是 30 岁以下 长相中等以上并且是高收入者或中等以上收入的公务员 那么这个可以用下图表示女孩的决策逻辑 二

    2026年3月26日
    2
  • python解析json文件

    python解析json文件认识json数据json有两种数据结构:对象和数组。对象:用大括号表示,由键值对组成,每个键值对用逗号隔开。其中key必须为字符串且是双引号,value可以是多种数据类型。数组:用中括号表示,每个元素之间用逗号隔开。json中的字符串都要用双括号表示。json数据可以嵌套表示出结构更加复杂的数据。json格式与python格式的对应Python JSONd…

    2026年4月13日
    4
  • zabbix 安装 mysql_基于MySQL的zabbix安装及配置

    zabbix 安装 mysql_基于MySQL的zabbix安装及配置环境准备工作 zabbix 的安装需要 LAMP Linux Apache MySQL PHP 环境系统 Centos7 主机地址 10 0 0 10 一 关闭 SELinux 和 Firewalld1 首先查看 SELinux 状态 方法一 输入命令 usr sbin sestatus v 结果如下 方法二 直接输入命令 getenforce1 临时关闭 不用重启机器 输入命令 setenforce0

    2026年3月17日
    2
  • 【教程】2026年OpenClaw(Clawdbot)AI龙虾5分钟安装超简单流程

    【教程】2026年OpenClaw(Clawdbot)AI龙虾5分钟安装超简单流程

    2026年3月14日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号