前后端分離架構(gòu)下的跨域問(wèn)題

來(lái)源:http://mp.weixin.qq.com/s?__biz=MjM5NTM1NDcyOQ==&mid=202557064&idx=1&sn=d24349248e5dd70e0d0bcdc0fb6e6ca5#rd

在前后端分離架構(gòu)下忧侧,難免會(huì)遇到跨域問(wèn)題酒甸。但是對(duì)于跨域,很多人并沒(méi)有多么深入的了解螟够。這里我就詳細(xì)講一下這個(gè)問(wèn)題。

同源策略與跨域

所謂跨域玫坛,英文叫做cross-domain滋觉,是網(wǎng)絡(luò)安全領(lǐng)域的一個(gè)專(zhuān)有名詞。簡(jiǎn)單點(diǎn)理解就是某些操作越過(guò)了域名的界限昌渤,訪問(wèn)了別的域名赴穗。

如果腳本可以自由訪問(wèn)其他域,就會(huì)產(chǎn)生很多安全問(wèn)題膀息。

比如般眉,假設(shè)有一個(gè)網(wǎng)上銀行系統(tǒng),你已經(jīng)登錄過(guò)了潜支,它支持一個(gè)ajax api可以進(jìn)行轉(zhuǎn)賬甸赃;有一個(gè)論壇系統(tǒng),人氣很高冗酿,但是其中有惡意腳本埠对,這個(gè)腳本會(huì)調(diào)用這個(gè)ajax api,從當(dāng)前登錄的用戶賬戶中裁替,轉(zhuǎn)1000塊到攻擊者的賬戶项玛。這樣,當(dāng)你訪問(wèn)這個(gè)論壇的時(shí)候弱判,就會(huì)被轉(zhuǎn)走1000塊襟沮,而你一點(diǎn)都不知道!

除此之外昌腰,跨域請(qǐng)求還有很多危害开伏。這不是一本關(guān)于安全的書(shū),也就不展開(kāi)講了遭商,想深入了解的可以買(mǎi)一本余弦編寫(xiě)的《Web前端黑客技術(shù)揭秘》硅则。

為了防范跨域攻擊,所有現(xiàn)代瀏覽器都遵循一套同源策略株婴。根據(jù)MDN上的定義怎虫,“如果兩個(gè)頁(yè)面擁有相同的協(xié)議(protocol)暑认,端口(如果指定),和主機(jī)大审,那么這兩個(gè)頁(yè)面就屬于同一個(gè)源(origin)”蘸际。對(duì)于違反同源策略的請(qǐng)求,除了img src等少數(shù)嵌入操作之外徒扶,都會(huì)被瀏覽器阻止粮彤。

這里需要注意的是:同源不僅僅要求相同的域名或ip,連協(xié)議和端口也必須相同姜骡。比如https://localhost和http://localhost或http://localhost:3000就不是同源的导坟,而http://localhost/api和http://localhost/views是同源的。

我們平常所說(shuō)的“跨域”其實(shí)就是指“發(fā)起不同源請(qǐng)求”圈澈,而這樣的跨域請(qǐng)求會(huì)被瀏覽器阻止惫周。

同源策略對(duì)保障互聯(lián)網(wǎng)安全有著非常重要的作用,很多安全策略都是基于同源策略的康栈。但是递递,這種同源策略會(huì)對(duì)前后端分離架構(gòu)下的開(kāi)發(fā)過(guò)程帶來(lái)很大困擾。比如啥么,即使是本地服務(wù)器登舞,也沒(méi)法和前端開(kāi)發(fā)服務(wù)器運(yùn)行在同一個(gè)端口上,這時(shí)候悬荣,跨域是必然的菠秒。而如果要讓后端程序同時(shí)提供web服務(wù),則很難發(fā)揮前端工具鏈的輕量級(jí)優(yōu)勢(shì)氯迂。那么稽煤,如何解決跨域問(wèn)題呢?

如何解決跨域問(wèn)題囚戚?

JSONP方式

