了解 CORS 在 Web 浏览器中的工作原理

了解 cors 在 web 浏览器中的工作原理

跨源资源共享 (cors) 是 web 浏览器中的一项重要安全功能,它控制 web 应用程序如何从与提供初始网页的域不同的域请求资源(例如数据、图像或脚本) 。它的主要目的是保护用户免受试图访问其他网站上敏感信息的恶意网站的侵害。本博客将解释 cors 的工作原理以及为什么它对于 web 开发至关重要。
什么是 cors?
简单来说,cors 是一种浏览器机制,用于控制网页可以从不同域请求哪些资源。默认情况下,浏览器实施同源策略 (sop),该策略限制网页向加载页面以外的域发出请求。此策略是一项基本安全功能,可防止网站之间潜在的有害交互。

但是,在很多情况下,合法的跨源请求是必要的,例如,当 web 应用程序需要从托管在不同服务器上的 api 获取数据时。 cors 通过允许服务器指定允许哪些域访问其资源,以安全的方式启用此类请求。

cors 如何运作?
cors 的工作原理是向服务器的响应添加 http 标头,指示是否允许跨源请求。以下是 cors 运作方式的逐步细分:

客户提出请求
当网页尝试向不同来源(由域、协议和端口定义)发出请求(例如,通过 xmlhttprequest、fetch 或脚本包含)时,浏览器会检查该请求是否违反同源策略。

cors 预检请求(对于复杂请求)
某些请求,特别是那些使用 put、delete 或自定义标头等方法的请求,被认为是“复杂的”。在发送实际请求之前,浏览器会发送一个 options 请求,称为预检请求。此预检请求询问服务器是否允许实际请求并验证允许的 http 方法、标头和来源。

服务器使用 cors 标头进行响应
接收预检或实际请求的服务器发回带有特定标头的响应,指示该请求是否被允许。关键标头包括:

access-control-allow-origin:此标头指定允许哪些域访问该资源。如果此标头包含请求的来源,则浏览器允许响应。例如,服务器可能会响应:

access-control-allow-origin: https://example.com

access-control-allow-methods:此标头指定服务器允许跨源请求的 http 方法(get、post、put 等)。

access-control-allow-methods: get, post

access-control-allow-headers:指定实际请求中可以包含哪些自定义标头。

access-control-allow-headers: content-type, authorization

access-control-allow-credentials:如果服务器允许凭据(cookie、http 身份验证),则将包含此标头并设置为 true。

浏览器决定
收到服务器的响应后,浏览器评估标头。如果服务器通过适当的 cors 标头授予权限,浏览器将允许跨源请求并处理响应。如果不是,浏览器会阻止请求,网页无法访问该资源。

简单 cors 请求示例
考虑这样一个场景:https://example.com 上托管的网页尝试向 https://api.example.com/data 托管的 api 发出 get 请求。

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。如果 api 服务器配置为允许来自 https://example.com 的请求,它将使用标头进行响应:

access-control-allow-origin: https://example.com

如果标头缺失或不正确,浏览器将由于 cors 政策而阻止响应。

cors 预检示例
对于更复杂的请求,浏览器会发起预检请求,检查是否允许跨域请求。以下是触发预检的 put 请求示例:

fetch('https://api.example.com/update', {  method: 'put',  headers: {    'content-type': 'application/json'  },  body: json.stringify({ key: 'value' })});

浏览器发送如下所示的 options 请求:

options /update http/1.1origin: https://example.comaccess-control-request-method: putaccess-control-request-headers: content-type

服务器应响应标头,指示是否允许此请求:

Access-Control-Allow-Origin: https://example.comAccess-Control-Allow-Methods: PUTAccess-Control-Allow-Headers: Content-Type

如果这些标头存在且有效,浏览器将继续执行实际的 put 请求。

cors 的重要性
cors 是一项安全功能,为 web 服务器提供细粒度的机制来控制对其资源的访问。如果没有 cors,恶意网站可以在未经用户同意的情况下轻松从其他域获取敏感数据,从而导致跨站请求伪造 (csrf) 等安全漏洞。

结论
了解 cors 对于使用 api 和第三方资源的 web 开发人员至关重要。通过在服务器上配置适当的 cors 策略,开发人员可以确保其应用程序保持安全,同时仍然启用合法的跨域交互。

