Http Cookie機制及Cookie的實現原理
轉自:https://itbilu.com/other/relate/4J4n8fIPe.html
Cookie
是進行網站使用者身份,實現服務端Session會話持久化的一種非常好方式。Cookie
最早由Netscape公司開發,現在由 IETF 的RFC 6265標準備對其規範,已被所有主流瀏覽器所支援。
1. 為什麼需要Cookie
?
HTTP是一種無狀態的協議,客戶端與伺服器建立連線並傳輸資料,資料傳輸完成後,連線就會關閉。再次互動資料需要建立新的連線,因此,伺服器無法從連線上跟蹤會話,也無法知道使用者上一次做了什麼。這嚴重阻礙了基於Web應用程式的互動,也影響使用者的互動體驗。如:在網路有時候需要使用者登入才進一步操作,使用者輸入使用者名稱密碼登入後,瀏覽了幾個頁面,由於HTTP的無狀態性,伺服器並不知道使用者有沒有登入。
Cookie
是解決HTTP無狀態性的有效手段,伺服器可以設定或讀取Cookie
中所包含的資訊。當用戶登入後,伺服器會發送包含登入憑據的Cookie
到使用者瀏覽器客戶端,而瀏覽器對該Cookie
進行某種形式的儲存(記憶體或硬碟)。使用者再次訪問該網站時,瀏覽器會發送該Cookie
(Cookie未到期時)到伺服器,伺服器對該憑據進行驗證,合法時使使用者不必輸入使用者名稱和密碼就可以直接登入。
本質上講,Cookie
是一段文字資訊。客戶端請求伺服器時,如果伺服器需要記錄使用者狀態,就在響應使用者請求時傳送一段Cookie
資訊。客戶端瀏覽器儲存該Cookie
資訊,當用戶再次訪問該網站時,瀏覽器會把Cookie
Cookie
內容,以此來判斷使用者狀態,伺服器還會對Cookie
資訊進行維護,必要時會對Cookie
內容進行修改。
2. Cookie
的型別
Cookie
總時由使用者客戶端進行儲存的(一般是瀏覽器),按其儲存位置可分為:記憶體式Cookie
和硬碟式Cookie
。
記憶體式Cookie
儲存在記憶體中,瀏覽器關閉後就會消失,由於其儲存時間較短,因此也被稱為非持久Cookie
或會話Cookie
。
硬碟式Cookie
儲存在硬碟中,其不會隨瀏覽器的關閉而消失,除非使用者手工清理或到了過期時間。由於硬碟式Cookie
儲存時間是長期的,因此也被稱為持久Cookie
3. Cookie
的實現原理
Cookie
定義了一些HTTP請求頭和HTTP響應頭,通過這些HTTP頭資訊使伺服器可以與客戶進行狀態互動。
客戶端請求伺服器後,如果伺服器需要記錄使用者狀態,伺服器會在響應資訊中包含一個Set-Cookie
的響應頭,客戶端會根據這個響應頭儲存Cookie
資訊。再次請求伺服器時,客戶端會在請求資訊中包含一個Cookie
請求頭,而伺服器會根據這個請求頭進行使用者身份、狀態等較驗。
下面是一個實現Cookie
機制的,簡單的HTTP請求過程:
1. 客戶端請求伺服器
客戶端請求IT筆錄
網站首頁,請求頭如下:
GET / HTTP/1.0 HOST: itbilu.com
2. 伺服器響應請求
Cookie
是一種key=value
形式的字串,伺服器需要記錄這個客戶端請求的狀態,因此在響應頭中包一個Set-Cookie
欄位。響應頭如下:
HTTP/1.0 200 OK Set-Cookie: UserID=itbilu; Max-Age=3600; Version=1 Content-type: text/html ……
3. 再次請求時,客戶端請求中會包含一個Cookie
請求頭
客戶端會對伺服器響應的Set-Cookie
頭資訊進行儲存。再次請求時,將會在請求頭中包含伺服器響應的Cookie
資訊。請求頭如下
GET / HTTP/1.0 HOST: itbilu.com Cookie: UserID=itbilu