最初用來(lái)解決跨域問(wèn)題的方式酵熙,叫做JSONP,它的基本原理是:跨域的“資源嵌入”是被瀏覽器允許的驰坊。所以匾二,可以通過(guò)一個(gè)script標(biāo)簽來(lái)嵌入一段來(lái)自其他服務(wù)器的腳本。由于這個(gè)腳本完全運(yùn)行在當(dāng)前域拳芙,無(wú)法訪問(wèn)第三方服務(wù)器的cookie等敏感信息察藐,所以是安全的。

JSONP的缺點(diǎn)是它只能支持GET操作舟扎,沒(méi)法支持POST等操作分飞,但是由于兼容性好等優(yōu)點(diǎn),仍然有很多網(wǎng)站采用JSONP的方式公開(kāi)自己的API供第三方調(diào)用睹限。

在Angular中譬猫,$http內(nèi)置了對(duì)JSONP的支持讯檐,它的調(diào)用接口也和其他方法沒(méi)什么區(qū)別,使用起來(lái)非常簡(jiǎn)單染服。

反向代理方式

要想解決跨域問(wèn)題别洪,最簡(jiǎn)單徹底的方法當(dāng)然是把他們拉到一個(gè)域下,而這就是該“反向代理”發(fā)揮作用的時(shí)候了柳刮。

所謂反向代理挖垛,就是在自己的域名下架設(shè)一個(gè)Web服務(wù)器,這個(gè)服務(wù)器會(huì)把請(qǐng)求轉(zhuǎn)發(fā)給第三方服務(wù)器秉颗,然后把結(jié)果返回給客戶端痢毒。

這時(shí)候,在客戶端看來(lái)蚕甥,自己就是在和這臺(tái)反向代理服務(wù)器打交道哪替,而不知道第三方服務(wù)器的存在。

所以梢灭,如果有一個(gè)Web服務(wù)程序,它同時(shí)提供了反向代理功能和靜態(tài)文件服務(wù)功能蒸其,靜態(tài)文件服務(wù)負(fù)責(zé)渲染前端頁(yè)面敏释,反向代理則提供對(duì)第三方服務(wù)器的透明訪問(wèn)。那么前端和后端就變成了同源的摸袁,不再受同源策略的約束钥顽。

那么,有這樣的Web服務(wù)程序嗎靠汁?有蜂大,而且不止一個(gè)。事實(shí)上蝶怔,幾乎所有的主流Web服務(wù)器都提供了反向代理功能奶浦。這里僅以nginx為例來(lái)示范反向代理的配置方式,其他Web服務(wù)器請(qǐng)搜相應(yīng)的文檔自行研究踢星。

server {

listen 80;

server_name your.domain.name;

location / {

proxy_pass http://localhost:5000/; # 把根路徑下的請(qǐng)求轉(zhuǎn)發(fā)給前端工具鏈(如gulp)打開(kāi)的開(kāi)發(fā)服務(wù)器澳叉,如果是產(chǎn)品環(huán)境,則使用root等指令配置為靜態(tài)文件服務(wù)器

}

location /api/ {

proxy_pass http://localhost:8080/service/; # 吧 /api 路徑下的請(qǐng)求轉(zhuǎn)發(fā)給真正的后端服務(wù)器

proxy_set_header Host $http_host;? # 把host頭傳過(guò)去沐悦,后端服務(wù)程序?qū)⑹盏統(tǒng)our.domain.name成洗,否則收到的是localhost:8080

proxy_cookie_path /api /service;?? # 把cookie中的path部分從/api替換成/service

proxy_cookie_domain localhost:8080 your.domain.name; # 把cookie的path部分從localhost:8080替換成your.domain.name

}

}

注意最后這兩句話,由于cookie中存在一個(gè)path機(jī)制藏否,可以對(duì)同一個(gè)域下的不同子域進(jìn)行區(qū)分瓶殃。所以,如果后端所使用的路徑是/service副签,而前端使用的路徑是/api遥椿,那么前端將不能訪問(wèn)后端的cookie基矮,這就導(dǎo)致登錄等操作所寫(xiě)入的cookie無(wú)法正常傳入傳出,其表現(xiàn)則是登錄始終沒(méi)有效果修壕。cookie的domain機(jī)制也是類(lèi)似的原理愈捅。

