開發與網路
CORS 跨來源資源共享是什麼?瀏覽器的門禁管制
CORS 全名 Cross-Origin Resource Sharing,中文叫跨來源資源共享,是瀏覽器的一套門禁管制作法。當你的網頁想去呼叫另一個網域的 API 時,瀏覽器會先確認對方伺服器有沒有允許這個來源。沒有允許就直接擋下,畫面上看到的是請求根本送不出去。它的目的是保護使用者,避免惡意網站偷偷拿你的身分去打別人的 API。
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。
延伸學習
常見問答
CORS 錯誤是前端還是後端要修?
多數情況是後端要修。放不放行由被呼叫的伺服器回應的標頭決定,前端沒有辦法自己繞過去。前端能做的是改成呼叫自己的後端,再由後端去轉發,這樣就不會有跨來源的問題。
什麼叫不同來源?
來源由協定、網域與連接埠三者共同組成,只要其中任何一項不同,就算不同來源。所以同一個網域但連接埠不同,或一邊是加密連線一邊不是,瀏覽器都會視為跨來源。
為什麼用工具測都正常,只有瀏覽器會擋?
因為這是瀏覽器的規則,不是伺服器的規則。用指令列工具或後端程式直接打那支 API 完全不會被擋,只有瀏覽器會依同源政策攔下來。這也是為什麼很多人會誤判成 API 壞了。

