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

更新於 2024/10/06閱讀時間約 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
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
幼稚園娃娃車司機朴姜武(黃晸民 飾演),負責所有家務,清潔打掃、洗衣做飯。 把妻子美善(廉晶雅 飾演)照顧的無微不致,美善睡醒,豐盛的早餐已在餐桌上, 姜武盯著她吞下保健藥丸,吃早餐,送她出門上班,雙手奉上便當,還包括搜查隊同事的。 美善一臉不耐煩的接過便當,轉方向盤加速前進時, 姜
Thumbnail
儘管在全球化OTT平台上K-Contents勢如破竹,許多人可能因為看過《屍戰朝鮮》或《魷魚遊戲》,而選擇繼續嘗試「韓國製造」,但這並不意味著他們會因某位韓國演員的名氣而買單整部作品。
這篇文章描述了對於他人的陌生和無法理解的感受,表達了對於人際關係的迷失和無助。文章通過描述對方無法理解自己的身體感受以及對方對自己的陌生感,表達了自己的無助和懷疑。整篇文章充滿了對於人情世故的疑惑和無奈。
本文介紹了Transformer中的Encoder Decoder與Cross Attention的運作方式以及的應用。涉及self-attention、autoRegressive Decoder、Non-AutoRegressive Decoder、Cross Attention等概念。
Thumbnail
Cross-platform development tools not only streamlines the development process but also significantly reduces costs and time-to-market.
Thumbnail
為了提供更完整的消費金融等服務,科技公司、新創企業等第三方公司將銀行的基礎服務和設施放入建置規劃,結合傳統金融的規範與創新科技的彈性,BaaS(銀行及服務)的需求跟商機應聲而起。創立於2008 年的Cross River Bank,以提供 BaaS 為名,有超過80名合作夥伴,在美國金融界嶄露頭角。
Juxtaposition Cross of Influence(31/41|24/44) 左角度交叉之創始者(31/41|24/44) 「領導」(31)、「縮小」(41)、「理性思考」(24)和「警覺性」(44) 你有很大的影響力,因為你有持之以恆的能力。 這種特質適合你當個代理人、顧問或
你在這裡是為了表達個人的想法。你是為了向我們介紹一種新的觀念。 因為這是個人的表達方式,但對於大家來說,你所說的可能會顯得非常特別。 因此,你內在具備了:重複你所說或所做的能量。 透過這個重複的過程,身邊朋友和家人甚至是陌生人,會開始熟悉你所表達的內容。這種能量就類似像一種潮流。你是一個具備個人能量
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
幼稚園娃娃車司機朴姜武(黃晸民 飾演),負責所有家務,清潔打掃、洗衣做飯。 把妻子美善(廉晶雅 飾演)照顧的無微不致,美善睡醒,豐盛的早餐已在餐桌上, 姜武盯著她吞下保健藥丸,吃早餐,送她出門上班,雙手奉上便當,還包括搜查隊同事的。 美善一臉不耐煩的接過便當,轉方向盤加速前進時, 姜
Thumbnail
儘管在全球化OTT平台上K-Contents勢如破竹,許多人可能因為看過《屍戰朝鮮》或《魷魚遊戲》,而選擇繼續嘗試「韓國製造」,但這並不意味著他們會因某位韓國演員的名氣而買單整部作品。
這篇文章描述了對於他人的陌生和無法理解的感受,表達了對於人際關係的迷失和無助。文章通過描述對方無法理解自己的身體感受以及對方對自己的陌生感,表達了自己的無助和懷疑。整篇文章充滿了對於人情世故的疑惑和無奈。
本文介紹了Transformer中的Encoder Decoder與Cross Attention的運作方式以及的應用。涉及self-attention、autoRegressive Decoder、Non-AutoRegressive Decoder、Cross Attention等概念。
Thumbnail
Cross-platform development tools not only streamlines the development process but also significantly reduces costs and time-to-market.
Thumbnail
為了提供更完整的消費金融等服務,科技公司、新創企業等第三方公司將銀行的基礎服務和設施放入建置規劃,結合傳統金融的規範與創新科技的彈性,BaaS(銀行及服務)的需求跟商機應聲而起。創立於2008 年的Cross River Bank,以提供 BaaS 為名,有超過80名合作夥伴,在美國金融界嶄露頭角。
Juxtaposition Cross of Influence(31/41|24/44) 左角度交叉之創始者(31/41|24/44) 「領導」(31)、「縮小」(41)、「理性思考」(24)和「警覺性」(44) 你有很大的影響力,因為你有持之以恆的能力。 這種特質適合你當個代理人、顧問或
你在這裡是為了表達個人的想法。你是為了向我們介紹一種新的觀念。 因為這是個人的表達方式,但對於大家來說,你所說的可能會顯得非常特別。 因此,你內在具備了:重複你所說或所做的能量。 透過這個重複的過程,身邊朋友和家人甚至是陌生人,會開始熟悉你所表達的內容。這種能量就類似像一種潮流。你是一個具備個人能量