CORS过程的介绍以及跨域问题

 我来答
温屿17
2022-07-14 · TA获得超过1.2万个赞
知道小有建树答主
回答量:827
采纳率:0%
帮助的人:95.5万
展开全部

参考文章: https://mp.weixin.qq.com/s/Re1fvKKzi-rPpu6SmpqTJA

说到跨域问题,我们最常见的就是在我们向服务器发起请求的时候会遇到。比如说如下情况

假设我们正在访问 https://api.mysebsite.com 的站点,当我们点击按钮,向 https://api.mysebsite/users.com 发送请求,获取网站上的一些用户信息。这个时候从结果上是完美的。原因是,根据 同源策略 ,我们发起请求的 域名 端口 协议 均是一至的。浏览器并不会产生跨域报错。

而如果,以上提到的三点其中一点不满足的站点,再向服务器发起请求,那么这个时候就会触发跨域报错。如下图

而以上两种情况出现的原因,其实就是我们今天要介绍的内容。

首先我们先来介绍一下同源策略

浏览器网络请求的时候,有一个 同源策略 的机制,即默认情况下,使用API的Web应用程序只能从加载应用程序的同一个域请求HTTP资源。也就是我们上面提到的,必须要求域名,端口,协议都要一至。请求才能发送成功。而只要其中一点不一致,那么该请求也算是跨域的。

所以我们同样可以看得出来。同源策略会限制以下三种行为:

说了这么多其实,我们可以看出同源策略的作用其实就是为了保证用户的信息安全。打个比方,如果没有同源策略,那么当你在不小心的情况下,点击了网页的钓鱼网站。然后恶意的网站很容易就能利用重定向把你带到一个iframe 的 攻击网站,这个iframe会自动加载银行网站,并通过Cookie登录你的账号。然后操作你的DOM,进行一系列的危险操作。

而我们当然不希望这种情况发生,这个时候同源策略就起到有效的保护作用。因为它确保了我们只能访问同一站点的资源

好了,接下来要说的就是CORS了。

浏览器出于安全的考虑,会限制 从脚本内发起 的跨域HTTP请求。(注意是脚本内)例如XHR 和 Fetch 就遵循同源策略。这意味着使用 API 的Web应用程序只能从加载应用程序的同一个域请求HTTP资源。

在日常的开发中,我们很多时候都会跨域去请求别的站点的资源。而这个时候我们为了解决跨域的问题就要利用CORS机制。

CORS(Cross-Origin Resource Sharing),即 跨域资源共享 。如字面意思,CORS机制的存在就是为了让我们在保证安全的前提下,实现访问不同域下的资源,这算是放宽的政策。

浏览器可以利用CORS机制,放行一些符合规范的跨域访问,阻止不符合规范的跨域访问。下面我我们就来介绍一下浏览器内部是如何实现的。

Web程序发出跨域请求后,浏览器会 自动 向我们的HTTP header添加一个额外的字段 Origin 。 Origin 标记了请求的站点来源:

为了使浏览器允许访问跨域资源,服务器返回的 response 还需要加一些响应头字段,这些字段可以 显式 的表明此服务器是否允许跨域请求。

作为服务端人员,我们为了允许符合规则的跨域请求。我们可以通过在HTTP的响应中添加响应字段 Access-Control-* 来表明是否允许跨域请求。根据这些CORS响应头字段,浏览器可以允许一些被同源策略限制的跨域响应

虽然有好几个CORS的字段,但是有一个必须要加的字段是 Acess-Control-Allow 。这个头字段的值指定了哪些站点被允许跨域访问资源的。

现在这个字段会被添加到服务端的响应报文中,然后返回给客户端。然后这个时候客户端再向服务端发起跨域请求,同源策略将不会再限制 https://api.mywebsite.com 站点返回的资源。

报文如下:

而相反,如果对比 Access-Control-Allow-Origin 和 Origin 的值不一致的时候,浏览器会抛出一个 CORS Error的报错信息。

除了 Access-Control-Allow-Origin 字段头之外,开发人员还可以通过其他字段对请求作出限制。比如说 Access-Control-Allow-Methods 该字段用来指明跨域请求所允许的 HTTP 方法。

如上图中,只有请求方法为 GET , POST 或 PUT 方法被允许跨域访问资源。其他的HTTP方法,例如 PATCH 和 DELETE 都会产生预检。

这里就引申出一些别的内容,比如说 预检

什么是预检呢?

到这里,CORS和跨域的关系基本就说清楚了。下面我们再说一点补充

XHR 或 Fetch 与 CORS的一个有趣的特性是,我们可以基于 Cookies 和 HTTP 认证信息发送身份凭证。一般而言,对于跨域 XHR 或 Fetch 请求,浏览器 不会 发送身份凭证信息。

尽管 CORS 默认 情况下不发送身份凭证,但我们仍然可以通过添加 Access-Control-Allow-Credentials CORS响应头来更改它

如果要在跨域请求中包含 cookie 和其他授权信息,我们需要做一下操作:

做到了上面几点之后,就能在跨域请求中携带身份凭证了。

以上就是全部内容了

补充参考: http://www.goodpm.net/postreply/csharp/1010000008959813/AccessControlAllowOrigin%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE%E5%A4%9A%E4%B8%AA%E5%80%BC%E5%91%A2.html

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式