Http Headers詳解

一、HTTP 請(qǐng)求內(nèi)容

由于最新的http2并沒(méi)有被各大瀏覽器廣泛使用襟沮,所以本文是基于http/1.1所編寫的。
同時(shí)經(jīng)過(guò)檢測(cè)我們也發(fā)現(xiàn),chrome等瀏覽器也正是使用http/1.1版本的盹愚。

  • 關(guān)于http/1.1協(xié)議的詳情,可查看官方文檔

我們打開(kāi)chromenetwork點(diǎn)擊任何一條request請(qǐng)求站故,即可發(fā)現(xiàn)杯拐,每個(gè)http headers都包含以下部分:GenaralRequest Headers世蔗,Response HeadersRequest Payload朗兵。General(不屬于headers只用于收集請(qǐng)求url和響應(yīng)的status`等信息)

  • Request Headers(請(qǐng)求headers)
  • Response Headers(響應(yīng)headers)
  • Request Payload(請(qǐng)求參數(shù))

二污淋、HTTP Headers分類

http heanders中,為了方便余掖,分為以下幾類:Genaral headers(和上面說(shuō)的General不同寸爆,這個(gè)只是為了方便統(tǒng)計(jì)),Request Headers盐欺,Response Headers赁豆,Entity Headers(也是為了方便統(tǒng)計(jì))。

所以冗美,一個(gè)完整的請(qǐng)求頭/響應(yīng)頭魔种,應(yīng)該除了自身,還包括 General HeadersEntity Headers粉洼。

  • 1节预、Genaral headers: 同時(shí)適用于請(qǐng)求和響應(yīng)消息叶摄,但與最終消息傳輸?shù)臄?shù)據(jù)無(wú)關(guān)的消息頭。
  • 2安拟、Request Headers: 包含更多有關(guān)要獲取的資源或客戶端本身信息的消息頭蛤吓。
  • 3、Response Headers:包含有關(guān)響應(yīng)的補(bǔ)充信息糠赦,如其位置或服務(wù)器本身(名稱和版本等)的消息頭会傲。
  • 4、Entity Headers:包含有關(guān)實(shí)體主體的更多信息拙泽,比如主體長(zhǎng)(Content-Length)度或其MIME類型淌山。

1、Genaral headers

Cache-Control——控制緩存的行為奔滑; 詳情

Connection——決定當(dāng)前的事務(wù)完成后艾岂,是否會(huì)關(guān)閉網(wǎng)絡(luò)連接; 詳情

Date——?jiǎng)?chuàng)建報(bào)文的日期時(shí)間朋其; 詳情

Keep-Alive——用來(lái)設(shè)置超時(shí)時(shí)長(zhǎng)和最大請(qǐng)求數(shù)王浴;詳情

Via——代理服務(wù)器的相關(guān)信息;詳情

Warning——錯(cuò)誤通知梅猿;詳情

Trailer——允許發(fā)送方在分塊發(fā)送的消息后面添加額外的元信息氓辣; 詳情

Transfer-Encoding——指定報(bào)文主體的傳輸編碼方式;詳情

Upgrade——升級(jí)為其他協(xié)議袱蚓;

2钞啸、Request headers

Accept——客戶端可以處理的內(nèi)容類型;詳情

Accept-Charset——客戶端可以處理的字符集類型喇潘;詳情

Accept-Encoding——客戶端能夠理解的內(nèi)容編碼方式体斩;詳情

Accept-Language——客戶端可以理解的自然語(yǔ)言;詳情

Authorization——Web 認(rèn)證信息颖低;詳情

Cookie——通過(guò)Set-Cookie設(shè)置的值絮吵;詳情

DNT——表明用戶對(duì)于網(wǎng)站追蹤的偏好;詳情

From——用戶的電子郵箱地址忱屑;詳情

Host——請(qǐng)求資源所在服務(wù)器蹬敲;詳情

If-Match——比較實(shí)體標(biāo)記(ETag);詳情

If-Modified-Since——比較資源的更新時(shí)間莺戒;詳情

If-None-Match——比較實(shí)體標(biāo)記(與 If-Match 相反)伴嗡;詳情

If-Range——資源未更新時(shí)發(fā)送實(shí)體 Byte 的范圍請(qǐng)求;詳情

If-Unmodified-Since——比較資源的更新時(shí)間(與 If-Modified-Since 相反)从铲;詳情

Origin——表明了請(qǐng)求來(lái)自于哪個(gè)站點(diǎn)瘪校;詳情

Proxy-Authorization——代理服務(wù)器要求客戶端的認(rèn)證信息;詳情

Range——實(shí)體的字節(jié)范圍請(qǐng)求名段;詳情

Referer——對(duì)請(qǐng)求中 URI 的原始獲取方渣淤;詳情

TE——指定用戶代理希望使用的傳輸編碼類型赏寇;詳情

Upgrade-Insecure-Requests——表示客戶端優(yōu)先選擇加密及帶有身份驗(yàn)證的響應(yīng);詳情

User-Agent——瀏覽器信息价认;詳情

3嗅定、Response Headers

Accept-Ranges——是否接受字節(jié)范圍請(qǐng)求;詳情

Age——消息對(duì)象在緩存代理中存貯的時(shí)長(zhǎng)用踩,以秒為單位渠退;詳情

Clear-Site-Data——表示清除當(dāng)前請(qǐng)求網(wǎng)站有關(guān)的瀏覽器數(shù)據(jù)(cookie,存儲(chǔ)脐彩,緩存)碎乃;詳情

Content-Security-Policy——允許站點(diǎn)管理者在指定的頁(yè)面控制用戶代理的資源;詳情

Content-Security-Policy-Report-Only—— 詳情

ETag——資源的匹配信息惠奸;鏈接描述

Location——令客戶端重定向至指定 URI梅誓;詳情

Proxy-Authenticate——代理服務(wù)器對(duì)客戶端的認(rèn)證信息;詳情

Public-Key-Pins——包含該Web 服務(wù)器用來(lái)進(jìn)行加密的 public key (公鑰)信息佛南;詳情

Public-Key-Pins-Report-Only——設(shè)置在公鑰固定不匹配時(shí)梗掰,發(fā)送錯(cuò)誤信息到report-uri;詳情

Referrer-Policy——用來(lái)監(jiān)管哪些訪問(wèn)來(lái)源信息——會(huì)在 Referer 中發(fā)送嗅回;詳情

Server——HTTP 服務(wù)器的安裝信息及穗;詳情

Set-Cookie——服務(wù)器端向客戶端發(fā)送 cookie;詳情

Strict-Transport-Security——它告訴瀏覽器只能通過(guò)HTTPS訪問(wèn)當(dāng)前資源绵载;詳情

Timing-Allow-Origin——用于指定特定站點(diǎn)埂陆,以允許其訪問(wèn)Resource Timing API提供的相關(guān)信息;詳情

Tk——顯示了對(duì)相應(yīng)請(qǐng)求的跟蹤情況娃豹;詳情

Vary——服務(wù)器緩存的管理信息焚虱;詳情

WWW-Authenticate——定義了使用何種驗(yàn)證方式去獲取對(duì)資源的連接;詳情

X-XSS-Protection——當(dāng)檢測(cè)到跨站腳本攻擊 (XSS)時(shí)懂版,瀏覽器將停止加載頁(yè)面著摔;詳情

4、Entity Headers

Allow——客戶端可以處理的內(nèi)容類型定续,這種內(nèi)容類型用MIME類型來(lái)表示;詳情

Content-Encoding——用于對(duì)特定媒體類型的數(shù)據(jù)進(jìn)行壓縮禾锤;詳情

Content-Language——訪問(wèn)者希望采用的語(yǔ)言或語(yǔ)言組合私股;詳情

Content-Length——發(fā)送給接收方的消息主體的大小恩掷;詳情

Content-Location——替代對(duì)應(yīng)資源的 URI倡鲸;詳情

Content-Range——實(shí)體主體的位置范圍;詳情

Content-Type——告訴客戶端實(shí)際返回的內(nèi)容的內(nèi)容類型黄娘;詳情

Expires——包含日期/時(shí)間峭状, 即在此時(shí)候之后克滴,響應(yīng)過(guò)期;詳情

Last-Modified——資源的最后修改日期時(shí)間优床;詳情

三劝赔、HTTP 具體應(yīng)用

1、Cookie

HTTP 協(xié)議是無(wú)狀態(tài)的胆敞,主要是為了讓 HTTP 協(xié)議盡可能簡(jiǎn)單着帽,使得它能夠處理大量事務(wù)。HTTP/1.1引入 Cookie 來(lái)保存狀態(tài)信息移层。

Cookie是服務(wù)器發(fā)送到用戶瀏覽器并保存在本地的一小塊數(shù)據(jù)仍翰,它會(huì)在瀏覽器之后向同一服務(wù)器再次發(fā)起請(qǐng)求時(shí)自動(dòng)被攜帶上,用于告知服務(wù)端兩個(gè)請(qǐng)求是否來(lái)自同一瀏覽器观话。由于之后每次請(qǐng)求都會(huì)需要攜帶 Cookie 數(shù)據(jù)予借,因此會(huì)帶來(lái)額外的性能開(kāi)銷(尤其是在移動(dòng)環(huán)境下)。

Cookie 曾一度用于客戶端數(shù)據(jù)的存儲(chǔ)频蛔,因?yàn)楫?dāng)時(shí)并沒(méi)有其它合適的存儲(chǔ)辦法而作為唯一的存儲(chǔ)手段灵迫,但現(xiàn)在隨著現(xiàn)代瀏覽器開(kāi)始支持各種各樣的存儲(chǔ)方式,Cookie 漸漸被淘汰帽驯。新的瀏覽器 API 已經(jīng)允許開(kāi)發(fā)者直接將數(shù)據(jù)存儲(chǔ)到本地龟再,如使用 Web storage API(本地存儲(chǔ)和會(huì)話存儲(chǔ))或IndexedDB

a尼变、創(chuàng)建過(guò)程

服務(wù)器發(fā)送的響應(yīng)報(bào)文包含Set-Cookie首部字段利凑,客戶端得到響應(yīng)報(bào)文后把 Cookie 內(nèi)容保存到瀏覽器中。

HTTP/1.1 200 OK

Content-type: text/html

Set-Cookie: PHPSESSID=kq8v6iujarsgflkeq7shmai9c7
  • 客戶端之后對(duì)同一個(gè)服務(wù)器發(fā)送請(qǐng)求時(shí)嫌术,會(huì)從瀏覽器中取出 Cookie 信息并通過(guò) Cookie 請(qǐng)求首部字段發(fā)送給服務(wù)器哀澈。
GET /sample_page.html HTTP/1.1

Host: www.example.org

Cookie: PHPSESSID=kq8v6iujarsgflkeq7shmai9c7

b、分類

會(huì)話期 Cookie:瀏覽器關(guān)閉之后它會(huì)被自動(dòng)刪除度气,也就是說(shuō)它僅在會(huì)話期內(nèi)有效割按。

持久性 Cookie:指定一個(gè)特定的過(guò)期時(shí)間(Expires)或有效期(max-age)之后就成為了持久性的 Cookie

安全 Cookie:指定HttpOnly磷籍,這樣cookie不能使用 JavaScript經(jīng)由 Document.cookie 屬性适荣,來(lái)防范跨站腳本攻擊(XSS)

HTTPS Cookie: 指定Secure院领,只有在請(qǐng)求使用SSLHTTPS協(xié)議的時(shí)候才會(huì)被發(fā)送到服務(wù)器弛矛。

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;HttpOnly

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;Secure

2、緩存

降低客戶端獲取資源的延遲:緩存通常位于內(nèi)存中比然,讀取緩存的速度更快丈氓。并且緩存在地理位置上也有可能比源服務(wù)器來(lái)得近,例如瀏覽器緩存。

流程圖:

a万俗、判斷cache-control或者expires是否有效

  • max-age值為緩存的毫秒數(shù)湾笛。

  • 可以看到response-headers中設(shè)置了cache-control,并大于0闰歪,則下次直接從緩存(from disk cache)中獲取

b嚎研、Etag判斷

當(dāng)發(fā)現(xiàn)Cache-Control設(shè)置的毫秒數(shù)過(guò)期了,則直接發(fā)送請(qǐng)求:

——如果響應(yīng)中包含Etag(服務(wù)器生成的值)课竣,則瀏覽器再次向web服務(wù)器發(fā)送請(qǐng)求并帶上頭If-None-MatchEtag的值)嘉赎,web服務(wù)器收到請(qǐng)求后發(fā)現(xiàn)有頭If-None-Match則與被請(qǐng)求資源的相應(yīng)校驗(yàn)串進(jìn)行比對(duì),決定返回200或304(瀏覽器會(huì)從緩存中獲取)于樟。
——如果響應(yīng)中不包含Etag公条,則進(jìn)行Last-Modified判斷

c、Last-Modified判斷

當(dāng)發(fā)現(xiàn)response header中含有Last-Modified迂曲,則再次向web服務(wù)器請(qǐng)求時(shí)帶上頭If-Modified-Since靶橱,web服務(wù)器收到請(qǐng)求后發(fā)現(xiàn)有頭If-Modified-Since則與被請(qǐng)求資源的最后修改時(shí)間進(jìn)行比對(duì),然后服務(wù)器決定返回200或者304(緩存)

瀏覽器強(qiáng)制告訴服務(wù)器不緩存資源:

//request headers

Cache-Control:max-age=0, no-cache

四路捧、HTTP 請(qǐng)求 method

五淮逊、HTTP 狀態(tài)碼

1规婆、1XX

  • 100(continue) 表明到目前為止都很正常,客戶端可以繼續(xù)發(fā)送請(qǐng)求或者忽略這個(gè)響應(yīng)。

2霉猛、2XX

  • 200(OK) 表示從客戶端發(fā)來(lái)的請(qǐng)求在服務(wù)器端被正常處理了邪财。

  • 204(No Content) 該狀態(tài)碼代表服務(wù)器接收的請(qǐng)求已成功處理啥刻,但在返回的響應(yīng)報(bào)文中不含實(shí)體的主體部分煤搜。

  • 206(Partial Content) 該狀態(tài)碼表示客戶端進(jìn)行了范圍請(qǐng)求,而服務(wù)器成功執(zhí)行了這部分的 GET 請(qǐng)求凡伊。響應(yīng)報(bào)文中包含由 Content-Range 指定范圍的實(shí)體內(nèi)容零渐。

3、3XX

  • 301(Moved Permanently) 永久性重定向系忙。該狀態(tài)碼表示請(qǐng)求的資源已被分配了新的 URI诵盼,以后應(yīng)使用資源現(xiàn)在所指的 URI。

  • 302(Found) 臨時(shí)性重定向银还。比如在沒(méi)有登錄情況下訪問(wèn)網(wǎng)站"個(gè)人中心"风宁,會(huì)重定向到登錄頁(yè),但是你登錄后蛹疯,訪問(wèn)個(gè)人中心時(shí)戒财,它又不會(huì)重定向到其他地方了。

  • 303(See Other) 和 302 有著相同的功能苍苞,但是 303 明確要求客戶端應(yīng)該采用 GET 方法獲取資源。

  • 304(Not Modified) 如果請(qǐng)求報(bào)文首部包含一些條件,例如:If-Match羹呵,If-Modified-Since骂际,If-None-Match,If-Range冈欢,If-Unmodified-Since歉铝,如果不滿足條件,則服務(wù)器會(huì)返回 304 狀態(tài)碼凑耻。

4太示、4XX

  • 400(Bad Request) 該狀態(tài)碼表示請(qǐng)求報(bào)文中存在語(yǔ)法錯(cuò)誤。當(dāng)錯(cuò)誤發(fā)生時(shí)香浩,需修改請(qǐng)求的內(nèi)容后再次發(fā)送請(qǐng)求类缤。

  • 401 Unauthorized 該狀態(tài)碼表示發(fā)送的請(qǐng)求需要有認(rèn)證信息。返回含有 401 的響應(yīng)必須包含一個(gè)適用于被請(qǐng)求資源的 WWW-Authenticate 首部用以詢問(wèn)用戶信息邻吭。當(dāng)瀏覽器初次接收到 401 響應(yīng)餐弱,會(huì)彈出認(rèn)證用的對(duì)話窗口。第二次接收到囱晴,則不彈出膏蚓,直接表示認(rèn)證失敗。

  • 403(Forbidden) 對(duì)請(qǐng)求資源的訪問(wèn)被服務(wù)器拒絕了畸写,一般是未獲得文件系統(tǒng)的訪問(wèn)授權(quán)驮瞧,問(wèn)權(quán)限出現(xiàn)某些問(wèn)題。

  • 404(Not Found) 瀏覽器地址錯(cuò)誤枯芬。服務(wù)器找不到對(duì)應(yīng)資源论笔。

5、5XX

  • 500(Internal Server Error) 服務(wù)器在執(zhí)行時(shí)報(bào)錯(cuò)破停。

  • 503(Service Unavailable) 服務(wù)器暫時(shí)處于超負(fù)載或正在進(jìn)行停機(jī)維護(hù)翅楼,無(wú)響應(yīng)。一般需要重啟服務(wù)器即可真慢。

六毅臊、MIME類型

瀏覽器通常使用MIME類型(而不是文件擴(kuò)展名)來(lái)確定如何處理文檔;因此設(shè)置正確的MIME類型附加到headers是非常重要的黑界。

除了上面的基本的5中類型外管嬉,還有一種類型,即multipart類型朗鸠。

multipart/form-data 在表單中通過(guò)post上傳
multipart/byteranges(不常用蚯撩,不知道)

一般的,如果沒(méi)有顯示的在request headersAllow上設(shè)置類型烛占,瀏覽器的MIME嗅探會(huì)推測(cè)出來(lái)對(duì)應(yīng)的類型胎挎,如果發(fā)現(xiàn)找不到特定的子類型沟启,則給出默認(rèn)類型,比如對(duì)于text文件類型若沒(méi)有特定的subtype犹菇,就使用 text/plain德迹。類似的,二進(jìn)制文件沒(méi)有特定或已知的 subtype揭芍,即使用 application/octet-stream胳搞。

七、HTTP 使用的認(rèn)證方式

1称杨、BASIC 認(rèn)證(基本認(rèn)證)

2肌毅、DIGEST 認(rèn)證(摘要認(rèn)證)

3、SSL 客戶端認(rèn)證

4姑原、FormBase 認(rèn)證(基于表單認(rèn)證)

1悬而、BASIC 認(rèn)證

當(dāng)在瀏覽器端輸入一個(gè)url時(shí),會(huì)自動(dòng)彈出一個(gè)框页衙,要求輸入用戶名和密碼摊滔。此種方式為basic認(rèn)證。

下面是認(rèn)證執(zhí)行過(guò)程:

  • 第一步:在瀏覽器地址欄中輸入 http://localhost:8080/auth

  • 第二步: 服務(wù)器執(zhí)行店乐,發(fā)現(xiàn)需要認(rèn)證艰躺,返回這個(gè)請(qǐng)求的響應(yīng)。并在response headers中添加WWW-Authenticate眨八,將http請(qǐng)求狀態(tài)設(shè)置為401.

瀏覽器檢測(cè)到WWW-Authenticate為basic后腺兴,自動(dòng)彈出框。

  • 第三步: 當(dāng)用戶看到框后廉侧,輸入 用戶名和密碼页响,瀏覽器會(huì)將用戶名和密碼通過(guò)base64方式編碼,然后添加到 request headers的 Authorization 中發(fā)送給服務(wù)器段誊,瀏覽器驗(yàn)證通過(guò)闰蚕,返回200狀態(tài)碼

如果驗(yàn)證不通過(guò),則繼續(xù)返回狀態(tài)碼401连舍,提示驗(yàn)證失敗没陡。

缺點(diǎn):

BASIC 認(rèn)證雖然采用Base64編碼方式,但這不是加密處理索赏。不需要任何附加信息即可對(duì)其解碼盼玄。換言之,由于明文解碼后就是用戶ID和密碼,在HTTP等非加密通信的線路上進(jìn)行BASIC 認(rèn)證的過(guò)程中潜腻,如果被人竊聽(tīng)埃儿,被盜的可能性極高。

2融涣、DIGEST 認(rèn)證

為了彌補(bǔ)Basic認(rèn)證沒(méi)有加密所帶來(lái)的不安全性童番,出現(xiàn)了DIGEST認(rèn)證精钮。

過(guò)程如下:

  • 第一步:在瀏覽器地址欄中輸入 http://localhost:8080/auth

  • 第二步: 服務(wù)器執(zhí)行,發(fā)現(xiàn)需要認(rèn)證剃斧,返回這個(gè)請(qǐng)求的響應(yīng)杂拨。并在response headers中添加WWW-Authenticate(包含有隨機(jī)碼nonce),將http請(qǐng)求狀態(tài)設(shè)置為401.

  • 瀏覽器檢測(cè)到WWW-Authenticate為 digest 后悯衬,自動(dòng)彈出框。

  • 第三步: 當(dāng)用戶看到框后檀夹,輸入 用戶名和密碼筋粗,瀏覽器會(huì)將用戶名和上步返回的nouce,添加到 request headers的 Authorization 中炸渡,同時(shí)也將經(jīng)過(guò) MD5 運(yùn)算后的密碼字符串娜亿,生成key為response,一并添加到Authorization 中蚌堵。至此請(qǐng)求的request headers的Authorization 包含有如下信息买决。

//request header

Authorization: Digest username="my name",realm="DIGEST",nounce="xxxxxxxxxxx",algorithm="MD5",response="xxxxxxxxxxxxx"
  • 然后發(fā)送給服務(wù)器,瀏覽器驗(yàn)證通過(guò)吼畏,返回200狀態(tài)碼督赤。
    如果驗(yàn)證不通過(guò),則繼續(xù)返回狀態(tài)碼401泻蚊,提示驗(yàn)證失敗躲舌。

缺點(diǎn):

雖然 DIGEST 認(rèn)證提供了高于BASIC 認(rèn)證的安全等級(jí), DIGEST 認(rèn)證提供防止密碼被竊聽(tīng)的保護(hù)機(jī)制性雄,但并不存在防止用戶偽裝的保護(hù)機(jī)制没卸,仍達(dá)不到多數(shù) Web 網(wǎng)站對(duì)高度安全等級(jí)的追求標(biāo)準(zhǔn)。

3秒旋、SSL 客戶端認(rèn)證

對(duì)于 BASIC認(rèn)證和DIGEST認(rèn)證來(lái)說(shuō)约计,只要輸入的用戶名和密碼正確,即可認(rèn)證是本人的行為迁筛。但如果用戶名和密碼被盜煤蚌,就很有可能被第三者冒充。

而利用 SSL客戶端認(rèn)證則可以避免該情況的發(fā)生瑰煎。在SSL認(rèn)證時(shí)铺然,必須使用https協(xié)議。
由于SSL中的各種加密和秘鑰算法過(guò)于復(fù)雜酒甸,有興趣的可以直接閱讀SSL相關(guān)書(shū)籍魄健,本文忽略詳細(xì)過(guò)程。

4插勤、FormBase 認(rèn)證

基于表單認(rèn)證的標(biāo)準(zhǔn)規(guī)范尚未有定論沽瘦,一般會(huì)使用 Cookie 來(lái)管理革骨。

認(rèn)證過(guò)程:

  • 第一步:當(dāng)用戶在瀏覽器的登錄頁(yè)面,輸入用戶名和密碼析恋,通過(guò)http請(qǐng)求發(fā)送給后端良哲。

  • 第二步:后端保存用戶的信息到session中,并返回sessionId, 通過(guò)http添加到response headers的Set-cookie中

//response headers

Set-cookie: PHPSESSID=kq8v6iujarsgflkeq7shmai9c7

然后瀏覽器成功登錄助隧,并跳轉(zhuǎn)頁(yè)面筑凫。

  • 第三步:當(dāng)用戶訪問(wèn)個(gè)人中心或者其他頁(yè)面時(shí)。http請(qǐng)求的request header中會(huì)自動(dòng)攜帶cookie
//request headers

Cookie: PHPSESSID=kq8v6iujarsgflkeq7shmai9c7

這樣并村,服務(wù)端會(huì)認(rèn)為是你本人在操作巍实。

但是如果攻擊者通過(guò)“跨站腳本攻擊(XSS) ”,通過(guò)docuemnt.cookie來(lái)獲取cookie哩牍,則sessionID很容易被盜棚潦。
為減輕XSS造成的損失,可以事先在Set-cookie內(nèi)加上 httponly屬性膝昆,這樣就禁止了docuemnt.cookie操作丸边。

Set-cookie: PHPSESSID=kq8v6iujarsgflkeq7shmai9c7, httponly

八、跨域資源共享(CORS)

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

1、簡(jiǎn)單請(qǐng)求(不會(huì)觸發(fā)CORS預(yù)檢請(qǐng)求)

需要滿足下列所有條件:

  • 第一條: 請(qǐng)求方式必須為 GET | HEAD

  • 第二條: Content-Type 的值必須屬于下列之一:

  • application/x-www-form-urlencoded | multipart/form-data | text/plain

例如:

http://foo.exmaple上要訪問(wèn) http://bar.other上的資源滔驾。則

//request headers上添加

Origin: http://foo.example

//response headers返回

Access-Control-Allow-Origin: *

如果返回

Access-Control-Allow-Origin: http://foo.example

表示,http://bar.other的資源只能被http://foo.example訪問(wèn)摊阀,其他網(wǎng)站不能訪問(wèn)我耻蛇。

2、非“簡(jiǎn)單請(qǐng)求”(觸發(fā)CORS預(yù)檢請(qǐng)求)

滿足下列條件之一:

  • 第一條: http請(qǐng)求方式為下列POST | PUT | DELETE | CONNECT | OPTIONS | TRACE | PATCH

    第二條: Content-Type 的值不屬于下列之一:

  • application/x-www-form-urlencoded | multipart/form-data | text/plain

  • 如果在 http://foo.exmaple 上要訪問(wèn) http://bar.other/resources/po... 上的資源胞此。且 request headers 中 Content-Type為application/xml臣咖,請(qǐng)求method為post。

那么此請(qǐng)求是個(gè)“非簡(jiǎn)單請(qǐng)求”漱牵。首先瀏覽器會(huì)自動(dòng)發(fā)送帶有options選項(xiàng)的預(yù)檢請(qǐng)求夺蛇,然后發(fā)送實(shí)際請(qǐng)求

//預(yù)檢請(qǐng)求request headers

OPTIONS /resources/post-here/ HTTP/1.1(自動(dòng),不需要設(shè)置)

//設(shè)置預(yù)檢請(qǐng)求的response headers

Access-Control-Request-Method: POST 

Access-Control-Request-Headers: Content-Type

Access-Control-Allow-Methods 表明服務(wù)器允許客戶端使用 POST方法發(fā)起請(qǐng)求酣胀。

Access-Control-Allow-Headers 表明服務(wù)器允許請(qǐng)求中攜帶字段 Content-Type刁赦。

然后瀏覽器接著發(fā)送實(shí)際請(qǐng)求(和正常請(qǐng)求一樣往下走)(略)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末娶聘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子甚脉,更是在濱河造成了極大的恐慌丸升,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牺氨,死亡現(xiàn)場(chǎng)離奇詭異狡耻,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)猴凹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門酝豪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人精堕,你說(shuō)我怎么就攤上這事∑颜希” “怎么了歹篓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)揉阎。 經(jīng)常有香客問(wèn)我庄撮,道長(zhǎng),這世上最難降的妖魔是什么毙籽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任洞斯,我火速辦了婚禮,結(jié)果婚禮上坑赡,老公的妹妹穿的比我還像新娘烙如。我一直安慰自己,他們只是感情好毅否,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布亚铁。 她就那樣靜靜地躺著,像睡著了一般螟加。 火紅的嫁衣襯著肌膚如雪徘溢。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天捆探,我揣著相機(jī)與錄音然爆,去河邊找鬼。 笑死黍图,一個(gè)胖子當(dāng)著我的面吹牛曾雕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播助被,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼翻默,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼缸沃!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起修械,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤趾牧,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后肯污,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體翘单,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年蹦渣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哄芜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柬唯,死狀恐怖认臊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锄奢,我是刑警寧澤失晴,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站拘央,受9級(jí)特大地震影響涂屁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜灰伟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一拆又、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧栏账,春花似錦帖族、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至了讨,卻和暖如春捻激,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背前计。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工胞谭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人男杈。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓丈屹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子旺垒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345