Http協議中Cookie詳細介紹

Cookie老是保存在客戶端中,按在客戶端中的存儲位置,可分爲內存Cookie和硬盤Cookie。內存Cookie由瀏覽器維護,保存在內存中,瀏覽器關閉後就消失了,其存在時間是短暫的。硬盤Cookie保存在硬盤裏,有一個過時時間,除非用戶手工清理或到了過時時間,硬盤Cookie不會被刪除,其存在時間是長期的。因此,按存在時間,可分爲非持久Cookie和持久Cookie。javascript

 

HTTP請求+cookie的交互流程

若是步驟5攜帶的是過時的cookie或者是錯誤的cookie,那麼將認證失敗,返回至要求身份認證頁面。html

 HTTP協議做爲無狀態協議,對於HTTP協議而言,無狀態一樣指每次request請求以前是相互獨立的,當前請求並不會記錄它的上一次請求信息。那麼問題來了,既然無狀態,那完成一套完整的業務邏輯,發送屢次請求的狀況數不勝數,使用http如何將上下文請求進行關聯呢?機智的人類經過優化,找到了一種簡單的方式記錄http協議的請求信息java

優化後的HTTP請求:瀏覽器

  • 瀏覽器發送request請求到服務器,服務器除了返回請求的response以外,還給請求分配一個惟一標識ID,協同response一併返回給瀏覽器。
  • 同時服務器在本地建立一個MAP結構,專門以key-value(請求ID-會話內容)形式將每一個request進行存儲
  • 此時瀏覽器的request已經被賦予了一個ID,第二次訪問時,服務器先從request中查找該ID,根據ID查找維護會話的content內容,該內容中記錄了上一次request的信息狀態。
  • 根據查找出的request信息生成基於這些信息的response內容,再次返回給瀏覽器。若是有須要會再次更新會話內容,爲下一次請求提供準備。

因此根據這個會話ID,以創建屢次請求-響應模式的關聯數據傳遞。說到這裏可能已經喚起了你們許多共鳴。這就是cookie和session對無狀態的http協議的強大做用。服務端生成這個全局的惟一標識,傳遞給客戶端用於惟一標記此次請求,也就是cookie;而服務器建立的那個map結構就是session。因此,cookies由服務端生成,用於標記客戶端的惟一標識,無特定含義,在每次網絡請求中,都會被傳送。session服務端本身維護的一個map數據結構,記錄key-content上下文內容狀態。安全

 

cookie的屬性

通常cookie所具備的屬性,包括:服務器

Domain:域,表示當前cookie所屬於哪一個域或子域下面。cookie

對於服務器返回的Set-Cookie中,若是沒有指定Domain的值,那麼其Domain的值是默認爲當前所提交的http的請求所對應的主域名的。好比訪問 http://www.example.com,返回一個cookie,沒有指名domain值,那麼其爲值爲默認的www.example.com。網絡

Path:表示cookie的所屬路徑。session

Expire time/Max-age:表示了cookie的有效期。expire的值,是一個時間,過了這個時間,該cookie就失效了。或者是用max-age指定當前cookie是在多長時間以後而失效。若是服務器返回的一個cookie,沒有指定其expire time,那麼代表此cookie有效期只是當前的session,便是session cookie,當前session會話結束後,就過時了。對應的,當關閉(瀏覽器中)該頁面的時候,此cookie就應該被瀏覽器所刪除了。數據結構

secure:表示該cookie只能用https傳輸。通常用於包含認證信息的cookie,要求傳輸此cookie的時候,必須用https傳輸。

httponly:表示此cookie必須用於http或https傳輸。這意味着,瀏覽器腳本,好比javascript中,是不容許訪問操做此cookie的。

服務器發送cookie給客戶端

從服務器端,發送cookie給客戶端,是對應的Set-Cookie。包括了對應的cookie的名稱,值,以及各個屬性。

Set-Cookie: lu=Rg3vHJZnehYLjVg7qi3bZjzg; Expires=Tue, 15 Jan 2013 21:47:38 GMT; Path=/; Domain=.169it.com; HttpOnly
 Set-Cookie: made_write_conn=1295214458; Path=/; Domain=.169it.com
 Set-Cookie: reg_fb_gate=deleted; Expires=Thu, 01 Jan 1970 00:00:01 GMT; Path=/; Domain=.169it.com; HttpOnly

 

從客戶端把cookie發送到服務器

從客戶端發送cookie給服務器的時候,是不發送cookie的各個屬性的,而只是發送對應的名稱和值。

GET /spec.html HTTP/1.1 Host: www.example.org Cookie: name=value; name2=value2 Accept: */*  

 

關於修改,設置cookie

除了服務器發送給客戶端(瀏覽器)的時候,經過Set-Cookie,建立或更新對應的cookie以外,還能夠經過瀏覽器內置的一些腳本,好比javascript,去設置對應的cookie,對應實現是操做js中的document.cookie。

 

Cookie的缺陷

  • cookie會被附加在每一個HTTP請求中,因此無形中增長了流量。
  • 因爲在HTTP請求中的cookie是明文傳遞的,因此安全性成問題。(除非用HTTPS)
  • Cookie的大小限制在4KB左右。對於複雜的存儲需求來講是不夠用的。
相關文章
相關標籤/搜索