跨域:浏览器有同源策略,但是为何 cdn 请求资源的时候不会有跨域限制?

在这里插入图片描述

提示:跨域:浏览器有同源策略,但是为何 cdn 请求资源的时候不会有跨域限制?



浏览器的 同源策略(Same-Origin Policy) 确实会限制跨域请求,但 CDN 资源请求通常不受限制,原因如下:

原因总结

1. CDN 资源的加载方式规避了同源策略

  • <script>、<link>、<img> 等标签默认允许跨域
    浏览器允许以下标签直接加载跨域资源(无需 CORS):
<!-- 这些标签不受同源策略限制 -->
<script src="https://cdn.example.com/jquery.js"></script>
<link href="https://cdn.example.com/style.css" rel="stylesheet">
<img src="https://cdn.example.com/image.png">
  • 原因:这些资源被视为静态文件,不会通过 JavaScript 直接访问内容,因此浏览器默认放行。

例外:如果通过 JavaScript 动态请求这些资源(例如 fetch 或 XMLHttpRequest),则会触发同源策略。

2. CDN 通常会正确设置 CORS 响应头

  • 即使是通过 JavaScript 动态加载的资源(如字体、API 请求),CDN 也会通过 CORS(跨域资源共享) 机制允许跨域访问:
  • CDN 服务器返回的响应头示例:
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, OPTIONS

这样浏览器会允许跨域请求。

3. 为什么同源策略不阻止 CDN 资源?

  • 历史原因:早期的网页需要引用公共库(如 jQuery),如果禁止跨域,每个网站都要自己托管这些文件,效率极低。

  • 安全权衡

     		静态资源(JS/CSS/图片)通常不会直接窃取用户数据。
    
     		真正的风险来自 通过 JavaScript 读取跨域数据(如 AJAX 请求),所以同源策略主要限制这类行为。
    

总结

场景是否受同源策略限制原因
通过<script>加载CDNJS❌ 否浏览器默认允许跨域静态资源加载
通过 fetch 请求 CDN 数据✅ 是(除非配置 CORS)需要服务器明确允许跨域(Access-Control-Allow-Origin)
CDN 的 CSS/图片❌ 否静态资源标签天生豁免同源策略
  • 核心逻辑:同源策略主要限制 通过 JavaScript 访问跨域数据,而 CDN 的静态资源加载通过标签或正确 CORS 配置规避了这一限制。
### 同源策略与 Ajax 在 Web 开发中,同源策略(Same-Origin Policy)是浏览器的一项核心安全机制。其主要目的是防止恶意网站通过脚本访问其他网站的敏感资源,从而保护用户的数据安全[^1]。 #### 同源策略的基本概念 同源策略规定,只有当两个 URL 的协议(protocol)、名(domain)和端口(port)完全相同时,才被认为是同源的。如果这三个要素中的任何一个不同,则这两个 URL 被视为不同源,浏览器将阻止客户端脚本对这些资源的访问。这种限制通常适用于通过 `XMLHttpRequest` 或 `fetch` API 发起的请求,即常见的 Ajax 请求[^1]。 #### 同源判定的三个条件 判断两个 URL 是否同源,需要满足以下三个条件: 1. **协议相同**:例如 `http://` 和 `https://` 是不同的协议,因此它们不被视为同源。 2. **名相同**:例如 `example.com` 和 `sub.example.com` 是不同的名,因此它们不被视为同源。 3. **端口相同**:例如 `:80` 和 `:8080` 是不同的端口号,因此它们不被视为同源。 #### 同源策略对 Ajax 的影响 Ajax 请求通常使用 `XMLHttpRequest` 或 `fetch` API 来发起 HTTP 请求并获取数据。由于同源策略限制,Ajax 请求无法直接访问不同源的资源。例如,如果一个网页运行在 `http://example.com` 上,它不能通过 Ajax 请求访问 `http://anotherdomain.com` 上的数据,除非目标服务器明确允许请求。 然而,某些 HTML 标签(如 `<script>`、`<img>` 和 `<iframe>`)的 `src` 属性可以加载资源,但 JavaScript 无法直接读取或操作这些资源的内容。这种设计允许网页引用外部资源(如 CDN 提供的 JavaScript 文件),同时避免了潜在的安全风险[^2]。 #### 解决问题的方案 为了绕过同源策略限制,开发者可以采用多种技术来实现请求: - **JSONP (JSON with Padding)**:利用 `<script>` 标签的能力,通过回调函数传递 JSON 数据。 - **CORS (Cross-Origin Resource Sharing)**:通过服务器设置响应头(如 `Access-Control-Allow-Origin`),允许特定来源的请求。 - **反向代理**:通过服务器端代理请求目标资源,再将结果返回给客户端,从而避免直接的问题[^5]。 #### 示例代码 以下是一个简单的 Ajax 请求示例,展示了如何使用 `fetch` API 发起 GET 请求: ```javascript fetch('https://api.example.com/data') .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Error:', error)); ``` 在这个示例中,如果 `https://api.example.com` 与当前网页的协议、名或端口不同,则该请求将受到同源策略限制,除非服务器明确允许请求
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值