天天看點

面試問到HTTP就這麼回答

作者:網際網路雜談A

HTTP和HTTPS的差別?

  • HTTP 是明文傳輸協定,HTTPS 協定是由 HTTP + SSL 協定建構的可進行加密傳輸、身份認證的網絡協定,比 HTTP 協定安全。
面試問到HTTP就這麼回答
  • HTTPS比HTTP更加安全,對搜尋引擎更友好,利于SEO,谷歌、百度優先索引HTTPS網頁;
  • HTTPS需要用到SSL證書,而HTTP不用;
  • HTTPS标準端口443,HTTP标準端口80;
  • HTTPS基于傳輸層,HTTP基于應用層;
  • HTTPS在浏覽器顯示綠色安全鎖,HTTP沒有顯示;

為什麼HTTPS比HTTP安全?

HTTP的問題

HTTP是明文協定,它有以下缺點:

  • 通信使用明文(不加密),内容可能被竊聽
  • 無法證明封包的完整性,是以可能遭篡改
  • 不驗證通信方的身份,是以有可能遭遇僞裝

HTTP明文協定的缺陷是導緻資料洩露、資料篡改、流量劫持、釣魚攻擊等安全問題的重要原因。

HTTPS如何解決HTTP上述問題?

HTTPS并非是應用層的一種新協定。隻是HTTP通信接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Security)協定代替而已。通常,HTTP直接和TCP通信。當使用SSL時,則演變成先和SSL通信,再由SSL和TCP通信了。簡言之,所謂HTTPS,其實就是身披SSL協定這層外殼的HTTP。

HTTPS 協定的主要功能基本都依賴于 TLS/SSL 協定,TLS/SSL 的功能實作主要依賴于三類基本算法:散列函數 、對稱加密和非對稱加密,其利用非對稱加密實作身份認證和密鑰協商,對稱加密算法采用協商的密鑰對資料加密,基于散列函數驗證資訊的完整性。

面試問到HTTP就這麼回答

使用加密解決内容可能被竊聽的問題

具體做法是:發送密文的一方使用對方的公鑰進行加密處理“對稱的密鑰”,然後對方用自己的私鑰解密拿到“對稱的密鑰”,這樣可以確定交換的密鑰是安全的前提下,使用對稱加密方式進行通信。是以,HTTPS采用對稱加密和非對稱加密兩者并用的混合加密機制。

使用數字簽名解決封包可能遭到篡改的問題

網絡傳輸過程中需要經過很多中間節點,雖然資料無法被解密,但可能被篡改,那如何校驗資料的完整性呢?—-校驗數字簽名。

數字簽名有兩種功效:

  • 能确定消息确實是由發送方簽名并發出來的,因為别人假冒不了發送方的簽名。
  • 數字簽名能确定消息的完整性,證明資料是否未被篡改過。

數字簽名如何生成:

面試問到HTTP就這麼回答

将一段文本先用Hash函數生成消息摘要,然後用發送者的私鑰加密生成數字簽名,與原文文一起傳送給接收者。接下來就是接收者校驗數字簽名的流程了。

面試問到HTTP就這麼回答

接收者隻有用發送者的公鑰才能解密被加密的摘要資訊,然後用HASH函數對收到的原文産生一個摘要資訊,與上一步得到的摘要資訊對比。如果相同,則說明收到的資訊是完整的,在傳輸過程中沒有被修改,否則說明資訊被修改過,是以數字簽名能夠驗證資訊的完整性。

使用數字證書解決通信方身份可能被僞裝的問題

