一、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)
chrome
的network
點(diǎn)擊任何一條request
請(qǐng)求站故,即可發(fā)現(xiàn)杯拐,每個(gè)http headers
都包含以下部分:Genaral
,Request Headers
世蔗,Response Headers
,Request 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 Headers
和Entity 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)求使用SSL
和HTTPS
協(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-Match
(Etag
的值)嘉赎,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 headers
的Allow
上設(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
例如:
//request headers上添加
Origin: http://foo.example
//response headers返回
Access-Control-Allow-Origin: *
- 由于在 http://foo.example 上要訪問(wèn) http://bar.other谒麦,所以http://bar.other必須要告訴其...,能不能訪問(wèn)我哆致。*號(hào)表示該資源可以被任意外域訪問(wèn)绕德。
如果返回
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)求一樣往下走)(略)