http中的cookie和session概念

myownstars發表於2015-03-18

1  背景

HTTP協議本身是無狀態的,客戶每次讀取web頁面時,伺服器都開啟新的會話,而且伺服器也不會自動維護客戶的上下文資訊;

具體來說cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在伺服器端保持狀態的方案。

 

 

2  cookie機制

正統的cookie分發是透過擴充套件HTTP協議來實現的,伺服器透過在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie。然而純粹的客戶端指令碼如JavaScript或者VBScript也可以生成cookie。

而cookie的使用是由瀏覽器按照一定的原則在後臺自動傳送給伺服器的。瀏覽器檢查所有儲存的cookie,如果某個cookie所宣告的作用範圍大於等於將要請求的資源所在的位置,則把該cookie附在HTTP請求頭上傳送給伺服器。

 

 

組成

cookie的內容主要包括:name=value即鍵值對,expires 和 Max-Age,Domain和Path,secure和HttpOnly。

除了鍵值對,其他屬性通常是瀏覽器用來判斷如何對待cookie,何時刪除、遮蔽或者如何傳送name-value對給Server,這些Cookie屬性是不會被瀏覽器傳送回給Server的。

 

a) Domain and Path

作用:定義Cookie的生效作用域,只有當域名和路徑同時滿足的時候,瀏覽器才會將Cookie傳送給Server。

b) Expires and Max-Age

作用:設定瀏覽器何時刪除Cookie

Expires的規定格式是:“Wdy, DD-Mon-YYYY HH:MM:SS GMT”。

相對於Expires的精準的時間設定,在RFC 2965中規範提供了一個替代方案:Max-Age:seconds,來設定cookie在設定後多長秒後失效。

C) Secure and HttpOnly

作用:設定Cookie的安全屬性

特質:Secure和HttpOnly都是沒有value欄位的。

Secure欄位告訴瀏覽器在https通道時,對Cookie進行安全加密,這樣即時有駭客監聽也無法獲取cookie內容。

HttpOnly欄位告訴瀏覽器,只有在HTTP協議下使用,對瀏覽器的指令碼不可見,所以跨站指令碼攻擊時也不會被竊取。

 

 

互動流程

Step1.客戶端發起http請求到Server

GET /index.php HTTP/1.1

Host:

(這裡是省去了User-Agent,Accept等欄位)

 

Step2. 伺服器返回http response,其中可以包含Cookie設定

HTTP/1.1 200 OK

Content-type: text/html

Set-Cookie: name=value

Set-Cookie: name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT

(content of page)

 

Step3. 後續訪問webryan.net的相關頁面

GET /spec.html HTTP/1.1

Host:

Cookie: name=value; name2=value2

