服務端配置 CORS解決跨域問題的原理

服務端配置 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支持各種各樣…