現(xiàn)實(shí)中的后端服務(wù)器,使用path機(jī)制的很多慈鸠,所以這項(xiàng)設(shè)置非常實(shí)用蓝谨。

CORS方式

這是W3C提供的另一種跨域方式。作為一項(xiàng)標(biāo)準(zhǔn)的跨域規(guī)范青团,CORS本應(yīng)該是最值得采用的譬巫。 問(wèn)題在于,老式瀏覽器不支持CORS督笆,而我們顯然還沒(méi)到可以無(wú)視老式瀏覽器的時(shí)候芦昔。 所以,只要有可能娃肿,就應(yīng)該優(yōu)先采用反向代理的方式咕缎。

CORS的原理是基于服務(wù)方授權(quán)的模式,也就是說(shuō)提供服務(wù)的程序要主動(dòng)通過(guò)CORS回應(yīng)頭來(lái)聲明自己信任哪些源(協(xié)議+域名+端口)料扰。 由于得到了服務(wù)方的授權(quán)凭豪,瀏覽器就可以放行來(lái)自這些域的請(qǐng)求了。

參考:http://www.cnblogs.com/mashch/articles/4261448.html

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS

http://www.tuicool.com/articles/3q2iaqb

前后臺(tái)分離晒杈,nodeJS轉(zhuǎn)發(fā)請(qǐng)求實(shí)現(xiàn)跨域訪問(wèn):http://blog.csdn.net/u011783224/article/details/52214949

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嫂伞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拯钻,更是在濱河造成了極大的恐慌帖努,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粪般,死亡現(xiàn)場(chǎng)離奇詭異拼余,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)亩歹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)姿搜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人捆憎,你說(shuō)我怎么就攤上這事舅柜。” “怎么了躲惰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵致份,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我础拨,道長(zhǎng)氮块,這世上最難降的妖魔是什么绍载? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮滔蝉,結(jié)果婚禮上击儡,老公的妹妹穿的比我還像新娘。我一直安慰自己蝠引,他們只是感情好阳谍,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著螃概,像睡著了一般矫夯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吊洼,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天训貌,我揣著相機(jī)與錄音,去河邊找鬼冒窍。 笑死递沪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的综液。 我是一名探鬼主播款慨,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼意乓!你這毒婦竟也來(lái)了樱调?” 一聲冷哼從身側(cè)響起约素,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤届良,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后圣猎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體士葫,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年送悔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了慢显。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡欠啤,死狀恐怖荚藻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洁段,我是刑警寧澤应狱,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站祠丝,受9級(jí)特大地震影響疾呻,放射性物質(zhì)發(fā)生泄漏除嘹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一岸蜗、第九天 我趴在偏房一處隱蔽的房頂上張望尉咕。 院中可真熱鬧,春花似錦璃岳、人聲如沸年缎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)晦款。三九已至,卻和暖如春枚冗,著一層夾襖步出監(jiān)牢的瞬間缓溅,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工赁温, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坛怪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓股囊,卻偏偏與公主長(zhǎng)得像袜匿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子稚疹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理居灯,服務(wù)發(fā)現(xiàn),斷路器内狗,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139
  • 序言:使用Nginx反向代理怪嫌,可以解決跨域無(wú)權(quán)和Session丟失的問(wèn)題,十分方便柳沙。下面我們以前后端分離為案例岩灭,展...
    一只襪子閱讀 32,220評(píng)論 4 37
  • 什么是跨域? 2.) 資源嵌入:赂鲤、噪径、、等dom標(biāo)簽数初,還有樣式中background:url()找爱、@font-fac...
    電影里的夢(mèng)i閱讀 2,367評(píng)論 0 5
  • 前提提示:最近的項(xiàng)目中,采用了前后端分離的開(kāi)發(fā)模式泡孩。前端通過(guò)fetch api訪問(wèn)后端rest api车摄。其間很自然...
    阿太哥閱讀 468評(píng)論 0 1
  • 有一位離婚的女人在得知前任再婚萬(wàn)分感慨练般,聽(tīng)說(shuō)他再婚后很幸福更是睜大了眼睛矗漾,連說(shuō)不可能。 她說(shuō)薄料,你們只看到了他在外面...
    運(yùn)安閣主閱讀 600評(píng)論 0 0