1、跨域資源共享(CORS) 是一種機制,它使用額外的 HTTP 頭來告訴瀏覽器,讓Web應用被准許訪問來自不同源服務器上的指定的資源
2、例如,XMLHttpRequest和Fetch API遵循同源策略。 這意味着使用這些API的Web應用程序只能從加載應用程序的同一個域請求HTTP資源,
除非響應報文包含了正確CORS響應頭
3、什么情況下需要 CORS ?
由 XMLHttpRequest 或 Fetch 發起的跨域 HTTP 請求。
Web 字體 (CSS 中通過 @font-face 使用跨域字體資源), 因此,網站就可以發布 TrueType 字體資源,並只允許已授權網站進行跨站調用
WebGL 貼圖
使用 drawImage 將 Images/video 畫面繪制到 canvas
4、跨域資源共享標准對那些可能對服務器數據產生副作用的 HTTP 請求方法(特別是 GET 以外的 HTTP 請求,或者搭配某些 MIME 類型的 POST 請求),
瀏覽器必須首先使用 OPTIONS 方法發起一個預檢請求,從而獲知服務端是否允許該跨域請求。服務器確認允許之后,
才發起實際的 HTTP 請求。在預檢請求的返回中,服務器端也可以通知客戶端,
是否需要攜帶身份憑證(包括 Cookies 和 HTTP 認證相關數據)
簡單請求
某些請求不會觸發 CORS 預檢請求,稱這樣的請求為 簡單請求
若請求滿足所有下述條件,則該請求可視為 簡單請求:
使用下列方法之一:
GET
HEAD
POST
Fetch 規范定義了對 CORS 安全的首部字段集合,不得人為設置該集合之外的其他首部字段。該集合為:
Accept
Accept-Language
Content-Language
Content-Type (需要注意額外的限制)
DPR
Downlink
Save-Data
Viewport-Width
Width
Content-Type 的值僅限於下列三者之一:
text/plain
multipart/form-data
application/x-www-form-urlencoded
預檢請求
要求必須首先使用 OPTIONS 方法發起一個預檢請求到服務器,預檢請求 的使用,可以避免跨域請求對服務器的用戶數據產生未預期的影響。
當請求滿足下述任一條件時,即應首先發送預檢請求:
使用了下面任一 HTTP 方法:
PUT
DELETE
CONNECT
OPTIONS
TRACE
PATCH
人為設置了對 CORS 安全的首部字段集合之外的其他首部字段。該集合為:
Accept
Accept-Language
Content-Language
Content-Type (需要注意額外的限制)
DPR
Downlink
Save-Data
Viewport-Width
Width
Content-Type 的值不屬於下列之一:
application/x-www-form-urlencoded
multipart/form-data
text/plain
HTTP 響應首部字段
Access-Control-Allow-Origin
Access-Control-Allow-Origin: '*' 允許所有網站請求
Access-Control-Allow-Origin: 'www.baidu.com' 允許百度網站請求
Access-Control-Expose-Headers
在跨域訪問時,XMLHttpRequest對象的getResponseHeader()方法只能拿到一些最基本的響應頭,
Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma,
如果要訪問其他頭,則需要服務器設置本響應頭
Access-Control-Max-Age
Access-Control-Max-Age: '1000' 1000秒內再發送請求不用在發送預請求
Access-Control-Allow-Credentials
指定了當瀏覽器的credentials設置為true時是否允許瀏覽器讀取response的內容
Access-Control-Allow-Methods
用於預檢請求的響應,其指明了實際請求所允許使用的 HTTP 方法
Access-Control-Allow-Headers
用於預檢請求的響應,其指明了實際請求中允許攜帶的首部字段
HTTP 請求首部字段
無須手動設置,當開發者使用 XMLHttpRequest 對象發起跨域請求時,它們已經被設置就緒
Origin
表明預檢請求或實際請求的源站
Access-Control-Request-Method
用於預檢請求,將實際請求所使用的 HTTP 方法告訴服務器
Access-Control-Request-Headers
用於預檢請求,將實際請求所攜帶的首部字段告訴服務器
附帶身份憑證的請求
瀏覽器不會發送身份憑證信息。如果要發送憑證信息,需要設置 XMLHttpRequest
的某個特殊標志位
XMLHttpRequest
的 withCredentials 標志設置為 true,
從而向服務器發送 Cookies。
因為這是一個簡單 GET 請求,所以瀏覽器不會對其發起 預檢請求。但是,如果服務器端的響應中未攜帶 Access-Control-Allow-Credentials: true,
瀏覽器將不會把響應內容返回給請求的發送者。