雖然還沒實際碰過 CORS 錯誤,但實在太好奇了,所以到處看了文章,得出兩個感想:
因此這篇文章不會針對個別 CORS 錯誤該如何解決做討論,只會涵蓋什麼時候會踩到這個雷以及初步認識請求的類型。
圖片來源:MDN
以上圖為例:這個網頁的來源是http://domain-a.com
,而網頁中的 canvas 要向http://domain-b.com
請求資源,這種跨來源的請求就會受到 CORS 的管控。
CORS 機制提供網頁伺服器跨來源的存取控制,具體方法是透過 HTTP-header 的設定,讓網頁伺服器允許哪些來源可以存取它的資料
MDN 將請求類型分成三大類:簡單請求、預檢請求和帶有身份驗證(cookie)的請求,以下只先介紹前兩類
需要符合以下兩個條件才算簡單請求
GET
、HEAD
、POST
圖片來源:JAVASCRIPT.INFO
對照上圖我們來看看一個跨來源的簡單請求會經歷哪些步驟:
Access-Control-Allow-Origin
設有發送請求的來源
或*
,允許JS讀取資料,換句話說,如果沒有設定就會發生CORS 錯誤
*
表示允許任何網域跨站存取資源
MDN有詳細列出哪些狀況會被歸類為預檢請求,我目前傾向記只要是非簡單請求都可以用預檢請求的步驟去思考。
以下也用圖示來理解預檢請求過程
圖片來源:JAVASCRIPT.INFO
OPTIONS方法
向伺服器先發送訊息200 OK
資料告知瀏覽器可以發送HTTP請求Access-Control-Allow-Origin
是否包含請求來源
或*
Access-Control-XXX 的部分一開始看覺得很可怕,但只要專注在後面的文字就好,會發現就是在註記哪些來源,方法或資料格式是被允許的
參考資料:
MDN
JAVASCRIPT.INFO
CORS 完全手冊
Deep Dive in CORS
CORS 是什麼? 如何設定 CORS?