CORS 是什麼?

什麼時候會用到 CORS

CORS:跨來源資源共用(Cross-Origin Resource Sharing)

舉例:瀏覽器連線到 http://localhost:3000 的伺服器,伺服器回傳的 HTML 檔案中,在 javascript 裡用 XMLHttpRequest 請求 https://example.com 的資源。

只要通訊協定、網域、和通訊埠三者中有一個不同,就屬於跨來源資源請求。 所以 http://localhost:3000 請求 https://cdn.jsdelivr.net/npm/bootstrap@5.0.0/dist/css/bootstrap.min.css 上的資源,就屬於跨來源資源請求。

為了保護資訊安全,跨來源資源請求是受到限制的。若想完成跨來源資源請求,需要遵守 CORS 的規範,不然就會失敗。

CORS 的規範是什麼

簡單請求、非簡單請求

跨來源資源請求,分為簡單請求,和非簡單請求。

定義:符合底下所有條件的就是簡單請求,不符合的就是非簡單請求

  1. HTTP 方法是 GET、HEAD 或 POST

  2. 自訂的請求頭只能是 Accept、Accept-Language、Content-Language 或 Content-Type(此項的值只能是 application/x-www-form-urlencoded、multipart/form-data 或 text/plain)

  3. If the request is made using an XMLHttpRequest object, no event listeners are registered on the object returned by the XMLHttpRequest.upload property used in the request; that is, given an XMLHttpRequest instance xhr, no code has called xhr.upload.addEventListener() to add an event listener to monitor the upload.(字面上的意思似乎是,如果是用 XMLHttpRequest 物件發出請求,而且請求時有用到 upload 這個,property 那麼,不能在 upload 回傳的物件上面註冊監聽器。)

  4. No ReadableStream object is used in the request. (目前還沒弄懂這是什麼)

簡單請求

瀏覽器送出請求時,要在請求頭加上 Origin。Origin 中包括了通訊協定、網域、和通訊埠。

伺服器收到請求時,會檢查 Origin 的值,決定是否要允許這個請求。若允許的話,會在響應頭加上 Access-Control-Allow-Origin。

瀏覽器收到回應後,會檢查 Origin 是否有在 Access-Control-Allow-Origin 的名單上。有的話才會請求成功。

非簡單請求

跟簡單請求相比,非簡單請求在一開始多了預檢請求的步驟。預檢請求(preflight request),是用來打聽伺服器是否允許這樣的跨來源資源請求。允許的話,瀏覽器才會送出請求

瀏覽器送出預檢請求:

  • 使用 http OPTIONS 方法,
  • 請求頭則是 Access-Control-Request-Method(瀏覽器要用什麼非簡單的 http 方法) 和 Access-Control-Request-Headers(瀏覽器要用什麼非簡單的請求頭)

伺服器回應預檢請求:響應頭裡面有這兩個東西:

  • Access-Control-Allow-Methods:伺服器允許什麼 http 方法
  • Access-Control-Allow-Headers:伺服器允許什麼非簡單的請求頭

參考資料

HTTP請求頭

CORS

易混淆的觀念:CORS 、CSRF、XSS

Comments

Popular posts from this blog

shop_platform - 建立多對多關聯:Association Object

[計算機概論] SR Flip-Flop

git 指令