常常我們開發一個全端的網頁,常常就會遇到這個問題,像是在開發階段假設:
後端用 http://localhost:5000
前端用 http://localhost:3000
他們跨了port就會出現CORS的錯誤
可能會像下面這樣的錯誤出現
Access to fetch at ‘http://localhost:5000' from origin http://localhost:3000' has been blocked by CORS policy...
在解釋 CORS 前,先了解同源政策(Same-Origin Policy, SOP)
https://example.com:443/page1
https://example.com:443/page2
這兩個是同源
http://example.com
(協定不同)
https://api.example.com
(子網域不同)
https://example.com:8080
(埠號不同)
這些都屬於跨來源
而 CORS 就是解決跨來源請求的一種機制
這主要是因為安全性考量
如果沒有這樣的限制,惡意網站就能隨便讀取其他網站的資訊
舉一個情境來說:
https://bank.com
🏦,而瀏覽器幫你保存了帳戶資料在Cookieshttp://evil.com
😈evil.com
就能直接用JS發送請求到 bank.com
,並帶走你的 Cookies,偷偷轉帳或讀取你的帳戶資料做壞事所以瀏覽器就限制JS只能存取同源的資料,實施了同源政策
剛剛說瀏覽器限制資料的跨與請求,但是現在的網頁很需要跨與的請求,可能很常前後端就是不同的網域,為了合法的允許特定跨域存取,就需要 CORS 機制
CORS並不是讓瀏覽器直接放行通過,而是由伺服器用特定的 HTTP Header告訴瀏覽器:哪些來源可以來存取我
舉例來說:
當瀏覽器要請求一個跨域的網址,瀏覽器的Header會帶上一個Origin
,他告訴Server我的來源是誰,然後伺服器會在返回的Header中加上一個Access-Control-Allow-Origin
這也就是等等下面會提的簡單請求 (Simple Request)
Note:是瀏覽器在檢查,不是伺服器!
簡單請求 (Simple Request)
text/plain
、application/x-www-form-urlencoded
、multipart/form-data
流程:
Origin
Access-Control-Allow-Origin
預檢請求 (Preflight Request)
流程:
https://developer.mozilla.org/zh-TW/docs/Web/HTTP/Guides/CORS