昨天我們聊了 API 常見的安全問題,今天要探討一個前端開發者 高機率會遇到 的問題: CORS(Cross-Origin Resource Sharing, 跨來源資源共享) 。
在瀏覽器中,如果兩個網址的「來源(Origin)」不同,就會被視為跨域。
一個來源(Origin)由三個部分組成:
Origin = 協定(Protocol) + 網域(Domain) + 埠號(Port)
例如:
即使是同一個網域,如果協定或埠號不同,也算不同來源。
同源政策 是瀏覽器的一個安全機制:
預設情況下,網頁只能請求「同來源」的資源。
舉例:
如果沒有同源政策,任何網站都可以隨意呼叫其他網站的 API,甚至帶上你的 Cookie。
這會導致:
為了解決「安全」與「合法跨域需求」的矛盾,CORS 機制就誕生了。
當瀏覽器偵測到跨域請求時,它會先發送一個 預檢請求(Preflight Request) ,
這是一個 OPTIONS 請求,用來詢問伺服器是否允許跨域。伺服器如果允許,就會回應一些 CORS 標頭(Headers) ,例如:
Access-Control-Allow-Origin: *
-> 這樣任何網站都能請 API,不安全。
Access-Control-Allow-Origin: https://myapp.com
-> 只允許可信任的前端網域存取。
Access-Control-Allow-Credentials: true
-> 需要搭配具體的網域(不能用 *),否則無效。
Access to fetch at 'https://api.example.com' from origin 'https://myapp.com' has been blocked by CORS policy