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

更新 發佈閱讀 9 分鐘

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簡單請求:

raw-image
raw-image

前端index.html執行結果如下:

raw-image

可以看到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.


raw-image
raw-image


瀏覽器在收到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:

raw-image

改成允許從127.0.0.1來的origin。

raw-image
raw-image

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。

- 以下直接用程式碼實作來了解:

raw-image
raw-image

這次送出的request contentType改成application/json,因此變成非簡單請求了!

執行結果如下:

raw-image

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.

raw-image

首先發出一個預檢請求,OPTIONS method的request,response header如上圖,還沒設定Access-Control-Allow-Origin。

raw-image

request header如上圖。

接著修改index.php,加入Access-Control-Allow-Origin:

raw-image

console如下:

raw-image

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變為這樣:

raw-image
raw-image

從console的提示可以得知,預檢請求(preflight)的response header中沒有設定Access-Control-Allow-Headers允許content-type。

因此再將index.php改成這樣:

raw-image

console如下:

raw-image

preflight response/request header如下:

raw-image
raw-image

預檢請求中送出的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項目後,之後就可以看到後面成功送出實際請求了:

raw-image
raw-image

由此可知,非簡單請求會預先送出預檢請求,並且確保server有允許實際請求的method, headers, origin 等等,後續才會送出真正的實際請求。


本筆記參考:
1. https://developer.mozilla.org/zh-TW/docs/Web/HTTP/CORS
2. https://cms.aaasec.com.tw/index.php/2019/04/28/k_04/

