CORS

CORS 是什么?

跨域資源共享 是一種機(jī)制怯伊,它使用額外的頭來告訴瀏覽器 讓運(yùn)行在一個(gè) origin (domain) 上的Web應(yīng)用被準(zhǔn)許訪問來自不同源服務(wù)器上的指定的資源。當(dāng)一個(gè)資源從與該資源本身所在的服務(wù)器不同的域、協(xié)議或端口請求一個(gè)資源時(shí)簇爆,資源會(huì)發(fā)起一個(gè)跨域 HTTP 請求

什么情況下需要使用CORS爽撒?

  1. XMLHttpRequest 和 fetch 請求
  2. WebGL
  3. Web字體
  4. 使用 drawImg 將 image/video 繪制到 canvas 上
  5. 樣式表

CORS 請求的規(guī)范

當(dāng)瀏覽器檢測到某個(gè)請求跨域之后入蛆, 就會(huì)根據(jù)請求的類型發(fā)送CORS規(guī)定的網(wǎng)絡(luò)請求。具體是指硕勿,簡單請求和非簡單請求具有差異性哨毁。

對于簡單請求, 只要服務(wù)端允許跨域源武, 具體是設(shè)置了Access-Control-Allow-Origin字段為*扼褪。這樣會(huì)帶來安全問題想幻, 后面會(huì)繼續(xù)討論。

對于非簡單請求话浇, 一般都會(huì)對服務(wù)器的數(shù)據(jù)進(jìn)行一些操作脏毯, 所以會(huì)首先發(fā)起預(yù)檢請求,詢問服務(wù)器是否允許這次的訪問幔崖。如果允許食店, 在發(fā)起正常的網(wǎng)絡(luò)請求。

預(yù)檢請求

使用HTTP1.1的OPTIONS方法發(fā)起預(yù)檢請求赏寇, 這個(gè)請求用于向服務(wù)端獲取更多的信息吉嫩, 但是不會(huì)對服務(wù)器的資源造成影響。
預(yù)檢請求會(huì)攜帶一下兩個(gè)字段:

Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER, Content-Type

首部字段 Access-Control-Request-Method 告知服務(wù)器嗅定,實(shí)際請求將使用 POST方法自娩。首部字段Access-Control-Request-Headers 告知服務(wù)器,實(shí)際請求將攜帶兩個(gè)自定義請求首部字段:X-PINGOTHERContent-Type露戒。服務(wù)器據(jù)此決定椒功,該實(shí)際請求是否被允許。

預(yù)檢請求的響應(yīng)

瀏覽器發(fā)起預(yù)檢請求之后智什,服務(wù)器發(fā)送回響應(yīng)动漾。響應(yīng)攜帶如下重要字段:

Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
Access-Control-Max-Age: 86400

Access-Control-Allow-Methods: 表示允許請求的方法有POST, GET, OPTIONS
Access-Control-Allow-Headers: 請求允許的頭部信息類型為: X-PINGOTHER, Content-Type, 逗號(hào)分割列表。
Access-Control-Max-Age: 此次預(yù)檢請求的有效期荠锭, 86400秒旱眯, 在有效期內(nèi), 發(fā)送相同請求不需要再發(fā)送預(yù)檢請求证九,如果超過這個(gè)時(shí)間删豺, 對于同一個(gè)請求, 需要再次發(fā)起預(yù)檢請求愧怜。

HTTP 首部響應(yīng)字段

Access-Control-Allow-Origin: <origin>: origin 參數(shù)的值指定了允許訪問該資源的外域 URI呀页。對于不需要攜帶身份憑證的請求,服務(wù)器可以指定該字段的值為通配符(*)拥坛,表示允許來自所有域的請求蓬蝶。
Access-Control-Max-Age: <delta-seconds>: 指定一次預(yù)檢請求的有效期。有效期內(nèi)不會(huì)再次發(fā)送預(yù)檢請求猜惋。
Access-Control-Allow-Methods: <method>[, <method>]*: 允許請求的方法(get丸氛, post ...)
Access-Control-Expose-Headers: X-My-Custom-Header, X-Another-Custom-Header: 服務(wù)器把允許瀏覽器訪問的頭放入白名單.
在跨域訪問時(shí),XMLHttpRequest對象的getResponseHeader()方法只能拿到一些最基本的響應(yīng)頭著摔,Cache-Control缓窜、Content-Language、Content-Type、Expires禾锤、Last-Modified私股、Pragma,如果要訪問其他頭恩掷,則需要服務(wù)器設(shè)置本響應(yīng)頭庇茫。
Access-Control-Allow-Headers: <field-name>[, <field-name>]*: 預(yù)檢響應(yīng)告知瀏覽器允許的實(shí)際請求頭類型。

CORS withCredentials 屬性

