Cross-Origin Resource Sharing(跨來源資源共享)

更新於 發佈於 閱讀時間約 8 分鐘
Cross-Origin Resource Sharing 簡稱 CORS,中文為跨來源資源共享。

上一篇提到web瀏覽器有同源政策的限制,而CORS則是一種安全確認機制,讓瀏覽器和伺服器之間能確保安全的進行cross origin資源共享,即若伺服器同意,即可達成跨來源資源共享。
CORS 把 Request 分成兩種,一種是簡單請求,另一種是非簡單請求。


簡單請求(以下條件皆滿足):

1. HTTP method為: 「GET」 或 「HEAD」 或 「POST」。
2. Content-type標頭值為:「application/x-www-form-urlencoded」 或 「multipart/form-data」 或 「text/plain」。
3. 僅手動設定定義為「CORS 安全列表請求標頭(CORS-safelisted request-header)」的標頭,如Accept, Accept-Language, Content-Language, Content-Type...等等。
4. 沒有事件監聽器被註冊到任何用來發出請求的 XMLHttpRequestUpload 物件(經由 XMLHttpRequest.upload 屬性取得)上。
5. 請求中沒有 ReadableStream 物件被用於上傳。
- 以下直接用程式碼實作來了解CORS簡單請求:
前端index.html執行結果如下:
可以看到console出現了: Access to XMLHttpRequest at 'http://192.168.56.1/cors/index.php' from origin 'http://127.0.0.1' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

瀏覽器在收到Server response 之後,會先檢查Server response header中的Access-Control-Allow-Origin裡面是否有包含發起 Request 的 Origin,有的話就會允許通過,讓js順利接收到 Response。
由於這個例子index.php並沒有設定Access-Control-Allow-Origin response header,因此這個跨源存取被擋住了!
因此,如果我的網站javascript想拿到別人網站server回傳的資料,關鍵在於,那個網站的server response header中的Access-Control-Allow-Origin是否有包含我的網站的origin。

這邊修改一下index.php:
改成允許從127.0.0.1來的origin。
response header中的Access-Control-Allow-Origin已經包含了http://127.0.0.1,因此成功拿到資料了!

非簡單請求(以下任一點條件滿足):

