今天繼續來整理關於前端的一個知識體系的HTTP協議部分,這也是對前端而言很是重要的一部分,來說講我對HTTP協議的理解,因所學有限,所以若是有什麼錯誤的地方,歡迎你們指正。前端
先來簡單說下HTTP的一些概念web
HyperText Transfer Protocol 超文本傳輸協議
其實也能夠被稱爲超文本轉移協議
談到HTTP,相信和咱們平常生活中輸入網址查詢資料,那個網址就是咱們HTTP協議中很是重要的一環,咱們所謂的網址有如下三種類型面試
URI
Uniform Resource Identifier 統一資源標識符數據庫
URL
Uniform Resource Location 統一資源定位符瀏覽器
URN
Unifrom Resource Name 統一資源名緩存
URL和URN其實都是屬於URI的子集,也就是說咱們日常說的網址其實均可以叫作URI。另外URN你們可能知道的比較少,URN表示資源的特定內容的惟一名稱,與目前資源所在地無關,所以使用這些URN,就能夠隨意將資源四處轉移,而不擔憂須要去換地址了,目前URN還在實驗階段,基本也是用不上的,簡單瞭解便可。安全
先來看下HTTP報文的一個大概的結構bash
起始行 |
---|
報文首部(各類關於HTTP傳輸的重要信息都包含在首部中) |
空行(CRLF) |
報文主體(客戶端所須要的資源) |
須要瞭解的是,這裏的起始行對於請求報文和響應報文來講結構都是固定的服務器
經常使用的首部字段被分爲四種網絡
經常使用的各個分類的首部字段,能夠去這裏查詢
經過查看響應報文,咱們能夠看到上面的起始行給出了一個響應的狀態碼,其實就是表明一系列響應信息的一個數字代碼,200就表示響應成功的意思,每一個響應碼的第一位表明了狀態碼的分類,狀態碼有一下幾個分類 | | 5XX |服務端錯誤| 表示服務器處理請求錯誤 |
狀態碼 | 分類 | 描述 |
---|---|---|
1XX | 信息型 | 表示請求正在處理 |
2XX | 成功型 | 表示請求正常處理 |
3XX | 重定向 | 表示須要進行附加操做完成請求 |
4XX | 客戶端錯誤 | 表示服務器沒法處理求 |
5XX | 服務端錯誤 | 表示服務器處理請求錯誤 |
通常狀態碼後面都會加上一個緣由短語,用來講明狀態碼的含義,像是上面展現的200 ok,‘ok’就是咱們所說的緣由短語。 一些常見的具體狀態碼,像是200、40四、500等你們都很熟悉,就再也不細說了,這裏給你們分享一下一些可能不怎麼常見的狀態碼,可是往後可能會遇到的狀態碼
表示客戶端請求資源的部份內容,而服務器成功響應了部分的資源內容的狀態碼,而且會響應報文中會帶上Content-Range的指定範圍的實體內容
臨時性重定向,表示資源已經臨時轉移到其餘URL上,但願用戶本次訪問新的URL,返回的響應報文中會攜帶Location字段顯示新的URL
表示請求的資源被服務器拒絕了,服務器能夠在實體中聲明拒絕的緣由,也能夠不說明,通常表示權限出現了某些問題
表示服務器正在進行超負載或者停機維護的狀態,如今沒法處理請求,若是得知解決以上情況所需的時間,能夠寫入Retry-After字段返回給客戶端
咱們會常常遇到狀態碼和實際情況不一致的狀況,其實這就是在開發的時候,可能並無遵照各個響應碼所表明的含義,就直接返回給客戶端了,可是這樣作很差的地方在於沒有標準,後來的人可能很難去維護前人的代碼。
關於緩存問題,實際上是很是複雜的一個問題,筆者以前也是覺得緩存很是簡單,可是實際比咱們想象的更復雜,這裏說的緩存嚴格意義上來講其實就是客戶端緩存,就是保存在瀏覽器端的資源的副本,經過一些簡單首部字段控制緩存行爲,那麼緩存到底是什麼呢?
緩存就是自動保存文檔的副本,能夠解決冗餘的數據傳輸、帶寬限制、服務器響應速速以及網絡延遲等問題
下面就說說這幾個有關緩存的HTTP的首部字段,關於緩存的深刻了解,筆者也還在瞭解中,就暫時不誤人子弟了
no-cache
表示強制要求緩存服務器去源服務器驗證資源的有效性public
用做響應報文,表示任何客戶端均可以得到響應緩存
private
用做響應報文,表示只有指定的用戶能夠得到緩存
no-cache
做爲請求報文時,是指強制請求服務器驗證緩存,在服務器端做爲響應報文的話,是指每次緩存前肯定資源的有效性
no-store
不管是什麼報文,是表示不緩存請求和響應
Expires
表示資源失效的時間,意思就是在指定的時間內的資源副本,會被當作緩存返回給客戶端,若是在指定時間以後的話,則會請求源服務器獲取資源
max-age
做爲請求報文字段時,表示若是緩存資源的緩存時間不超過設置的時間,則客戶端接收緩存資源。若是是做爲服務器響應報文的話,則表示當前資源保存的最長的時間。須要注意的是,在HTTP1.1版本的時候,若是同時遇到Expires
字段時,會忽略該字段,先處理max-age
字段,可是在HTTP1.0時,則相反先處理Expires
字段
ETag
表示告知客戶端資源實體的標識符,是一種將資源以字符串形式作惟一的標識性的方式,通常都是服務器來進行分配。須要知道的是,ETag有強弱之分,強ETag值表示不管實體發生多麼微小的變化,都會更新其值,而弱ETag則表示資源是否相同,只有資源產生根本性差別,纔會改變其值,這時會在字段開始處附加w/,以下所示:
ETag: W/"123456"
複製代碼
If-Match
表示只有匹配的ETag值和服務器返回的ETag值一致時纔會返回請求,反之則會返回412 Precondition Failed狀態碼
If-None-Match
與If-Match
字段恰好相反,表示與返回ETag字段不一致時返回,則處理該請求
If-Modified-Since
表示資源在指定的日期之後有更新過,則服務器接收請求,反之則會返回304 Not Modified,指資源在指定的日期以後沒有被修改過,可使用緩存
If-Unmodified-Since
這個字段與上面的恰好相反,表示在指定日期以後未發生更新,才能處理請求,不然返回412 Precondition Failed
If-Range
表示指定的值若是和返回的ETag的值,或者Date日期的值一致,則會被當作範圍請求來處理,反之則會返回所有資源
下面是一個展現緩存流程的步驟圖:
雖然HTTP很是的方便好用,可是由於它是明文傳輸,因此很容易被別人竊取其中的內容,所以爲了防止這種狀況的出現,就有了咱們的HTTPS的出現。
先來看下HTTPS的定義
咱們把添加了加密及認證機制的HTTP稱爲HTTPS,即HTTP Secure --摘自《圖解HTTP》
那麼什麼叫作加密以及認證機制呢?咱們一步步來講。
要知道HTTPS本質其實仍是使用HTTP協議的,所不一樣的地方在於HTTP是直接明文和TCP通訊的,而HTTPS則是利用了SSL(Secure Socket Layer)和TLS(Transport Layer Security)協議,用他們來和TCP進行傳輸,換言之,就是在HTTP協議外面報了一層SSL的殼,就稱爲HTTPS。
那麼問題又來了,爲何加個殼就能安全傳輸了呢?這就要提到咱們上面說過的加密和認證機制了。
通訊雙方使用一樣的密鑰來對報文進行加密,這樣的話別人就看不到了,可是缺點就是首次通訊的時候,須要將密鑰發送給對方,此時密鑰都是明文的,若是被竊取的話,則通訊雙方的信息也就被破解了。
針對上面的對稱加密的缺點,因而又了非對稱加密。通訊雙方使用兩把密鑰,一把是私鑰,即只有本身知道的祕鑰,一把是公鑰,是公開給全部人知道的。發送信息的一方使用本身的公鑰進行加密,收到信息的一方則使用本身的私鑰進行解密,這樣的話就不須要將密鑰發送保證了數據傳輸的安全。
可是針對這種狀況,若是中間人竊取了數據包,更換了數據,再用公鑰進行加密發送出去,這樣接收方根本不知道本身收到的內容是不是發送方想要傳遞的信息。 另外則是雖然非對稱加密安全性比較高,可是其處理效率是很是低的,若是HTTPS使用這種方式的話,那處理的速度也會很是的低,因而就有了下面的混合加密。
混合加密機制則是混合了對稱加密和非對稱加密的優勢,實現安全快速的發送信息,具體的實現思路以下:
這樣作既實現了安全,又實現了效率的提升,可是還有一個問題,就是上面的非對稱加密的一個缺陷,即咱們如何保證咱們在第二步收到的信息中的密鑰就是發送者開始發送的密鑰呢?
這裏人們又想出來一個想法(ps:不得不感慨人類的智慧真的是無窮的),由可信任的第三方數字證書認證機構頒發公開密鑰證書,這樣的話,咱們上面的三步通訊方式則發生了以下的改變
相比上面的步驟,這裏則是多了一個第三方的數字證書認證機構頒發證書籤名的步驟,關於數字證書籤名怎麼獲取,頒發等等就不展開,有興趣的同窗能夠上網搜搜,固然認證機構的公開密鑰怎麼安全的轉交客戶端其實也是一個問題,因此通常來講,瀏覽器開發商會事先在瀏覽器中植入經常使用認證機關的公開密鑰
其實以上這些就是咱們在開頭所說的SSL和TLS協議的一個實現,咱們的HTTPS就是在以上這些內容中實現的,那麼一樣的HTTPS其實也會具備上面的一些不足的地方,就是效率會比HTTP低不少,由於須要不斷的進行加密和解密的操做,會消耗大量的CPU和內存等資源,所以處理速度也是相對比較慢的。
上面的HTTPS也是說到了咱們是利用SSL和TLS來和TCP進行通訊的,那麼TCP又是什麼呢,別急,咱們慢慢道來。 首先咱們的HTTP協議實際上是屬於TCP/IP協議族中的一個內部子集,而TCP則是這個協議族的重要組成部分。
TCP/IP協議族的一個突出思想就是分層,爲何要採用分層呢,其實簡單來講就是各司其職,減小耦合,這樣後續若是各層進行更新升級不會影響到其餘層的協議了,如今主流的或者說是主要的就是如下的五層模型:
應用層
面向用戶,爲用戶提供直接服務,如HTTP,FTP,DNS都是屬於應用層傳輸層
包含兩個性質不一樣的協議TCP(傳輸控制協議)和UDP(用戶數據報協議)網絡層
處理在網絡上流動的數據包網絡鏈路層
連接硬件設備,諸如硬件驅動,操做系統等物理層
負責數據傳輸的硬件設備,如電話線路,以太網等另外還有一個七層的osi分層模型,就是在應用層裏面細分出了表現層和會話層
表示層
表示層把數據轉換爲合適、可理解的語法和語義會話層
維護網絡鏈接的狀態知道了這些,咱們大概就知道了以上說的全部的知識點的一個大概層次結構了,那麼咱們接着TCP往下說說是如何進行TCP的鏈接以及TCP協議的一些相關信息
若握手過程當中某個階段連接斷開了,則TCP協議會以相同的順序再次發送數據包
說完了TCP,以後就是IP協議,也就是存在於網絡層的IP協議,用來處理TCP傳過來的數據包,這部分只是簡單認識一下,由於我對下面這些瞭解的也很少了(手動狗頭)
位於網絡層,IP(Internet Protocol)即網際協議,IP協議的做用把各類數據包傳送給對方
通俗來講就是你上網的位置,即當前網絡被分配到的地址,上網的位置是隨時可變的,所以IP地址也是能夠變的
網卡所屬的固定地址,這個是商家指定分配的,是不可變的
解析地址的協議,根據對方的IP地址來解析對應的MAC地址
提供域名到IP地址之間的解析服務
那麼將以上這些鏈接起來,就造成了一個完整的從請求到響應的過程了,在瀏覽器窗口輸入URL,由DNS解析域名,分離IP地址和端口號,HTTP協議則將信息包裝成報文進行發送,TCP協議負責將報文分段進行傳輸,將數據包發送給下一層,即網絡層,IP協議則搜索目標地址,進行傳送,利用ARP協議獲取MAC地址,增長做爲通訊目的地的MAC地址,將數據轉發給鏈路層。服務端接受也是按照相反順序從HTTP協議中獲取請求。
瞭解完基本的HTTP知識後,安全問題也是咱們一直不得不去重視的另一個問題,這裏所說的一些攻擊技術,也是基於筆者本人所瞭解的,若是有疏漏或者錯誤,歡迎你們儘早提出呀。
針對Web應用的攻擊分爲兩種
顧名思義,主動攻擊,即攻擊者直接訪問Web應用,將攻擊代碼傳入,而被動攻擊,則是利用圈套策略執行攻擊代碼的攻擊模式。 主動攻擊主要有SQL注入攻擊,被動攻擊則主要是XSS攻擊和CSRF攻擊等,下面就來講說這幾種攻擊。
針對Web應用使用的數據庫,運行非法的SQL而產生的攻擊。
用我本身的話來講的話就是,因爲服務端運行SQL一些動態SQL的時候,沒有對動態的內容進行過濾,致使一些關鍵詞被使用,從而產生了意想不到的執行結果。
跨站腳本攻擊,即運行了非法的JS腳本或者HTML標籤,致使頁面的內容被篡改或者信息被泄露
簡單解釋一下的話,就是在頁面的輸入框等地方,沒有對輸入內容進行過濾,致使運行了一些非法的JS腳本和HTML標籤,致使這個問題的主要緣由就是Web端的驗證和服務器端的驗證沒有對一些特殊的標籤和關鍵字進行過濾,即輸出值轉義不徹底引發的安全漏洞。
跨站請求僞造
指攻擊者經過設置好的陷阱,強制對已完成認證的用戶進行非預期的我的信息或設定信息等某些狀態更新,屬於被動攻擊
這裏說下跨站請求僞造的一個簡單的過程
通常的防護方案,就是使用token進行驗證用戶的請求或者是使用驗證碼,使用自定義的字段來驗證請求等都是能夠來防護CSRF攻擊
筆者會將這些文章詳細信息放在我的博客中,固然我的博客如今還只是初步階段完善中,歡迎你們給筆者留言或者是建議等。