開發與網路

CORS 跨來源資源共享是什麼?瀏覽器的門禁管制

CORS 全名 Cross-Origin Resource Sharing,中文叫跨來源資源共享,是瀏覽器的一套門禁管制作法。當你的網頁想去呼叫另一個網域的 API 時,瀏覽器會先確認對方伺服器有沒有允許這個來源。沒有允許就直接擋下,畫面上看到的是請求根本送不出去。它的目的是保護使用者,避免惡意網站偷偷拿你的身分去打別人的 API。
CORS 跨來源資源共享是什麼?瀏覽器的門禁管制:文章重點卡

CORS 跨來源資源共享是什麼?瀏覽器的門禁管制

你的網頁明明寫得好好的,一按下去卻整個卡死,主控台跳出一長串紅字,中間有 CORS 這四個字母。這是所有前後端分家的專案幾乎都會遇到的關卡。

它不是你的程式壞了,是瀏覽器在替使用者把關。搞懂規則,這一關就不會卡住你。

你將學到什麼

定義

瀏覽器的門禁規則,決定網頁可不可以呼叫另一個網域的 API。

白話比喻

門口有警衛,名單上沒有你的網域就不放行。

誰負責開門

由被呼叫的那台伺服器回應標頭決定,不是前端能自己解決的。

跟誰容易搞混

常被誤認成後端壞掉,其實請求根本沒送出去。

定義

CORS 的全名是 Cross-Origin Resource Sharing,中文叫跨來源資源共享。它是瀏覽器的門禁管制作法,決定一個網頁能不能去存取另一個來源的資源。

現代瀏覽器預設採用同源政策,也就是說,網頁原則上只能存取同一個來源的資源。要跨出去,得由對方伺服器明確點頭。

實際會發生什麼事

當你的網頁前端想去呼叫另一個網址的 API 後端時,如果對方伺服器沒有設定好允許跨網域存取,瀏覽器就會直接報錯,畫面卡死。

症狀很好認:主控台出現 CORS 錯誤訊息,而且請求根本送不出去。你去看後端日誌,通常會發現一行紀錄都沒有。

有設定跟沒設定差在哪

情境瀏覽器怎麼做結果
沒有設定 CORS判定不同來源,直接擋下主控台出現錯誤,請求送不出去
有設定 CORS看到伺服器回應允許這個來源,放行請求資料成功回來,畫面正常運作

伺服器要回的就是幾個標頭,告訴瀏覽器誰可以來、可以用哪些方法、可以帶哪些標頭。

Access-Control-Allow-Origin: https://a.com
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization

為什麼要有這個規則

  • 保護使用者,防止惡意網站偷偷拿你的身分去打別人的 API
  • 控制權限,讓服務可以明確指定誰可以來存取
  • 現代瀏覽器預設同源政策,跨來源是例外不是常態
  • 在安全與開放之間維持平衡

實際用例

前後端分開部署時幾乎一定會遇到。做法上,開發階段可以先寬鬆設定讓自己走得動,上線前務必把允許的來源收緊到指定網域,不要留一個誰都能進的門。

另外記得放行預檢請求。瀏覽器在送出某些請求前,會先發一個詢問用的請求問伺服器能不能來,這一步沒放行,正式請求也走不到。

常見誤解誤解一,以為 CORS 是後端在擋你。實際上擋你的是瀏覽器,伺服器可能連收都沒收到。誤解二,以為設定成允許所有來源比較省事,那等於把門拆掉,任何網站都能用使用者的身分呼叫你的 API。誤解三,把它跟身分驗證混為一談,CORS 管的是哪個網頁可以發請求,跟這個人有沒有權限是兩件事,後者要靠 API Key 或授權機制。
本文源起本文內容出自酒Ann 的「AI 實戰陪跑班」課程教材,由酒Ann 編寫成彙編條目。想系統性搞懂 AI 名詞,歡迎追蹤 酒Ann 的 Facebook

延伸學習

把這篇文章分享給需要的人FacebookLINEThreadsX

常見問答

CORS 錯誤是前端還是後端要修?
多數情況是後端要修。放不放行由被呼叫的伺服器回應的標頭決定,前端沒有辦法自己繞過去。前端能做的是改成呼叫自己的後端,再由後端去轉發,這樣就不會有跨來源的問題。
什麼叫不同來源?
來源由協定、網域與連接埠三者共同組成,只要其中任何一項不同,就算不同來源。所以同一個網域但連接埠不同,或一邊是加密連線一邊不是,瀏覽器都會視為跨來源。
為什麼用工具測都正常,只有瀏覽器會擋?
因為這是瀏覽器的規則,不是伺服器的規則。用指令列工具或後端程式直接打那支 API 完全不會被擋,只有瀏覽器會依同源政策攔下來。這也是為什麼很多人會誤判成 API 壞了。