一文弄懂 HTTP、cookie、session

mw_myever發表於2020-10-03

Http協議

超文字傳輸協議(HTTP,Hyper Text Transfer Protocol)是網際網路上應用最為廣泛的一種網路協議。是用於從WWW伺服器傳輸超文字到本地瀏覽器的傳輸協議。它可以使瀏覽器更加高效,使網路傳輸減少。它不僅保證計算機正確快速地傳輸超文字文件,還確定傳輸文件中的哪一部分,以及哪部分內容首先顯示(如文字先於圖形)。

Http協議的版本:

HTTP/1.0, 傳送請求,建立一次連線,獲得一個web資源,連線斷開(在最早的 http 協議中,每進行一次 http 通訊,就需要做一次 tcp 的連線。而一次連線需要進 行 3 次握手,這種通訊方式會增加通訊量的開銷)

HTTP/1.1,傳送請求,建立一次連線,獲得多個web資源,連線斷開。在 HTTP/1.1 中改用了持久連線,就是在一次連線建立之後,只要客戶端或者服務端沒有 明確提出斷開連線,那麼這個 tcp 連線會一直保持連線狀態 持久連線的一個最大的好處是:大大減少了連線的建立以及關閉時延。 HTTP1.1 中有一個 Transport 段。會攜帶一個 Connection:Keep-Alive,表示希望將此條連線作為持久連線。

HTTP協議的主要特點

1.支援客戶/伺服器模式。(c/s)

2.簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。請求方法常用的有:

GET:獲取資源
POST:傳輸實體主體
PUT:傳輸檔案
HEAD: 獲得報文首部(相當於GET方法獲得的資源去掉正文)
DELETE: 刪除檔案
OPTIONS: 詢問支援的方法(客戶端問伺服器)
TRACE: 追蹤路徑
CONNECT:要求用隧道協議連線代理。

每種方法規定了客戶與伺服器聯絡的型別不同。由於HTTP協議簡單,使得HTTP伺服器的程式規模小,因而通訊速度很快。

3.靈活:HTTP允許傳輸任意型別的資料物件。正在傳輸的型別由Content-Type加以標記。

4.無連線:無連線的含義是限制每次連線只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線。採用這種方式可以節省傳輸時間。

5.無狀態:HTTP協議是無狀態協議。

  • 無狀態是指協議對於事務處理沒有記憶能力。
  • 對同一個url請求沒有上下文關係,每次的請求都是獨立的,它的執行情況和結果與前面的請求和之後的請求是無直接關係的,它不會受前面的請求應答情況直接影響,也不會直接影響後面的請求應答情況。
  • 伺服器中沒有儲存客戶端的狀態,客戶端必須每次帶上自己的狀態去請求伺服器。
  • 另一方面,缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大。

會話跟蹤

在程式中,會話跟蹤是很重要的事情。理論上,一個使用者的所有請求操作都應該屬於同一個會話,而另一個使用者的所有請求操作則應該屬於另一個會話,二者不能混淆。例如,使用者張三在商場購買的任何商品都應該放在張三的購物車內,不論是使用者張三什麼時間購買的,這都是屬於同一個會話的,不能放入使用者李四或使用者牛二的購物車內,這不屬於同一個會話。
而Web應用程式是使用HTTP協議傳輸資料的。HTTP 協議是無狀態的,什麼是無狀態呢?通俗來講就是說http協議一旦資料交換完畢,客戶端與伺服器端的連線就會關閉,再次交換資料需要建立新的連線。 但是現在的應用程式都是有狀態的,如果是無狀態,那這些應用基本沒人用,你想想,訪問一個電商網站,先登入,然後去選購商品,當點選一個商品加入購物車以後又提示你登入。

每一次操作都要與系統底層的資料庫進行互動

這種繁雜、冗餘的使用者體驗根本不會有人去使用,那我們是如何實現帶狀態的協議呢?所以此時便引入了cookie和session兩個概念!

常用的會話跟蹤技術是Cookie與Session。

Cookie通過在客戶端記錄資訊確定使用者身份,Session通過在伺服器端記錄資訊確定使用者身份。