Accept: */*

 

 

用途

a.會話管理

1.記錄使用者的登入狀態是cookie最常用的用途。通常web伺服器會在使用者登入成功後下發一個簽名來標記session的有效性,這樣免去了使用者多次認證和登入網站。

2.記錄使用者的訪問狀態,例如導航,使用者的註冊流程等。

 

b.個性化資訊

1.Cookie也經常用來記憶使用者相關的資訊,以方便使用者在使用和自己相關的站點服務。例如:ptlogin會記憶上一次登入的使用者的QQ號碼,這樣在下次登入的時候會預設填寫好這個QQ號碼。

2.Cookie也被用來記憶使用者自定義的一些功能。使用者在設定自定義特徵的時候,僅僅是儲存在使用者的瀏覽器中,在下一次訪問的時候伺服器會根據使用者本地的cookie來表現使用者的設定。例如google將搜尋設定(使用語言、每頁的條數,以及開啟搜尋結果的方式等等)儲存在一個COOKIE裡。

 

c.記錄使用者的行為

最典型的是公司的TCSS系統。它使用Cookie來記錄使用者的點選流和某個產品或商業行為的操作率和流失率。當然功能可以透過IP或http header中的referrer實現,但是Cookie更精準一些。

 

 

類別

a.Session Cookie

這個型別的cookie只在會話期間內有效,即當關閉瀏覽器的時候,它會被瀏覽器刪除。設定session cookie的辦法是:在建立cookie不設定Expires即可。

 

b.Persistent Cookie

當你設定cookie的屬性Max-Age為1個月的話,那麼在這個月裡每個相關URL的http請求中都會帶有這個cookie。所以它可以記錄很多使用者初始化或自定義化的資訊,比如什麼時候第一次登入及弱登入態等。

 

c.Secure cookie

安全cookie是在https訪問下的cookie形態,以確保cookie在從客戶端傳遞到Server的過程中始終加密的。這樣做大大的降低的cookie內容直接暴露在駭客面前及被盜取的機率。

 

d.HttpOnly Cookie

設定成httponly的cookie只能在http(https)請求上傳遞。也就是說httponly cookie對客戶端指令碼語言(javascript)無效,從而避免了跨站攻擊時JS偷取cookie的情況。當你使用javascript在設定同樣名字的cookie時,只有原來的httponly值會傳送到伺服器。

 

e.3rd-party cookie

第三方cookie則是種植在不同於瀏覽器位址列的域名下。例如:使用者訪問a.com時,在ad.google.com設定了個cookie,在訪問b.com的時候,也在ad.google.com設定了一個cookie。這種場景經常出現在google adsense,阿里媽媽之類的廣告服務商。廣告商就可以採集使用者的一些習慣和訪問歷史。

 

 

 

 

3  session機制

Session代表伺服器與瀏覽器的一次會話過程,存放在伺服器端的記憶體中,瀏覽器得到的只是SessionID;

伺服器使用一種類似於hash table的結構來儲存資訊。

當程式需要為某個客戶端的請求建立一個session的時候,伺服器首先檢查這個客戶端的請求裡是否已包含了一個session id,如果已包含則說明已經為此客戶端建立過session,伺服器就按照session id把這個session檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含session id,則為此客戶端建立一個session並且生成一個與此session相關聯的session id,session id的值應該是一個既不會重複,又不容易被找到規律以仿造的字串,這個session id將被在本次響應中返回給客戶端儲存。

 

session因為請求(request物件)而產生,同一個會話中多個request共享session物件,可以直接從請求中獲取到session物件。

一個常見的誤解是以為session在有客戶端訪問時就被建立,然而事實是直到某server端程式呼叫 HttpServletRequest.getSession(true)這樣的語句時才被建立。

當JSP頁面沒有顯式禁止session的時候,在開啟瀏覽器第一次請求該jsp的時候,伺服器會自動為其建立一個session,並賦予其一個sessionID,傳送給客戶端的瀏覽器。以後客戶端接著請求本應用中其他資源的時候,會自動在請求頭上新增:

Cookie:JSESSIONID = 客戶端第一次拿到的session ID,伺服器端在接到請求時候,就會收到session ID,並根據ID在記憶體中找到之前建立的session物件,提供給請求使用。

 

Session刪除的時間是:

1)Session超時:超時指的是連續一定時間伺服器沒有收到該Session所對應客戶端的請求,並且這個時間超過了伺服器設定的Session超時的最大時間;

2)程式呼叫HttpSession.invalidate();

3)伺服器關閉或服務停止。

 

 

Session id的儲存方式

儲存session id的方式可以採用cookie,這樣在互動過程中瀏覽器可以自動的按照規則把這個標識發揮給伺服器。一般這個cookie的名字都是類似於SEEESIONID。

 

URL重寫

由於cookie可以被人為的禁止,必須有其他機制以便在cookie被禁止時仍然能夠把session id傳遞迴伺服器。

就是把session id直接附加在URL路徑的後面,附加方式也有兩種,一種是作為URL路徑的附加資訊,表現形式為

... 99zWpBng!-145788764

另一種是作為查詢字串附加在URL後面,表現形式為 ... 99zWpBng!-145788764

 

表單隱藏

伺服器會自動修改表單,新增一個隱藏欄位,以便在表單提交時能夠把session id傳遞迴伺服器,目前很少使用。

 

 

 

參考資料

http://lavasoft.blog.51cto.com/62575/275589/

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-1465082/,如需轉載,請註明出處,否則將追究法律責任。

相關文章