1. 程式人生 > >CORS:source,princple,implimentation in Spring

CORS:source,princple,implimentation in Spring

進行 port 瀏覽器 headers cors delete requests 分享圖片 客戶端請求

CORS = Cross-Origin Resource Sharing 一種跨域訪問技術

什麽是 Origin

要理解CORS,首先得理解什麽是 “Origin”。參見RFC6454:如果兩個URI擁有相同的schema,host和port,我們就認為他們是來自於相同的Origin。以下是一個完整的URI的定義:

scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]

Same-Origin Security Policy

Same-origin security policy 是對客戶端的要求。在這個要求之下,網絡瀏覽器 對來自於相同Origin的腳本允許網頁間相互訪問。

這裏有一個違反這個約定而造成的風險Wikipedia:


Assume that a user is visiting a banking website and doesn’t log out. Then, the user goes to another site that has some malicious JavaScript code running in the background that requests data from the banking site. Because the user is still logged in on the banking site, the malicious code could do anything the user could do on the banking site. For example, it could get a list of the user’s last transactions, create a new transaction, etc. This is because the browser can send and receive session cookies to the banking site based on the domain of the banking site.


Cross-Origin Resource Sharing

CORS是一種協議,它用來約定服務端和客戶端那些行為是被服務端允許的。盡管服務端是可以進行驗證和認證的,但基本上這是由客戶端瀏覽器來保證的。這些對行為的允許是放在應答包的header裏面的。

工作原理

CORS的實現主要包括一些客戶端的工作以及兩類服務端的處理,基本流程如下圖所示:

技術分享圖片

客戶端

下圖來自 Wikipedia Click here to visit Wikipedia

技術分享圖片


服務端 (簡單 CORS 請求)

前提

只對滿足以下所有條件的HTTP請求做出相應的CORS回應:

1. HTTP 方法僅限於 GET, POST 和 HEAD.
2. 客戶端清秀需要含有 Origin 頭.
3. 如果客戶端請求是 POST,頭部 Content-Type 只可以是 application/x-www-form-urlencoded, multipart/form-data, 或 text/plain.

業務邏輯

如果origin被服務端允許,服務端返回請求是帶有 Access-Controll-Allow-Origin 頭, 並且這個頭部信息的值和客戶端Origin 的值保持一致;否則就表示不被允許。如果 Access-Controll-Allow-Origin 被設置成 "*",則意味著任何Origin都被允許。

註意:如果所訪問的資源需要憑證,那麽 Access-Controll-Allow-Origin 則不應該被設置為 "*" 而且 Access-Control-Allow-Credentials 頭需要被設置成 true.

示例

客戶端HTTP 請求

GET /api/version HTTP/1.1
User-Agent: Fiddler
Accept: application/json
Origin: http://foo.origin

服務端回應

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Date: Wed, 31 Nov 2100 19:42:00 GMT
Server: Apache-Coyote/1.1
Content-Length: 53
Connection: keep-alive
Access-Control-Allow-Origin: http://foo.origin

[response payload]

服務端(預備請求)

前提

對滿足任意以下條件之一的HTTP請求做出回應:
1. HTTP請求不是 GET, POST 或 HEAD.
2. 客戶端請求帶有自定義頭部
3. 如果客戶端請求是 POST, 頭部 Content-Type 不是 application/x-www-form-urlencoded, multipart/form-data, or text/plain.

客戶端進一步請求

客戶端瀏覽器需要進行額外的 OPTIONS 請求,並且使用以下頭部信息來向服務端問詢相應的HTTP方法是否被允許:
1. Origin: Javascript的Origin
2. Access-Control-Request-Method: 準備使用的 HTTP 方法
3. Access-Control-Request-Headers: 將要在上述HTTP方法中使用的自定義頭部

業務邏輯

如果請求不被允許,服務端返回4XX錯誤。
如果請求被允許,服務端返回200並在頭部包含以下信息:
1. Access-Control-Allow-Origin: 被允許的Origin。如果Origin是個列表,則每個Origin之間用 "," 隔開。
2. Access-Control-Allow-Methods: 被允許的HTTP方法,如果是多個,用 "," 隔開。
3. Access-Control-Max-Age: 一個整數,用來表達這個預備請求什麽時候過期,單位是秒。
4. Access-Control-Allow-Credentials: 可選,如果所訪問資源需要憑證,這個頭部需要被設置成 true。

示例

客戶端HTTP請求

OPTIONS /resources/31415926
User-Agent: Fiddler
Access-Control-Request-Method: DELETE
Access-Control-Request-Headers: origin, x-requested-with, accept
Origin: http://foo.origin

服務端回應

HTTP/1.1 200 OK
Date: Wed, 20 Nov 2013 19:36:00 GMT
Server: Apache-Coyote/1.1
Content-Length: 0
Connection: keep-alive
Access-Control-Allow-Origin: http://foo.client.com
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE
Access-Control-Max-Age: 50000

參考文獻


(Wikipedia) Same-origin security policy
(Wikipedia) Cross-origin resource sharing
(W3C Recommendation) Cross-Origin Resource Sharing
---------------------
作者:NonStatic
來源:CSDN
原文:https://blog.csdn.net/NonStatic/article/details/79228475
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

CORS:source,princple,implimentation in Spring