Spring Cloud 微服務(wù)實(shí)戰(zhàn)(最新版) 前言
同源策略 在瀏覽器中,內(nèi)容是很開放的,任何資源都可以接入其中,如 JavaScript 文件、圖片、音頻、視頻等資源,甚至可以下載其他站點(diǎn)的可執(zhí)行文件。 但也不是說瀏覽器就是完全自由的,如果不加以控制,就會(huì)出現(xiàn)一些不可控的局面,例如會(huì)出現(xiàn)一些安全問題,如:
如果這些都沒有限制的話,對于我們用戶而言,是相對危險(xiǎn)的,因此需要一些安全策略來保障我們的隱私和數(shù)據(jù)安全。 推薦一個(gè)開源免費(fèi)的 Spring Boot 實(shí)戰(zhàn)項(xiàng)目:
什么是同源策略 同源策略是一個(gè)重要的安全策略,它用于限制一個(gè)源的文檔或者它加載的腳本如何能與另一個(gè)源的資源進(jìn)行交互。 如果兩個(gè) URL 的協(xié)議、主機(jī)和端口都相同,我們就稱這兩個(gè) URL 同源。 協(xié)議:協(xié)議是定義了數(shù)據(jù)如何在計(jì)算機(jī)內(nèi)和之間進(jìn)行交換的規(guī)則的系統(tǒng),例如 HTTP、HTTPS。 主機(jī):是已連接到一個(gè)計(jì)算機(jī)網(wǎng)絡(luò)的一臺(tái)電子計(jì)算機(jī)或其他設(shè)備。網(wǎng)絡(luò)主機(jī)可以向網(wǎng)絡(luò)上的用戶或其他節(jié)點(diǎn)提供信息資源、服務(wù)和應(yīng)用。使用 TCP/IP 協(xié)議族參與網(wǎng)絡(luò)的計(jì)算機(jī)也可稱為 IP 主機(jī)。 端口:主機(jī)是計(jì)算機(jī)到計(jì)算機(jī)之間的通信,那么端口就是進(jìn)程到進(jìn)程之間的通信。 如下表給出了與 URL http://test.:8080/dir/page.html 的源進(jìn)行對比的示例: 同源策略主要表現(xiàn)在以下三個(gè)方面:DOM、Web 數(shù)據(jù)和網(wǎng)絡(luò)。
出于安全原因,瀏覽器限制從腳本內(nèi)發(fā)起的跨源 HTTP 請求,XMLHttpRequest 和 Fetch API,只能從加載應(yīng)用程序的同一個(gè)域請求 HTTP 資源,除非使用 CORS 頭文件。 插播一條:如果你近期準(zhǔn)備面試跳槽,建議在Java面試庫小程序在線刷題,涵蓋 2000+ 道 Java 面試題,幾乎覆蓋了所有主流技術(shù)面試題。 CORS 對于瀏覽器限制這個(gè)詞,要著重解釋一下:不一定是瀏覽器限制了發(fā)起跨站請求,也可能是跨站請求可以正常發(fā)起,但是返回結(jié)果被瀏覽器攔截了。 不會(huì)觸發(fā) CORS 預(yù)檢請求。這樣的請求為 簡單請求,。若請求滿足所有下述條件,則該請求可視為 簡單請求:
預(yù)檢請求 非簡單請求的 CORS 請求,會(huì)在正式通信之前,增加一次 HTTP 查詢請求,稱為:預(yù)檢請求。 需預(yù)檢的請求要求必須首先使用 OPTIONS 方法發(fā)起一個(gè)預(yù)檢請求到服務(wù)器,以獲知服務(wù)器是否允許該實(shí)際請求。預(yù)檢請求 的使用,可以避免跨域請求對服務(wù)器的用戶數(shù)據(jù)產(chǎn)生未預(yù)期的影響。 例如我在自己的網(wǎng)站上刪除一條記錄: 它首先會(huì)發(fā)起一個(gè)預(yù)檢請求,預(yù)檢請求的頭信息包括兩個(gè)特殊字段:
一旦服務(wù)器通過了 預(yù)檢請求,以后每次瀏覽器正常的 CORS 請求,就都跟簡單請求一樣,會(huì)有一個(gè) Origin 頭信息字段。服務(wù)器的回應(yīng),也都會(huì)有一個(gè) Access-Control-Allow-Origin 頭信息字段。 上面頭信息中,Access-Control-Allow-Origin 字段是每次回應(yīng)都必定包含的。插播一條:如果你近期準(zhǔn)備面試跳槽,建議在Java面試庫小程序在線刷題,涵蓋 2000+ 道 Java 面試題,幾乎覆蓋了所有主流技術(shù)面試題。 附帶身份憑證的請求與通配符 在響應(yīng)附帶身份憑證的請求時(shí):
這是因?yàn)檎埱蟮臉?biāo)頭中攜帶了 Cookie 信息,如果 Access-Control-Allow-Origin 的值為 *,請求將會(huì)失敗。而將 Access-Control-Allow-Origin 的值設(shè)置為 https://,則請求將成功執(zhí)行。 另外,響應(yīng)標(biāo)頭中也攜帶了 Set-Cookie 字段,嘗試對 Cookie 進(jìn)行修改。如果操作失敗,將會(huì)拋出異常。用設(shè)計(jì)模式干掉 if-else,這篇推薦學(xué)習(xí)下。 完整的請求流程圖 總結(jié) 預(yù)檢請求是在進(jìn)行跨域資源共享 CORS 時(shí),由瀏覽器自動(dòng)發(fā)起的一種 OPTIONS 請求。它的存在是為了保障安全,并允許服務(wù)器決定是否允許跨域請求。 跨域請求是指在瀏覽器中向不同域名、不同端口或不同協(xié)議的資源發(fā)送請求。 出于安全原因,瀏覽器默認(rèn)禁止跨域請求,只允許同源策略。而當(dāng)網(wǎng)頁需要進(jìn)行跨域請求時(shí),瀏覽器會(huì)自動(dòng)發(fā)送一個(gè)預(yù)檢請求,以確定是否服務(wù)器允許實(shí)際的跨域請求。 預(yù)檢請求中包含了一些額外的頭部信息,如 Origin 和 Access-Control-Request-Method 等,用于告知服務(wù)器實(shí)際請求的方法和來源。服務(wù)器收到預(yù)檢請求后,可以根據(jù)這些頭部信息,進(jìn)行驗(yàn)證和授權(quán)判斷。如果服務(wù)器認(rèn)可該跨域請求,將返回一個(gè)包含 Access-Control-Allow-Origin 等頭部信息的響應(yīng),瀏覽器才會(huì)繼續(xù)發(fā)送實(shí)際的跨域請求。 使用預(yù)檢請求機(jī)制可以有效地防范跨域請求帶來的安全風(fēng)險(xiǎn),保護(hù)用戶數(shù)據(jù)和隱私。 版權(quán)聲明:本文為CSDN博主「程序員小豪」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。 |
|