1、客戶端支援的 cookie

  • Cookie就是這樣的一種機制。它可以彌補HTTP協議無狀態的不足。在Session出現之前,基本上所有的網站都採用Cookie來跟蹤會話

<1>什麼是Cookie?

Cookie意為“甜餅”,是由W3C組織提出,最早由Netscape社群發展的一種機制。目前Cookie已經成為標準,所有的主流瀏覽器如IE、google、Netscape、Firefox、Opera等都支援Cookie。

<2>Cookie的工作原理:

由於HTTP是一種無狀態的協議,伺服器單從網路連線上無從知道客戶身份。怎麼辦呢?就給客戶端們頒發一個通行證吧,每人一個,無論是誰訪問都必須攜帶自己通行證。這樣伺服器就能從通行證上確認客戶身份了。這就是Cookie的工作原理。

Cookie實際上是一小段的文字資訊。客戶端請求伺服器,如果伺服器需要記錄該使用者狀態,就使用response向客戶端瀏覽器頒發一個Cookie。客戶端瀏覽器會把Cookie儲存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給伺服器。伺服器檢查該Cookie,以此來辨認使用者狀態。伺服器還可以根據需要修Cookie的內容。

2、服務端支援的 session

  • 除了使用Cookie,Web應用程式中還經常使用Session來記錄客戶端狀態。Session是伺服器端使用的一種記錄客戶端狀態的機制,使用上比Cookie簡單一些,相應的也增加了伺服器的儲存壓力。

<1>什麼是session?

Session是另一種記錄客戶狀態的機制,不同的是Cookie儲存在客戶端瀏覽器中,而Session儲存在伺服器上。客戶端瀏覽器訪問伺服器的時候,伺服器使用一種類似於雜湊表的結構(也可能就是使用雜湊表)來儲存客戶端資訊。 客戶端瀏覽器再次訪問時只需要從該Session中查詢該客戶的狀態就可以了,這就是Session。

為每個訪問伺服器的使用者建立一個儲存資料的容器,容器中的資料在多個請求之間共享;通過在伺服器端開闢一塊快取區,儲存、記憶、共享一些臨時資料(這個資料指的是客戶端和伺服器在臨時會話中產生的資料)

<2>session的工作原理

如果說Cookie機制是通過檢查客戶身上的“通行證”來確定客戶身份的話,那麼Session機制就是通過檢查伺服器上的“客戶明細表”來確認客戶身份。Session相當於程式在伺服器上建立的一份客戶檔案,客戶來訪的時候只需要查詢客戶檔案表就可以了。當程式需要為某個客戶端的請求建立一個session的時候,伺服器首先檢查這個客戶端的請求裡是否已包含了一個session標識 ——稱為session id,如果已包含一個session id則說明以前已經為此客戶端建立過session,伺服器就按照session id把這個session檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含session id,則為此客戶端建立一個session並且生成一個與session相關聯的session id,session id的值應該是一個既不會重複,又不容易被找到規律以仿造的字串,這個session id將被在本次響應中返回給客戶端儲存。

最後是我個人的一些總結,花了半天的時間研究了一下http協議以及cookie、和session的概念原理。
  • http協議本身是無狀態的,只是後來隨著網際網路的發展以及電商平臺的普及,越來越多的web應用程式出現,為了順應與人互動的便捷化,這兩個非正式協議的機制便被引入到http中,其實這兩種機制很久以前就已經存在(cookie是1993年提出,session暫不清楚)

  • cookie:預設情況下,當瀏覽器關閉後,Cookie資料被銷燬

  • session:可以認為是伺服器端開闢的一小塊緩衝空間

舉一個很貼近生活的例子,一般大部分小區都會有保安看守,想進小區無非不過就兩種方法:

一、擁有你自己的身份證明,能證明你是小區裡的人,拿給保安看。

二、讓保安查詢對應的小區出入資訊登記表,核對身份後,方可進入。

這裡的第一點就好比你自己的cookie,第二點裡的登記表就好比小區為業主為專門設定的緩衝區(或者說記錄表),也就是session。

本人小白,第一次發文,以上均為個人見解,如有不嚴謹的地方還望各位不吝賜教!

參考文連結:cookie

相關文章