留言
avatar-img
留言分享你的想法!
avatar-img
Vic Lin的沙龍
20會員
161內容數
Vic Lin的沙龍的其他內容
2023/08/13
父元件 傳遞方法使用@ <template>    ...    <Login @modalClose="modalClose"/> ... </template> <script setup>     const _modal = ref();     function m
2023/08/13
父元件 傳遞方法使用@ <template>    ...    <Login @modalClose="modalClose"/> ... </template> <script setup>     const _modal = ref();     function m
2023/03/25
前情提要 由於我的筆電已經用了10年,無法再戰下去了,且有預算考量,加上使用電腦幾乎都是定點,只有偶爾回家的時候會需要攜帶,因此最終選擇了迷你電腦,體積小不占空間,又方便攜帶,剛好符合我的需求。 菜單 由於這台無法裝獨顯,所以CPU的部分選擇 AMD R5 3400G(含Vega 11內
Thumbnail
2023/03/25
前情提要 由於我的筆電已經用了10年,無法再戰下去了,且有預算考量,加上使用電腦幾乎都是定點,只有偶爾回家的時候會需要攜帶,因此最終選擇了迷你電腦,體積小不占空間,又方便攜帶,剛好符合我的需求。 菜單 由於這台無法裝獨顯,所以CPU的部分選擇 AMD R5 3400G(含Vega 11內
Thumbnail
2023/03/10
Nuxt3中可使用useFetch來獲取數據,不須再引用axios,相當方便: 本筆記參考: https://juejin.cn/post/7104071421160063012 https://juejin.cn/post/7086472647575339045
2023/03/10
Nuxt3中可使用useFetch來獲取數據,不須再引用axios,相當方便: 本筆記參考: https://juejin.cn/post/7104071421160063012 https://juejin.cn/post/7086472647575339045
看更多
你可能也想看
Thumbnail
在小小的租屋房間裡,透過蝦皮購物平臺採購各種黏土、模型、美甲材料等創作素材,打造專屬黏土小宇宙的療癒過程。文中分享多個蝦皮挖寶地圖,並推薦蝦皮分潤計畫。
Thumbnail
在小小的租屋房間裡,透過蝦皮購物平臺採購各種黏土、模型、美甲材料等創作素材,打造專屬黏土小宇宙的療癒過程。文中分享多個蝦皮挖寶地圖,並推薦蝦皮分潤計畫。
Thumbnail
小蝸和小豬因購物習慣不同常起衝突,直到發現蝦皮分潤計畫,讓小豬的購物愛好產生價值,也讓小蝸開始欣賞另一半的興趣。想增加收入或改善伴侶間的購物觀念差異?讓蝦皮分潤計畫成為你們的神隊友吧!
Thumbnail
小蝸和小豬因購物習慣不同常起衝突,直到發現蝦皮分潤計畫,讓小豬的購物愛好產生價值,也讓小蝸開始欣賞另一半的興趣。想增加收入或改善伴侶間的購物觀念差異?讓蝦皮分潤計畫成為你們的神隊友吧!
Thumbnail
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
Thumbnail
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
Thumbnail
AWS CloudFront + S3 遇到 CORS 解決方式
Thumbnail
AWS CloudFront + S3 遇到 CORS 解決方式
Thumbnail
之前在【什麼是網路請求(HTTP response)】筆記裡有提到,網路請求遇到 CORS 跨域問題,在開發時可以透過 vite 的反向代理來解決,那麼什麼是反向代理,有反向代理的話是不是也有正向代理呢?
Thumbnail
之前在【什麼是網路請求(HTTP response)】筆記裡有提到,網路請求遇到 CORS 跨域問題,在開發時可以透過 vite 的反向代理來解決,那麼什麼是反向代理,有反向代理的話是不是也有正向代理呢?
Thumbnail
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
Thumbnail
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
Thumbnail
AJAX(Asynchronous JavaScript And XML)為JavaScript和XML的非同步技術,可以讓瀏覽器建立快速、更加和容易使用的操作介面。AJAX核心技術是非同步的HTTP請求(Asynchronous HTTP Requests),除了第一次載入網頁外,HTTP請求是在
Thumbnail
AJAX(Asynchronous JavaScript And XML)為JavaScript和XML的非同步技術,可以讓瀏覽器建立快速、更加和容易使用的操作介面。AJAX核心技術是非同步的HTTP請求(Asynchronous HTTP Requests),除了第一次載入網頁外,HTTP請求是在
Thumbnail
上篇記錄了關於 HTTP request 的筆記,這篇則是對於請求的回應紀錄~
Thumbnail
上篇記錄了關於 HTTP request 的筆記,這篇則是對於請求的回應紀錄~
Thumbnail
從瀏覽器console看到類似這個error:  ..... has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource 表示遇到CORS的
Thumbnail
從瀏覽器console看到類似這個error:  ..... has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource 表示遇到CORS的
Thumbnail
本文模擬user註冊的情境來簡單演示,在Laravel中如何透過ajax來存取資料,以post request為例。 前端透過post把user資料送到controller中,並且透過model把資料塞進DB,最後回傳json response。 完整source cod
Thumbnail
本文模擬user註冊的情境來簡單演示,在Laravel中如何透過ajax來存取資料,以post request為例。 前端透過post把user資料送到controller中,並且透過model把資料塞進DB,最後回傳json response。 完整source cod
Thumbnail
想從javascript拿到不同源的資料,除了上一篇介紹的CORS,其實還有一個東西叫JSOP,是指透過script tag src的方式繞過同源政策來實現cross origin。
Thumbnail
想從javascript拿到不同源的資料,除了上一篇介紹的CORS,其實還有一個東西叫JSOP,是指透過script tag src的方式繞過同源政策來實現cross origin。
Thumbnail
Cross-Origin Resource Sharing 簡稱 CORS,中文為跨來源資源共享。 上一篇提到web瀏覽器有同源政策的限制,而CORS則是一種安全確認機制,讓瀏覽器和伺服器之間能確保安全的進行cross origin資源共享,即若伺服器同意,即可達成跨來源資源共享。
Thumbnail
Cross-Origin Resource Sharing 簡稱 CORS,中文為跨來源資源共享。 上一篇提到web瀏覽器有同源政策的限制,而CORS則是一種安全確認機制,讓瀏覽器和伺服器之間能確保安全的進行cross origin資源共享,即若伺服器同意,即可達成跨來源資源共享。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News