服务端配置 CORS(跨域资源共享)的原理本质是 浏览器与服务器之间的安全协商机制。其核心在于服务器通过特定的 HTTP 响应头声明允许哪些外部源(Origin)访问资源,浏览器根据这些响应头决定是否放行跨域请求。以下是详细原理分解:


一、核心流程:浏览器与服务端的协作机制

场景:网页 https://web.com 请求 https://api.com/data
  1. 浏览器发起跨域请求

    • 自动在请求头中添加 Origin: https://web.com(表明请求来源)。
  2. 服务端响应

    • 检查 Origin 值是否在允许列表中。
    • 若允许,则在响应头中添加 CORS 相关字段(如 Access-Control-Allow-Origin: https://web.com)。
    • 若拒绝,不添加 CORS 头或返回错误(浏览器会拦截响应)。
  3. 浏览器验证响应头

    • 检查响应头是否包含 Access-Control-Allow-Origin 且值与当前 Origin 匹配(或为 *)。
    • 验证通过 → 解除拦截,网页可读取响应数据。
    • 验证失败 → 抛出 CORS 错误(如 No 'Access-Control-Allow-Origin' header)。

二、关键 HTTP 响应头字段解析

服务器通过以下头字段声明跨域规则:

响应头字段作用示例
Access-Control-Allow-Origin必选,声明允许访问的源(域名)https://web.com*
Access-Control-Allow-Methods声明允许的 HTTP 方法(如 GET、POST)GET, POST, PUT
Access-Control-Allow-Headers声明允许客户端携带的请求头(如 Content-TypeContent-Type, Authorization
Access-Control-Allow-Credentials是否允许发送 Cookie 等凭证(需客户端设置 withCredentials: truetrue
Access-Control-Max-Age预检请求(OPTIONS)的缓存时间(秒),减少重复预检86400(24小时)

⚠️ 注意:若请求需携带 Cookie(凭证),则:

  • 服务端必须设置 Access-Control-Allow-Credentials: true
  • 服务端Access-Control-Allow-Origin 不能为 *,必须明确指定域名(如 https://web.com
  • 客户端需设置 withCredentials: true(如 Fetch API 或 Axios)。

三、预检请求(Preflight Request):复杂请求的二次确认

当请求满足以下任一条件时,浏览器会先发送 OPTIONS 预检请求(非简单请求):

  1. 使用了 PUTDELETE非简单方法(简单方法仅限 GETPOSTHEAD)。
  2. 携带了自定义请求头(如 Authorization)。
  3. Content-Typeapplication/json非简单类型(简单类型仅限 application/x-www-form-urlencodedmultipart/form-datatext/plain)。
预检请求工作流程:
BrowserServerOPTIONS 预检请求携带:Origin: https://web.comAccess-Control-Request-Method: PUTAccess-Control-Request-Headers: Content-Type响应预检结果返回:Access-Control-Allow-Origin: https://web.comAccess-Control-Allow-Methods: PUTAccess-Control-Allow-Headers: Content-Type发送真实请求(PUT)返回真实数据BrowserServer

四、CORS 的安全本质:服务端控制权限

  1. 主动权在服务端

    • 浏览器只是执行者,实际放行权由服务端通过响应头控制
    • 若服务器未返回正确的 CORS 头,即使接口本身能正常响应(如用 Postman 测试成功),浏览器仍会拦截。
  2. 防御恶意网站

    • 假设用户访问了恶意网站 evil.com,该网站尝试请求 bank.com 的 API:
      • bank.com 的服务器检测到 Origin: evil.com 不在白名单中 → 不返回 CORS 头
      • 浏览器拦截响应 → evil.com 无法读取 bank.com 的数据。

五、配置示例:Node.js 中的 CORS 中间件

const express = require('express');
const cors = require('cors');const app = express();// 基础配置:允许所有源访问(慎用!)
app.use(cors());// 精细化配置(推荐)
app.use(cors({origin: 'https://web.com',     // 仅允许指定源methods: ['GET', 'POST'],      // 允许的方法allowedHeaders: ['Content-Type'], // 允许的请求头credentials: true,             // 允许携带凭证maxAge: 86400                  // 预检缓存时间
}));app.get('/data', (req, res) => {res.json({ data: "跨域数据返回成功!" });
});

六、常见误区澄清

误区真相
“CORS 是服务端的安全漏洞”CORS 是安全机制,没有它浏览器会默认禁止跨域
“JSONP 能替代 CORS”JSONP 仅支持 GET,且存在安全风险(如 XSS)
“前端代码可绕过 CORS 限制”浏览器会强制检查响应头,前端无法绕过
“服务端不配置 CORS = 接口无法访问”接口仍可被 curl、Postman 等工具调用,但浏览器会拦截

总结:CORS 的核心原理

携带 Origin 头
合法
非法
浏览器请求
服务端
检查 Origin 合法性
添加 CORS 响应头
不添加 CORS 头
浏览器放行请求
浏览器拦截请求

通过这一机制,CORS 在不牺牲安全性的前提下实现了可控的跨域资源共享,成为现代 Web 开发的基石技术。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92871.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92871.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92871.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity笔记(五)知识补充——场景切换、退出游戏、鼠标隐藏锁定、随机数、委托

写在前面:写本系列(自用)的目的是回顾已经学过的知识、记录新学习的知识或是记录心得理解,方便自己以后快速复习,减少遗忘。主要是C#代码部分。十七、场景切换和退出游戏1、场景切换场景切换使用方法: SceneManager.LoadScene()&a…

用 Spring 思维快速上手 DDD——以 Kratos 为例的分层解读

用 Spring 思维理解 DDD —— 以 Kratos 为参照 ​ 在此前的学习工作中,使用的开发框架一直都是 SpringBoot,对 MVC 架构几乎是肌肉记忆:Controller 接请求,Service 写业务逻辑,Mapper 操作数据库,这套套路…

docspace|Linux|使用docker完全离线化部署onlyoffice之docspace文档协作系统(全网首发)

一、 前言 书接上回,Linux|实用工具|onlyoffice workspace使用docker快速部署(离线和定制化部署)-CSDN博客,如果是小公司或者比如某个项目组内部使用,那么,使用docspace这个文档协同系统是非常合适的&…

【教程】如何高效提取胡萝卜块根形态和颜色特征?

胡萝卜是全球不可或缺的健康食材和重要的经济作物, 从田间到餐桌,从鲜食到深加工,胡萝卜在现代人的饮食和健康中扮演着极其重要的角色,通过量化块根形态和色泽均匀性,可实现对高产优质胡萝卜品种的快速筛选。工具/材料…

Python初学者笔记第二十四期 -- (面向对象编程)

第33节课 面向对象编程 1. 面向对象编程基础 1.1 什么是面向对象编程面向过程:执行者 耗时 费力 结果也不一定完美 面向对象:指挥者 省时 省力 结果比较完美面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它使用"对象&…

Go 语言 里 `var`、`make`、`new`、`:=` 的区别

把 Go 语言 里 var、make、new、: 的区别彻底梳理一下。1️⃣ var 作用:声明变量(可以带初始值,也可以不带)。语法: var a int // 声明整型变量,默认值为 0 var b string // 默认值 ""…

计算机网络---IP(互联网协议)

一、IP协议概述 互联网协议(Internet Protocol,IP)是TCP/IP协议族的核心成员,位于OSI模型的网络层(第三层),负责将数据包从源主机传输到目标主机。它是一种无连接、不可靠的协议,提供…

DataFun联合开源AllData社区和开源Gravitino社区将在8月9日相聚数据治理峰会论坛

🔥🔥 AllData大数据产品是可定义数据中台,以数据平台为底座,以数据中台为桥梁,以机器学习平台为中层框架,以大模型应用为上游产品,提供全链路数字化解决方案。 ✨杭州奥零数据科技官网&#xff…

【工具】通用文档转换器 推荐 Markdown 转为 Word 或者 Pdf格式 可以批量或者通过代码调用

【工具】通用文档转换器 推荐 可以批量或者通过代码调用 通用文档转换器 https://github.com/jgm/pandoc/ Pandoc - index 下载地址 https://github.com/jgm/pandoc/releases 使用方法: 比如 Markdown 转为 Word 或者 Pdf格式 pandoc -s MANUAL.txt -o example29.docx …

【UEFI系列】Super IO

文章目录一、什么是Super IO二、Super IO的作用常见厂商三、逻辑设备控制如何访问SIO逻辑设备的配置寄存器具体配置数值四、硬件监控(hardware monitor)一、什么是Super IO Super Input/Output超级输入输出控制器。 通过LPC(low pin count&a…

飞算 JavaAI 2.0.0 测评:自然语言编程如何颠覆传统开发?

一、前言 在AI技术高速发展的今天,编程方式正在经历一场革命。传统的“手写代码”模式逐渐被AI辅助开发取代,而飞算JavaAI 2.0.0的推出,更是让自然语言编程成为现实。 作为一名长期使用Java开发的程序员,我决定深度体验飞算Java…

Dubbo + zk 微服务

一、安装zk注册中心 win版本:windows环境下安装zookeeper教程详解(单机版)-CSDN博客 linux版本: 二、服务提供方搭建 引入dubbo和zk依赖 提供接口 使用注解方式实现接口级注册到zk,而springcloud是将服务注册到注册…

聆思duomotai_ap sdk适配dooiRobot

一、说明 1、duomotai_ap介绍 duomotai_ap是一个针对多模态开发板(如 CSK6-MIX 开发板)的大模型 AI 开发套件 SDK,主要用于开发语音、视觉等多模态 AI 应用。 2、dooiRobot介绍 基于Doly 机器人的经典外观设计,采用聆思CSK6011A…

Photoshop软件打开WebP文件格的操作教程

Photoshop软件打开WebP文件格的操作教程,好吧,这是英文原版: Photoshop 23.2 原生支持 WebP 格式,无需插件即可打开、编辑和保存 WebP 文件。用户可通过“文件 > 另存为副本”选择 WebP 格式,调整无损/有损压缩及质…

【数据结构】——顺序表链表(超详细解析!!!)

目录一. 前言二. 顺序表1. 顺序表的特点2. 代码实现三. 链表1. 单向链表代码实现2.双向链表代码实现四. 顺序表与链表的区别总结一. 前言 顺序表和链表是最基础的两种线性表实现方式。它们各有特点,适用于不同的应用场景。本文将详细介绍这两种数据结构的实现原理、…

GitHub的简单使用方法----(4)

在安装完git之后,桌面右键会出现两个git的选项第一个gui打开是这样的用户界面分别是新建仓库,克隆仓库,打开已经存在的仓库。tips:Git Gui 默认只能操作本地仓库——它本质上是一个图形化的“本地 Git 客户端”。 它本身不内置“下载远程仓库…

蓝桥杯----大模板

在写大模板之前,先讲一个函System_Init(),用于系统初始化关闭所有LED与外设,关闭所有LED就是传入0xff数据打开锁存器,关闭外设就是传入0x00打开锁存器。现在所有底层已经提供给大家了,先提供最简单版本的大模板&#x…

科技写作改革我见:取消参考文献,以点读率取代引证率!

科技写作改革我见:综述应取消参考文献,学术成就评估以点读下载率取代参考文献引证率!李升伟 张君飞 韩若兰引言在当今信息爆炸的时代,科技写作作为知识传播的核心载体,其形式与评价体系正面临前所未有的挑战。传统…

【Altium designer】快速建立原理图工程的步骤

快速建立原理图工程的步骤产品规格书分析 整理产品需求,明确主控芯片、外围接口类型、总线频率、电源需求及隔离要求、PCB尺寸等关键信息。使用文本清单列出所有需求,确保无遗漏。硬件需求架构图绘制 根据需求说明书和收集的信息,使用VISIO绘…

Origin2025b安装包免费,附Origin 2025安装教程

老规矩先放链接:origin2025b安装包 有位小粉丝问我有没有Origin2025b的安装包,有的兄弟有的,只有你想不到,没有小兔找不到的软件。 这个origin是OriginLab公司开发的一个科学绘图、数据分析的软件,Origin支持各种各样…