什么是跨域&跨域的解決方案

什么是同源策略沐绒?

同源是指"協(xié)議+域名+端口"三者相同俩莽。

同源策略是一種約定,它是瀏覽器最核心也最基本的安全功能乔遮,如果缺少了同源策略扮超,瀏覽器很容易受到XSS、CSRF等攻擊蹋肮。
同源策略
什么是跨域?

當協(xié)議出刷、子域名、主域名坯辩、端口號中任意一個不相同時馁龟,都算作不同域。不同域之間相互請求資源漆魔,就算作“跨域”坷檩。

  • 同源策略限制內容有:
    Cookie、LocalStorage改抡、IndexedDB 等存儲性內容
    DOM 和 Js對象無法獲得
    AJAX 請求發(fā)送后矢炼,結果被瀏覽器攔截了

  • 但是有三個標簽是允許跨域加載資源:
    <img src=XXX>
    <link href=XXX>
    <script src=XXX>

  • 在跨域問題上,僅僅是通過“URL的首部”來識別而不會根據域名對應的IP地址是否相同來判斷阿纤【涔啵“URL的首部”可以理解為“協(xié)議, 域名和端口必須匹配。

  • 請求跨域了欠拾,那么請求到底發(fā)出去沒有胰锌?
    跨域并不是請求發(fā)不出去,請求能發(fā)出去清蚀,服務端能收到請求并正常返回結果匕荸,只是結果被瀏覽器攔截了。你可能會疑問明明通過表單的方式可以發(fā)起跨域請求枷邪,為什么 Ajax 就不會?因為歸根結底榛搔,跨域是為了阻止用戶讀取到另一個域名下的內容,Ajax 可以獲取響應东揣,瀏覽器認為這不安全践惑,所以攔截了響應。但是表單并不會獲取新的內容嘶卧,所以可以發(fā)起跨域請求尔觉。同時也說明了跨域并不能完全阻止 CSRF,因為請求畢竟是發(fā)出去了芥吟。

跨域的解決方案?
  • 1.jsonp

  • JSONP原理:
    利用 <script> 標簽沒有跨域限制的漏洞侦铜,網頁可以得到從其他來源動態(tài)產生的 JSON 數據专甩。JSONP請求一定需要對方的服務器做支持才可以。

  • JSONP和AJAX對比
    JSONP和AJAX相同钉稍,都是客戶端向服務器端發(fā)送請求涤躲,從服務器端獲取數據的方式。但AJAX屬于同源策略贡未,JSONP屬于非同源策略(跨域請求)

  • JSONP優(yōu)缺點
    JSONP優(yōu)點是簡單兼容性好种樱,可用于解決主流瀏覽器的跨域數據訪問的問題。
    缺點是僅支持get方法具有局限性,不安全可能會遭受XSS攻擊俊卤。

  • JSONP的實現流程:
    Web前端事先定義一個用于獲取跨域響應數據的回調函數嫩挤,并通過沒有同源策略限制的script標簽發(fā)起一個請求(將回調函數的名稱放到這個請求的query參數里),然后服務端返回這個回調函數的執(zhí)行消恍,并將需要響應的數據放到回調函數的參數里岂昭,前端的script標簽請求到這個執(zhí)行的回調函數后會立馬執(zhí)行,于是就拿到了執(zhí)行的響應數據哺哼。

  • 2.cors

CORS 需要瀏覽器和后端同時支持佩抹,但實現 CORS 通信的關鍵還是后端。

服務端設置 Access-Control-Allow-Origin 就可以開啟 CORS取董。 該屬性表示哪些域名可以訪問資源棍苹,如果設置通配符則表示所有網站都可以訪問資源。

雖然設置 CORS 和前端沒什么關系茵汰,但是通過這種方式解決跨域問題的話枢里,會在發(fā)送請求時出現兩種情況,分別為簡單請求和復雜請求蹂午。
(1)簡單請求 :
GET:發(fā)送一個請求來取得服務器上的某一資源栏豺。
HEAD:只請求頁面的首部。
POST:向URL指定的資源提交數據或附加新的數據豆胸。
Content-Type 的值僅限于下列三者之一:
text/plain
multipart/form-data
application/x-www-form-urlencoded
(2)復雜請求:不是簡單請求的都屬于復雜請求奥洼。
PUT:POST方法很像,也是想服務器提交數據晚胡。但是灵奖,它們之間有不同。PUT指定了資源在服務器上的位置估盘,而POST沒有瓷患。
DELETE:刪除服務器上的某資源。
OPTIONS:它用于獲取當前URL所支持的方法遣妥。如果請求成功擅编,會有一個Allow的頭包含類似“GET,POST”這樣的信息。
TRACE:該方法被用于激發(fā)一個遠程的,應用層的請求消息回路爱态。
CONNECT:把請求連接轉換到透明的TCP/IP通道谭贪。

  • 3.postMessage