**數字證書認證機構(Certificate Authority,簡稱CA)**處于用戶端與伺服器雙方都可信賴的第三方機構的立場上。我們來介紹一下數字證書認證機構的業務流程。

  1. 伺服器的營運人員向數字證書認證機構提出公開密鑰的申請
  2. 數字證書認證機構在判明提出申請者的身份之後,會對已申請的公開密鑰做數字簽名
  3. 然後配置設定這個已簽名的公開密鑰,并将該公開密鑰放入公鑰證書後綁定在一起
  4. 伺服器會将這份由數字證書認證機構頒發的公鑰證書發送給用戶端,以進行非對稱加密方式通信。公鑰證書也可叫做數字證書或直接稱為證書。
  5. 接到證書的用戶端可使用數字證書認證機構的公開密鑰,對那張證書上的數字簽名進行驗證,一旦驗證通過,用戶端便可明确兩件事:

一、認證伺服器的公開密鑰的是真實有效的數字證書認證機構。

二、伺服器的公開密鑰是值得信賴的。

什麼是強緩存和協商緩存

**強緩存:**浏覽器不會像伺服器發送任何請求,直接從本地緩存中讀取檔案并傳回Status Code: 200 OK

Expires:過期時間,如果設定了時間,則浏覽器會在設定的時間内直接讀取緩存,不再請求

Cache-Control:當值設為max-age=300時,則代表在這個請求正确傳回時間(浏覽器也會記錄下來)的5分鐘内再次加載資源,就會命中強緩存。

cache-control:除了該字段外,還有下面幾個比較常用的設定值:

(1)max-age:用來設定資源(representations)可以被緩存多長時間,機關為秒;
(2)s-maxage:和max-age是一樣的,不過它隻針對代理伺服器緩存而言;
(3)public:訓示響應可被任何緩存區緩存;
(4)private:隻能針對個人使用者,而不能被代理伺服器緩存;
(5)no-cache:強制用戶端直接向伺服器發送請求,也就是說每次請求都必須向伺服器發送。伺服器接收到     請求,然後判斷資源是否變更,是則傳回新内容,否則傳回304,未變更。這個很容易讓人産生誤解,使人誤     以為是響應不被緩存。實際上Cache-Control:     no-cache是會被緩存的,隻不過每次在向用戶端(浏覽器)提供響應資料時,緩存都要向伺服器評估緩存響應的有效性。
(6)no-store:禁止一切緩存(這個才是響應不被緩存的意思)。           
cache-control是http1.1的頭字段,expires是http1.0的頭字段,如果expires和cache-control同時存在,cache-control會覆寫expires,建議兩個都寫。

協商緩存: 向伺服器發送請求,伺服器會根據這個請求的request header的一些參數來判斷是否命中協商緩存,如果命中,則傳回304狀态碼并帶上新的response header通知浏覽器從緩存中讀取資源

Last-Modifed/If-Modified-Since和Etag/If-None-Match是分别成對出現的,呈一一對應關系

Etag/If-None-Match:

Etag:

Etag是屬于HTTP 1.1屬性,它是由伺服器(Apache或者其他工具)生成傳回給前端,用來幫助伺服器控制Web端的緩存驗證。Apache中,ETag的值,預設是對檔案的索引節(INode),大小(Size)和最後修改時間(MTime)進行Hash後得到的。

If-None-Match:

當資源過期時,浏覽器發現響應頭裡有Etag,則再次像伺服器請求時帶上請求頭if-none-match(值是Etag的值)。伺服器收到請求進行比對,決定傳回200或304
面試問到HTTP就這麼回答

Last-Modifed/If-Modified-Since:

Last-Modified:

浏覽器向伺服器發送資源最後的修改時間

If-Modified-Since:

當資源過期時(浏覽器判斷Cache-Control辨別的max-age過期),發現響應頭具有Last-Modified聲明,則再次向伺服器請求時帶上頭if-modified-since,表示請求時間。伺服器收到請求後發現有if-modified-since則與被請求資源的最後修改時間進行對比(Last-Modified),若最後修改時間較新(大),說明資源又被改過,則傳回最新資源,HTTP 200 OK;若最後修改時間較舊(小),說明資源無新修改,響應HTTP 304 走緩存。