如果您正在开发 web 应用程序并遇到 cors 错误,则必须检查服务器的配置并确保在响应中发送必要的标头。

以上就是了解 CORS 在 Web 浏览器中的工作原理的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1491527.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 14:02:24
下一篇 2025年12月19日 14:02:42

相关推荐

  • 使用不可构造类型的 TypeScript 中的丰富编译时异常

    typescript 的类型系统很强大,但它的错误消息有时可能很神秘且难以理解。在本文中,我们将探索一种使用不可构造类型来创建清晰的、描述性的编译时异常的模式。这种方法通过使无效状态无法用有用的错误消息来表示来帮助防止运行时错误。 模式:具有自定义消息的不可构造类型 首先,我们来分解一下核心模式: …

    2025年12月19日
    000
  • npmrc——Node 的小文件

    正如标题所示,它是我们代码库中的小文件。让我们探索一下。 为什么需要它? .npmrc 文件是您为 npm 配置各种设置的位置,例如应从何处安装包、身份验证详细信息或您希望 npm 在运行命令时遵循的自定义行为。把它想象成你的浏览器设置:就像你配置浏览器的行为一样,.npmrc 配置 npm 的行为…

    2025年12月19日
    000
  • JavaScript 代码道德:编写干净、道德的代码

    在当今快节奏的开发世界中,快速交付解决方案至关重要。然而,在代码质量上偷工减料通常会导致错误、安全漏洞和不可维护的代码。代码道德在生成功能性代码和可维护、高效且安全的代码方面发挥着关键作用。让我们通过示例探讨 JavaScript 开发中的关键道德原则以及它们如何提高代码质量。 清晰胜过聪明道德原则…

    2025年12月19日
    000
  • 在用户的浏览器中本地运行 AI

    我们都知道人工智能有多么伟大,但是,仍然存在两个主要问题:数据隐私和成本。 现在所有使用人工智能的应用程序都连接到云API。这些 API 记录提示和上下文,在某些情况下,它们使用这些数据来训练模型。这意味着您在其中包含的任何敏感数据都可能会暴露。 大多数 Web 应用程序使用以下模式集成 AI 功能…

    2025年12月19日
    000
  • js如何调用硬件驱动

    在 JavaScript 中调用硬件驱动有两种方式:操作系统提供的 API(如 DirectX、IOCTL),允许 JavaScript 代码访问硬件设备。浏览器提供的 Web API(如 Web Audio API、Web MIDI API),提供特定的硬件功能访问权限。 怎样在 JavaScri…

    2025年12月19日
    000
  • 用于高效代码管理的 React 工具集

    简介 本文档概述了使用一组精选的工具和最佳实践来构建和管理 react 应用程序的综合方法。通过遵守这些准则,您可以创建可扩展、可维护且高效的应用程序。 状态管理 祖斯坦: 目的:提供一种简单且高性能的方法来管理全局应用程序状态。好处:清晰简洁的api。高效的更新和性能优化。与应用程序的其他部分轻松…

    好文分享 2025年12月19日
    000
  • 使用 AWS SES 发送电子邮件:综合指南

    aws simple email service (ses) 是一种功能强大、经济高效的解决方案,可以帮助您安全地发送电子邮件,无论是用于交易消息、营销活动还是自动通知。 在这篇博文中,我们将探讨如何使用 aws ses 发送电子邮件,涵盖各种用例,例如发送 html 模板、附件,甚至日历事件。我们…

    2025年12月19日
    000
  • 代理设计模式

    在我之前的博客中,我探索了各种处理对象创建机制的创作设计模式。现在,是时候深入研究结构设计模式,它重点关注如何组合对象和类以形成更大的结构,同时保持它们的灵活性和高效性。让我们从代理设计模式开始 javascript 中的代理设计模式 代理设计模式是一种结构设计模式,它提供一个对象代表另一个对象。它…

    2025年12月19日
    000
  • 理解 JavaScript 对象和函数中的“this”

    js 对象作用域中的 this 关键字 在 javascript 中,了解 this 关键字的内容、方式和位置可能是编写实际有效的代码和在编码时抓狂的区别。 这个关键字 在javascript中,这是一个关键字(保留字),也就是说,它不能用作变量名。 在 javascript 代码中,这用于表示范围…

    2025年12月19日
    000
  • 了解数字版权管理 (DRM):深入探讨

    数字版权管理 (DRM) 是一项关键技术,用于保护数字内容免遭未经授权的访问和分发。这篇博文将探讨 DRM 的工作原理,重点关注所涉及的机制,特别是在 Google Chrome 和 Apple Safari 等流行平台中。 什么是 DRM? DRM 是指一组限制专有硬件和受版权保护作品使用的访问控…

    2025年12月19日
    000
  • 了解 JavaScript 中的提升:综合指南

    javascript 中的提升 提升是一种行为,其中变量和函数声明在之前被移动(或“提升”)到其包含范围(全局范围或函数范围)的顶部代码被执行。这意味着您可以在代码中实际声明变量和函数之前使用它们。 变量提升 变量 用 var 声明的变量被提升到其作用域的顶部,但它们的值直到代码中发生赋值的地方才会…

    2025年12月19日
    000
  • JavaScript 命名约定:变量和函数命名指南

    javascript 中的命名约定对于编写干净、可读和可维护的代码至关重要。无论您是在处理个人项目还是与团队协作,一致且有意义的名称都可以提高代码质量、提高调试效率并减少引入错误的机会。 1。使用描述性且有意义的名称 javascript 中的名称应该清晰且具有描述性,以便其他人轻松理解代码所代表的…

    2025年12月19日
    000
  • 字符串与字符串

    细绳 小写字符串是javascript中的原始数据类型。 用这种类型创建的字符串不是对象,但 javascript 会自动用 string 对象包装它们(这称为“装箱”)。 let imastring = “hello”;console.log(typeof imastring); // “stri…

    2025年12月19日
    000
  • PL/SQL 中的关联数组

    pl/sql 中的关联数组 关联数组,也称为索引表,是一种存储键值对的 pl/sql 集合类型。它类似于其他编程语言中的字典或哈希表。关联数组非常强大,因为它们可以动态增长或收缩,并且您可以使用键(整数或字符串)访问它们的元素。 关联数组的特点: 1。动态尺寸: 与嵌套表或 varray 等其他集合…

    2025年12月19日
    000
  • AWS 用户指南

    以下是学习aws服务时推荐的学习顺序: 我。基本概念和控制台操作 1. first, understand the basic concepts of cloud computing, including iaas (infrastructure as a service), paas (platf…

    2025年12月19日
    000
  • 创建您自己的 npm 库

    介绍 react.js、three.js 等我们平时使用的优​​秀库其实都可以自己创建。我发布这篇文章是对加拿大一所大学创建图书馆课程的回顾。 先决条件 node.js 必须可用。安装 node.js 即可使用 npm。 将您自己的库发布到 npm 项目设置 首先,创建一个 npm 帐户。 npmj…

    2025年12月19日 好文分享
    000
  • JavaScript 提升解释以提高您的编码技能

    javascript 是一种经常会让新手感到困惑的语言。其中一种行为是提升,每个 javascript 开发人员都应该理解这一概念,以便编写更可预测的代码。在本文中,我们将探讨什么是提升、它如何与变量和函数配合使用,以及如何避免与之相关的陷阱。 什么是提升? 提升是指 javascript 将声明(…

    2025年12月19日
    000
  • 如何开始使用 NodeJS – 初学者手册

    Node 是一个可以在“Web 浏览器之外”运行JavaScript代码的环境。它使用 Google 的 V8 引擎将 JavaScript 代码转换为机器代码。由于 Node 在 Web 浏览器之外运行 JavaScript 代码,这意味着它无法访问仅在浏览器中可用的某些功能,例如 DOM 或窗口…

    2025年12月19日
    000
  • 如何给js加密

    对 JavaScript 加密的方法有:对称加密:使用相同的密钥加密和解密数据,适用于加密/解密大数据量。非对称加密:使用一对密钥加密和解密数据,公钥加密,私钥解密,适用于安全传输小数据量。 如何对 JavaScript 加密 JavaScript 是一种流行的编程语言,用于创建交互式网页。为了保护…

    2025年12月19日
    000
  • js方法如何加密

    JavaScript 加密方法提供了保护用户敏感数据的手段。这些方法包括:AES 加密:使用密钥对数据进行加密和解密。CryptoJS 库:提供 AES 加密和方便的 API。Web Crypto API:提供原生加密支持,更低级别的加密控制。 JS 方法加密 在 JavaScript 中,加密敏感…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信