1. HTTP method為: PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH 任一個。
2. Content-type標頭值為除了這些以外的值:「application/x-www-form-urlencoded」 或 「multipart/form-data」 或 「text/plain」。
3. 請求中包含了任何除了「CORS 安全列表請求標頭(CORS-safelisted request-header)」的標頭,如Accept, Accept-Language, Content-Language, Content-Type...等等。
4. 一或多個事件監聽器被註冊到一個用來發出請求的 XMLHttpRequestUpload 物件上。
5. 請求中有一個 ReadableStream 物件被於上傳。
非簡單請求會先發送一個預檢請求(preflight),若server同意後,瀏覽器才會真正發出要資料的request。
- 以下直接用程式碼實作來了解:
這次送出的request contentType改成application/json,因此變成非簡單請求了!
執行結果如下:
console如上圖,Access to XMLHttpRequest at 'http://192.168.56.1/cors/index.php' from origin 'http://127.0.0.1' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
首先發出一個預檢請求,OPTIONS method的request,response header如上圖,還沒設定Access-Control-Allow-Origin。
request header如上圖。
接著修改index.php,加入Access-Control-Allow-Origin:
console如下:
Access to XMLHttpRequest at 'http://192.168.56.1/cors/index.php' from origin 'http://127.0.0.1' has been blocked by CORS policy: Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.
response/request header變為這樣:
從console的提示可以得知,預檢請求(preflight)的response header中沒有設定Access-Control-Allow-Headers允許content-type。
因此再將index.php改成這樣:
console如下:
preflight response/request header如下:
預檢請求中送出的header: Access-Control-Request-Method 是通知server之後送出的實際請求會是 POST 方法。
Access-Control-Request-Headers 則是通知server之後送出的實際請求會帶有一個 content-type 標頭。
因此server必須在response header中設定允許:
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST
這邊之所以沒設定Access-Control-Allow-Methods: POST是因為預設是允許的。
當瀏覽器檢查到預檢請求的server response header中有設定上述的allow項目後,之後就可以看到後面成功送出實際請求了:
由此可知,非簡單請求會預先送出預檢請求,並且確保server有允許實際請求的method, headers, origin 等等,後續才會送出真正的實際請求。
為什麼會看到廣告
avatar-img
21會員
161內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Vic Lin的沙龍 的其他內容
同源政策是瀏覽器基於安全性考量而存在的一個政策,針對瀏覽器指令碼的限制。
REST全名為Representational State Transfer,它是一種軟體架構風格,不是一種標準。 以REST架構設計的系統就可以稱為 RESTful,就像是美麗 (Beauty) 的事物可以稱為 Beautiful。
ORM 中文為「物件關聯對映」,是一種介於程式與DB中間的程式設計技術,將程式語言轉換成SQL語言來對DB做操作。
簡單來說,其實就是想要完成一件事情,可以使用不同的策略去達成。
同源政策是瀏覽器基於安全性考量而存在的一個政策,針對瀏覽器指令碼的限制。
REST全名為Representational State Transfer,它是一種軟體架構風格,不是一種標準。 以REST架構設計的系統就可以稱為 RESTful,就像是美麗 (Beauty) 的事物可以稱為 Beautiful。
ORM 中文為「物件關聯對映」,是一種介於程式與DB中間的程式設計技術,將程式語言轉換成SQL語言來對DB做操作。
簡單來說,其實就是想要完成一件事情,可以使用不同的策略去達成。
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
ALB 本身並非原生支援 CORS,因此需要後端應用程式新增 CORS 標頭。 出於安全原因,瀏覽器限制從腳本發起的跨來源 HTTP 請求。預設情況下,XMLHttpRequest 遵循同源策略。這意味著使用這些 API 的 Web 應用程式只能從載入應用程式的相同來源請求資源,除非來自其他來源
Thumbnail
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
Thumbnail
※ 什麼是Web API API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。 API流程: 終端使用者用任何一種裝置進入瀏覽器。 瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。 後端透過 API 收到前端的請求後,取得資料並回應給前端。 前端渲染畫面,終端使用者
xhr 在下面的例子裡,我們首先建立了一個 XMLHttpRequest 物件,並使用 .open() 開啟一個 URL,最後使用 .send() 發出 request。 具體來說步驟有四個: 建立XMLHttpReque 開啟一個請求。 送出請求。 拿到回應後去處理畫面要如何呈現。
※ 什麼是 RESTful API? 這種運用 HTTP 來表達語義的路由設計風格稱為 RESTful API,它描述了如何實現 Web API 的架構。所謂的 API 是應用程式介面 (application programming interface),網址也是一種應用程式的「介面」,故稱為
Thumbnail
之前在【什麼是網路請求(HTTP response)】筆記裡有提到,網路請求遇到 CORS 跨域問題,在開發時可以透過 vite 的反向代理來解決,那麼什麼是反向代理,有反向代理的話是不是也有正向代理呢?
Thumbnail
CSR(Client Side Rendering)是一種將渲染資料的過程交由瀏覽器端處理的方法。
Thumbnail
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
發送表單用get跟post看起來好像都無所謂,然而事實並非如此,使用GET的風險如下: 安全性問題 機密資訊為何不宜用GET,是因為由GET方法提交的表單會將欄位的key,value顯示於URL上,想像一下如果小明借用你的電腦,查看你的網頁歷史紀錄時就可以看到你的帳密了,多可怕! 再來就是如果
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
ALB 本身並非原生支援 CORS,因此需要後端應用程式新增 CORS 標頭。 出於安全原因,瀏覽器限制從腳本發起的跨來源 HTTP 請求。預設情況下,XMLHttpRequest 遵循同源策略。這意味著使用這些 API 的 Web 應用程式只能從載入應用程式的相同來源請求資源,除非來自其他來源
Thumbnail
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
Thumbnail
※ 什麼是Web API API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。 API流程: 終端使用者用任何一種裝置進入瀏覽器。 瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。 後端透過 API 收到前端的請求後,取得資料並回應給前端。 前端渲染畫面,終端使用者
xhr 在下面的例子裡,我們首先建立了一個 XMLHttpRequest 物件,並使用 .open() 開啟一個 URL,最後使用 .send() 發出 request。 具體來說步驟有四個: 建立XMLHttpReque 開啟一個請求。 送出請求。 拿到回應後去處理畫面要如何呈現。
※ 什麼是 RESTful API? 這種運用 HTTP 來表達語義的路由設計風格稱為 RESTful API,它描述了如何實現 Web API 的架構。所謂的 API 是應用程式介面 (application programming interface),網址也是一種應用程式的「介面」,故稱為
Thumbnail
之前在【什麼是網路請求(HTTP response)】筆記裡有提到,網路請求遇到 CORS 跨域問題,在開發時可以透過 vite 的反向代理來解決,那麼什麼是反向代理,有反向代理的話是不是也有正向代理呢?
Thumbnail
CSR(Client Side Rendering)是一種將渲染資料的過程交由瀏覽器端處理的方法。
Thumbnail
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
發送表單用get跟post看起來好像都無所謂,然而事實並非如此,使用GET的風險如下: 安全性問題 機密資訊為何不宜用GET,是因為由GET方法提交的表單會將欄位的key,value顯示於URL上,想像一下如果小明借用你的電腦,查看你的網頁歷史紀錄時就可以看到你的帳密了,多可怕! 再來就是如果