[CORS] 1. CORS 是什麼? 為什麼要有 CORS ?
什麼是 CORS?
先來說明一下什麼是 Origin:
Origin: 由 protocol + host + port,ex:
如果 fetch, XMLHTTPRequest 的 api origin 不一樣,就會被 Cross Origin Resource Sharing (CORS) policy 阻擋
script, img 的 src 不在此限制因為像 script, img 的 src 只是取得資源,對 Server 沒有什麼安全上的疑慮,所以沒有在 CORS policy 的限制範圍裡
為什麼要有 CORS?
簡單來說,就是
你是從其他家 domain 來的,要跟我家 domain 的 Server 互動是有些規範的
沒有 CORS 的話,駭客就可以在任意網站去跟你的 Server 做互動了
陷阱: Server 其實還是會處理 request
雖說有了 CORS 之後,駭客不能隨意跟 Server 互動,但是阻擋的方式只是
Browser 不把 "已經取得 respones 的結果" 回傳給你看
驚不驚喜,意不意外 😈😈😈
怎麼說呢? 你會看見的錯誤訊息如下:
request has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource
有沒有發現亮點? Access-Control-Allow-Origin 是 Server 的 response 才會加上的 header,表示 Server 其實已 經處理完 request 了
那如果我們的 request 其實會去更改 DB 的資料,像是 PUT /user/:id 或是 DELETE /user/:id 呢?
那這時候就悲劇了,就算有 CORS 的保護,Server 的 DB 資料還是會被砍掉,所以呢? 又有另外一個機制幫我們去區分 request,來針對不同安全程度的 request 做不同的處理,分別是 簡單請求 & 一般請求,我們接下來就會針對這 2 種請求來做說明
簡單請求
在只符合特定簡單內容的條件下,因為安全性疑慮比較低,會直接對 Server 發送請求
請求內容
- Method:
GET,POST,HEAD - Request header:
AcceptAccept LanguageContent-LanguageContent-Type:application/x-www-form-urlencoded,multipart/form-data,text/plain
一般請求
如果不符合上述簡單請求的條件,會對 Server 先發送 Preflight request ,再發送一般 request