Last-Modifed/If-Modified-Since的時間精度是秒,而Etag可以更精确。

Etag優先級是高于Last-Modifed的,是以伺服器會優先驗證Etag

Last-Modifed/If-Modified-Since是http1.0的頭字段

常見的HTTP狀态碼有哪些,都代表了什麼含義?

2XX(Success 成功狀态碼)

2XX 響應的結果标明請求被正常處理了

200 OK

面試問到HTTP就這麼回答

圖檔摘取自HTTP圖解

表示從用戶端發來的請求在伺服器端被正常處理了

在響應封包内,随狀态碼一起傳回的資訊會因方法的不同而發生改變。比如,使用 GET 方法時,對應請求資源的實體會作為響應傳回;而使用 HEAD 方法 時,對應請求資源的實體首部不随封包主體作為響應傳回(即在響應中隻傳回首部,不會傳回實體的主體部分)。

204 No Content

面試問到HTTP就這麼回答

圖檔摘取自HTTP圖解

該狀态碼代表伺服器接收的請求已成功處理,但在傳回的響應封包中不含實體的主體部分。另外,也不允許傳回任何實體的主體。比如,當從浏覽器送出請求 處理後,傳回 204 響應,那麼浏覽器顯示的頁面不發生更新。

一般在隻需要從用戶端往伺服器發送資訊,而對用戶端不需要發送新資訊内容的情況下使用

206 Partial Content

面試問到HTTP就這麼回答

圖檔摘取自HTTP圖解

該狀态碼表示用戶端進行了範圍請求,而伺服器成功執行了這部分的 GET 請求 響應封包中包含由 Content-Range 指定範圍的實體内容

3XX(Redirection 重定向狀态碼)

3XX 響應結果表明浏覽器需要執行某些特殊的處理以正确處理請求

301 Moved Permanently

面試問到HTTP就這麼回答

圖檔摘取自HTTP圖解

永久性重定向

該狀态碼表示請求的資源已被配置設定了新的 URI,以後應使用資源現在所指的 URI。也就是說,如果已經把資源對應的 URI 儲存為書簽了,這時應該按 Location 首部字段提示的 URI 重新儲存

302 Found

面試問到HTTP就這麼回答

圖檔摘取自HTTP圖解

臨時性重定向

該狀态碼表示請求的資源已被配置設定了新的 URI,希望使用者(本次)能使用新的 URI 通路。和 301 Moved Permanently 狀态碼相似,但 302 狀态碼代表的資源不是被永久移動,隻是臨時性質的。換句話說,已移動的資源對應的 URI 将來還有可能發生改 變。比如,使用者把 URI 儲存成書簽,但不會像 301 狀态碼出現時那樣去更新書簽,而是仍舊保留傳回 302 狀态碼的頁面對應的 URI。

303 See Other

面試問到HTTP就這麼回答

圖檔摘取自HTTP圖解

該狀态碼表示由于請求對應的資源存在着另一個 URI,應使用 GET 方法定向擷取請求的資源。

303 狀态碼和 302 Found 狀态碼有着相同的功能,但 303 狀态碼明确表示用戶端應當采用 GET 方法擷取資源,這點與 302 狀态碼有差別。比如,當使用 POST 方法通路 CGI 程式,其執行後的處理結果是希望用戶端能以 GET 方法重定向到另一個 URI 上去時,傳回 303 狀态碼。雖然 302 Found 狀态碼也可以實作相同的功能,但這裡使用 303 狀态碼是最理想的

當 301、302、303 響應狀态碼傳回時,幾乎所有的浏覽器都會把 POST 改成 GET,并删除請求封包内的主體,之後請求會自動再次發送 301、302 标準是禁止将 POST 方法改變成 GET 方法的,但實際使用時大家都會這麼做

304 Not Modified

面試問到HTTP就這麼回答

圖檔摘取自HTTP圖解