CORS請求默認(rèn)不發(fā)送Cookie和HTTP認(rèn)證信息螃成。如果要把Cookie發(fā)到服務(wù)器旦签,一方面要服務(wù)器同意, 另一方面寸宏,開發(fā)者必須在AJAX請求中打開withCredentials屬性宁炫。
server:

Access-Control-Allow-Credentials: true

developer:

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

二者缺一不可。
需要注意的是氮凝,如果要發(fā)送Cookie羔巢,Access-Control-Allow-Origin就不能設(shè)為星號(hào),必須指定明確的罩阵、與請求網(wǎng)頁一致的域名竿秆。同時(shí),Cookie依然遵循同源政策稿壁,只有用服務(wù)器域名設(shè)置的Cookie才會(huì)上傳幽钢,其他域名的Cookie并不會(huì)上傳,且(跨源)原網(wǎng)頁代碼中的document.cookie也無法讀取服務(wù)器域名下的Cookie傅是。

HTTP 首部請求字段

Origin: <origin>: 表示請求的源匪燕, origin 參數(shù)的值為源站 URI。它不包含任何路徑信息喧笔,只是服務(wù)器名稱帽驯。不管是否為跨域請求,ORIGIN 字段總是被發(fā)送书闸。
Access-Control-Request-Method: <method>: 將實(shí)際請求所使用的 HTTP 方法告訴服務(wù)器尼变。
Access-Control-Request-Headers: <field-name>[, <field-name>]*: 將實(shí)際請求所攜帶的首部字段告訴服務(wù)器。

以上浆劲, 來自MDN嫌术。

瀏覽器阻止跨域的兩種方式

  1. 請求正常發(fā)起, 但是返回的數(shù)據(jù)被瀏覽器攔截
  2. 請求發(fā)起的時(shí)候被瀏覽器攔截

CORS 的隱患

CSRF(Cross-site request forgery)跨站請求偽造
利用可跨域這一特性梳侨。

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛉威,一起剝皮案震驚了整個(gè)濱河市日丹,隨后出現(xiàn)的幾起案子走哺,更是在濱河造成了極大的恐慌,老刑警劉巖哲虾,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丙躏,死亡現(xiàn)場離奇詭異择示,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)晒旅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門栅盲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人废恋,你說我怎么就攤上這事谈秫。” “怎么了鱼鼓?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵拟烫,是天一觀的道長。 經(jīng)常有香客問我迄本,道長硕淑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任嘉赎,我火速辦了婚禮置媳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘公条。我一直安慰自己拇囊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布靶橱。 她就那樣靜靜地躺著寂拆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抓韩。 梳的紋絲不亂的頭發(fā)上纠永,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機(jī)與錄音谒拴,去河邊找鬼尝江。 笑死,一個(gè)胖子當(dāng)著我的面吹牛英上,可吹牛的內(nèi)容都是我干的炭序。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼苍日,長吁一口氣:“原來是場噩夢啊……” “哼惭聂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起相恃,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤辜纲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耕腾,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡见剩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扫俺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苍苞。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖狼纬,靈堂內(nèi)的尸體忽然破棺而出羹呵,到底是詐尸還是另有隱情,我是刑警寧澤疗琉,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布担巩,位于F島的核電站,受9級(jí)特大地震影響没炒,放射性物質(zhì)發(fā)生泄漏涛癌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一送火、第九天 我趴在偏房一處隱蔽的房頂上張望拳话。 院中可真熱鬧,春花似錦种吸、人聲如沸弃衍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镜盯。三九已至,卻和暖如春猖败,著一層夾襖步出監(jiān)牢的瞬間速缆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工恩闻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留艺糜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓幢尚,卻偏偏與公主長得像破停,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子尉剩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

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

  • 引用自HTTP訪問控制(CORS) 當(dāng) Web 資源請求由其它域名或端口提供的資源時(shí)真慢,會(huì)發(fā)起跨域 HTTP 請求(...
    有涯逐無涯閱讀 2,588評論 0 4
  • 什么是跨域HTTP請求 現(xiàn)代瀏覽器出于安全的考慮,使用 XMLHttpRequest對象發(fā)起 HTTP請求時(shí)必須遵...
    孤獨(dú)的人最善良閱讀 1,182評論 0 0
  • CORS是一個(gè)W3C標(biāo)準(zhǔn)理茎,全稱是"跨域資源共享"(Cross-origin resource sharing)黑界。 ...
    奇特思維家閱讀 1,121評論 0 3
  • 前沿: 最近總聽到同事聊跨域得問題管嬉,于是自己抽空仔細(xì)的查閱了一下關(guān)于跨域的知識(shí)。說到跨域园爷,就得提到同源,跨域是指一...
    戈弋圖閱讀 1,810評論 0 4
  • CORS是一個(gè)W3C標(biāo)準(zhǔn)式撼,全稱是"跨域資源共享"(Cross-origin resource sharing)童社。 ...
    起名字太累閱讀 946評論 0 2