postMessage是可以跨域操作的window屬性。

用于解決以下方面的問題:
多窗口之間消息傳遞肢藐;
頁面與嵌套的iframe消息傳遞故河;

postMessage()方法允許來自不同源的腳本采用異步方式進行有限的通信吱韭,可以實現跨文本檔吆豹、多窗口、跨域消息傳遞理盆。
document.getElementById('frame').contentWindow.postMessage(傳遞的信息, 目標路徑url, 可選對象);

  • 4.websocket

Websocket是HTML5的一個持久化的協(xié)議痘煤,它實現了瀏覽器與服務器的全雙工通信,同時也是跨域的一種解決方案猿规。WebSocket和HTTP都是應用層協(xié)議衷快,都基于 TCP 協(xié)議。但是 WebSocket 是一種雙向通信協(xié)議姨俩,在建立連接之后蘸拔,WebSocket 的 server 與 client 都能主動向對方發(fā)送或接收數據。同時环葵,WebSocket 在建立連接時需要借助 HTTP 協(xié)議调窍,連接建立好了之后 client 與 server 之間的雙向通信就與 HTTP 無關了。

    1. Node中間件代理(兩次跨域)

實現原理:同源策略是瀏覽器需要遵循的標準张遭,而如果是服務器向服務器請求就無需遵循同源策略邓萨。 代理服務器,需要做以下幾個步驟:

  • 接受客戶端請求

  • 將請求 轉發(fā)給服務器

  • 拿到服務器 響應 數據

  • 將 響應 轉發(fā)給客戶端
    原理

6.nginx反向代理
實現原理類似于Node中間件代理菊卷,需要你搭建一個中轉nginx服務器缔恳,用于轉發(fā)請求。

使用nginx反向代理實現跨域洁闰,是最簡單的跨域方式歉甚。只需要修改nginx的配置即可解決跨域問題,支持所有瀏覽器扑眉,支持session纸泄,不需要修改任何代碼,并且不會影響服務器性能襟雷。
實現思路:通過nginx配置一個代理服務器(域名與domain1相同刃滓,端口不同)做跳板機,反向代理訪問domain2接口耸弄,并且可以順便修改cookie中domain信息咧虎,方便當前域cookie寫入,實現跨域登錄计呈。

參考文章:
九種跨域方式實現原理(完整版)
前端常見跨域解決方案(全)
深入跨域問題(4) - 利用代理解決跨域

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末砰诵,一起剝皮案震驚了整個濱河市征唬,隨后出現的幾起案子,更是在濱河造成了極大的恐慌茁彭,老刑警劉巖总寒,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異理肺,居然都是意外死亡摄闸,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門妹萨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來年枕,“玉大人,你說我怎么就攤上這事乎完⊙郑” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵树姨,是天一觀的道長摩桶。 經常有香客問我,道長帽揪,這世上最難降的妖魔是什么硝清? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮台丛,結果婚禮上耍缴,老公的妹妹穿的比我還像新娘。我一直安慰自己挽霉,他們只是感情好防嗡,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侠坎,像睡著了一般蚁趁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上实胸,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天他嫡,我揣著相機與錄音,去河邊找鬼庐完。 笑死钢属,一個胖子當著我的面吹牛,可吹牛的內容都是我干的门躯。 我是一名探鬼主播淆党,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了染乌?” 一聲冷哼從身側響起山孔,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荷憋,沒想到半個月后台颠,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡勒庄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年串前,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锅铅。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡酪呻,死狀恐怖,靈堂內的尸體忽然破棺而出盐须,到底是詐尸還是另有隱情,我是刑警寧澤漆腌,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布贼邓,位于F島的核電站,受9級特大地震影響闷尿,放射性物質發(fā)生泄漏塑径。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一填具、第九天 我趴在偏房一處隱蔽的房頂上張望统舀。 院中可真熱鬧,春花似錦劳景、人聲如沸誉简。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闷串。三九已至,卻和暖如春筋量,著一層夾襖步出監(jiān)牢的瞬間烹吵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工桨武, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肋拔,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓呀酸,卻偏偏與公主長得像凉蜂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內容