# CORS CORS,全名為 Cross-Origin Resource Sharing,跨來源資源共用。 ## Same Origin Policy 瀏覽器因為安全性的考量,有個東西叫做同源政策,Same-origin policy。 意思就是說如果你現在這個網站的跟你要呼叫的 API 的網站「不同源」的時候,瀏覽器一樣會幫你發 Request,但是會把 Response 給擋下來,不讓你的 JavaScript 拿到並且傳回錯誤。 --- 同源政策的確是規範非同源就被擋下來,但與此同時其實又有另外一個規範,是說:「如果你想在不同 origin 之間傳輸資料的話,你應該怎麼做」,這規範就叫做 **CORS**。 這套規範跟你說,如果你想開啟跨來源 HTTP 請求的話,Server 必須在 Response 的 Header 裡面加上Access-Control-Allow-Origin。 --- 1. 瀏覽器會擋你的跨來源請求,是因為安全性問題。因為 AJAX 你可以直接拿到整個 response,所以不擋的話會有問題,但像是 img 標籤你其實就拿不到 response,所以比較沒有問題 2. 今天會有 same-origin policy 跟 CORS,是因為我們「在瀏覽器上寫 JS」,所以受到執行環境的限制。如果我們今天寫的是 Node.js,就完全沒有這些問題,想拿什麼就拿什麼,不會有人擋我們 3. 在瀏覽器上面,CORS 限制的其實是「拿不到 response」,而不是「發不出 request」。所以 request 其實已經發出去了,瀏覽器也拿到 response 了,只是它因為安全性考量不給你(這講法也有一點不太精確,因為有分簡單請求跟非簡單請求,這個在第三篇會提到)。 --- ## 治標不治本的解決方法 * 關掉瀏覽器的安全性設置 * 把 fetch mode 設成 no-cors * 不要用 AJAX 拿資料 * **真正的解法:請後端設置 CORS header** ## 來源: * https://blog.huli.tw/2021/02/19/cors-guide-1/ * https://blog.huli.tw/2021/02/19/cors-guide-2/