該狀态碼表示用戶端發送附帶條件的請求時,伺服器端允許請求通路資源,但未滿足條件的情況。304 狀态碼傳回時,不包含任何響應的主體部分。304 雖 然被劃分在 3XX 類别中,但是和重定向沒有關系。

附帶條件的請求是指采用 GET 方法的請求封包中包含 If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since 中任一首部

307 Temporary Redirect

臨時重定向。該狀态碼與 302 Found 有着相同的含義。盡管 302 标準禁止 POST 變換成 GET,但實際使用時大家并不遵守

307 會遵照浏覽器标準,不會從 POST 變成 GET。但是,對于處理響應時的行為,每種浏覽器有可能出現不同的情況

4XX(Client Error 用戶端錯誤狀态碼)

4XX 的響應結果表明用戶端是發生錯誤的原因所在

400 Bad Request

面試問到HTTP就這麼回答

圖檔摘取自HTTP圖解

該狀态碼表示請求封包中存在文法錯誤。當錯誤發生時,需修改請求的内容後再次發送請求。另外,浏覽器會像 200 OK 一樣對待該狀态碼。

401 Unauthorized

面試問到HTTP就這麼回答

圖檔摘取自HTTP圖解

該狀态碼表示發送的請求需要有通過 HTTP 認證(BASIC 認證、DIGEST 認證)的認證資訊。另外若之前已進行過 1 次請求,則表示用 戶認證失敗

傳回含有 401 的響應必須包含一個适用于被請求資源的 WWW-Authenticate 首部用以質詢(challenge)使用者資訊。當浏覽器初次接收到 401 響應,會彈出認證用的對話視窗

403 Forbidden

面試問到HTTP就這麼回答

圖檔摘取自HTTP圖解

該狀态碼表明對請求資源的通路被伺服器拒絕了。伺服器端沒有必要給出拒絕的詳細理由,但如果想作說明的話,可以在實體的主體部分對原因進行描述,這樣就能讓使用者看到了

未獲得檔案系統的通路授權,通路權限出現某些問題(從未授權的發送源 IP 位址試圖通路)等列舉的情況都可能是發生 403 的原因

404 Not Found

面試問到HTTP就這麼回答

圖檔摘取自HTTP圖解

該狀态碼表明伺服器上無法找到請求的資源。除此之外,也可以在伺服器端拒絕請求且不想說明理由時使用

405 Method Not Allowed

該狀态碼标明,用戶端請求的方法雖然能被伺服器識别,但是伺服器禁止使用該方法

GET 和 HEAD 方法,伺服器應該總是允許用戶端進行通路

用戶端可以通過 OPTIONS 方法來檢視伺服器允許的通路方法, 如下

Access-Control-Allow-Methods →GET,HEAD,PUT,PATCH,POST,DELETE           

5XX(Server Error 伺服器錯誤狀态碼)

5XX 的響應結果表明伺服器本身發生錯誤

500 Internal Server Error

面試問到HTTP就這麼回答

圖檔摘取自HTTP圖解

該狀态碼表明伺服器端在執行請求時發生了錯誤。也有可能是 Web 應用存在的 bug 或某些臨時的故障

502 Bad Gateway

該狀态碼表明扮演網關或代理角色的伺服器,從上遊伺服器中接收到的響應是無效的

502 錯誤通常不是用戶端能夠修複的,而是需要由途徑的 Web 伺服器或者代理伺服器對其進行修複

503 Service Unavailable

面試問到HTTP就這麼回答

圖檔摘取自HTTP圖解

該狀态碼表明伺服器暫時處于超負載或正在進行停機維護,現在無法處理請求。如果事先得知解除以上狀況需要的時間,最好寫入 RetryAfter 首部字段再傳回 給用戶端

狀态碼和狀況的不一緻 不少傳回的狀态碼響應都是錯誤的,但是使用者可能察覺不到這點。比如 Web 應用程式内部發生錯誤,狀态碼依然傳回 200 OK,這種情況也經常遇到。