2016-08-31 80 views
-1

關於Cross Origin Resource Sharing (CORS)有一些我從來沒有真正理解的東西,也就是說,對於一個跨源HTTP請求,它不是客戶端來決定它想要信任的服務器。相反,服務器聲明(在Access-Control-Allow-Origin響應標頭中)一個或多個特定客戶(源)信任它。如果服務器說客戶端信任服務器,啓用CORS的瀏覽器只會將服務器的響應傳遞給應用程序。這似乎是在兩個HTTP方之間建立信任關係的反向方式。使用CORS,爲什麼服務器會聲明哪些客戶端可以信任它,而不是客戶端聲明他們信任的服務器?

對我來說更有意義的機制是類似於以下的機制:客戶端聲明它所信任的源的列表;例如,通過<head>中的一些虛構的<meta allow-cross-origin="https://another-site:1234"/>元素。 (當然,瀏覽器必須確保這些元素是隻讀的,不能通過腳本進行刪除,修改或增強。)

我對CORS有什麼誤解?爲什麼可信賴來源的客戶端聲明不起作用?爲什麼服務器需要確認哪些客戶端(源)可以信任其響應?誰實際上受CORS保護誰?它是否保護服務器或客戶端?

(這是一個很大的問題。我希望這是清楚的,我沒想到的答案,每一種,而只是指出我的根本誤解的答案。)

+0

對於這個downvoter,我會很感激提示我的問題有什麼問題。我很高興對它進行編輯,進一步解釋,或者如果這個問題確實不合適,請將其撤回。 – stakx

+1

託管JavaScript的網站隱式聲明,它首先通過從該URL請求數據來信任它試圖從中檢索數據的網站。 – Quentin

+1

「服務器聲明(在Access-Control-Allow-Origin響應標頭中)一個或多個特定客戶(源)信任它」 - 不,它聲明它信任那些起源,而不是它們信任它。 – Quentin

回答

0

客戶無關用它。使用CORS標頭,您可以告訴客戶端我信任哪些其他服務器。那些可以分享您的資源和客戶端不會介意。

例如,如果您有兩個域名告訴客戶,所以讓您的資源被您的第二個網站使用,您不會說我相信您是客戶。

所以你保護服務器,而不是客戶端。您不希望AJAX API端點可以通過世界上任何地方託管的腳本訪問。

客戶沒有任何收穫/失去。它只是保護服務器,因爲使用AJAX的所有URL對任何人都清晰可見,如果沒有這種保護,任何人都可以繼續使用API​​運行其前端,只有服務器不得不從此丟失,因此他們可以決定誰可以使用他們的資源。

+0

問題在於濫用術語「客戶端」意思是「託管包含導致客戶端發起請求的JavaScript的頁面的網站」 – Quentin

+0

您在說CORS實際上是爲了保護要求產生響應的服務器,而不是提出請求的客戶。但是這對我沒有意義。爲什麼會需要CORS? HTTP服務器可以簡單地查看誰發出請求,然後發送'2xx' /'3xx'狀態碼或(例如)'401 Unauthorized'。但是對於CORS,我認爲服務器無論如何都會產生一個響應,但是頭部可以讓客戶端瀏覽器決定是否/如何處理響應。鑑於我的理解是正確的,CORS如何通過簡單的'401'響應添加服務器保護? – stakx

+0

好,所以你不認爲你可能想分享你擁有的兩個不同域名之間的資源?如果那是CORS不適合你的情況。 CORS有助於在您打算繞過繞過共享限制時。 –