什么是Cookie?
HTTP Cookie(也叫 Web Cookie或瀏覽器 Cookie)是服務(wù)器發(fā)送到用戶瀏覽器并保存在本地的一小塊數(shù)據(jù),用于跟蹤用戶的狀態(tài)。它會在瀏覽器下次向同一服務(wù)器再發(fā)起請求時被攜帶并發(fā)送到服務(wù)器上。通常,它用于告知服務(wù)端兩個請求是否來自同一瀏覽器,如保持用戶的登錄狀態(tài)。Cookie 使基于無狀態(tài)的 HTTP 協(xié)議記錄穩(wěn)定的狀態(tài)信息成為了可能。
Cookie 主要用于以下三個方面:
1、會話狀態(tài)管理(如用戶登錄狀態(tài)、購物車、游戲分?jǐn)?shù)或其它需要記錄的信息)
2、個性化設(shè)置(如用戶自定義設(shè)置、主題等)
3、瀏覽器行為跟蹤(如跟蹤分析用戶行為等)
什么是 Session?
Session 代表著服務(wù)器和客戶端一次會話的過程。Session 對象存儲特定用戶會話所需的屬性及配置信息。這樣,當(dāng)用戶在應(yīng)用程序的 Web 頁之間跳轉(zhuǎn)時,存儲在 Session 對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。當(dāng)客戶端關(guān)閉會話,或者 Session 超時失效時會話結(jié)束。
Cookie 和 Session 有什么不同?
1、作用范圍不同,Cookie 保存在客戶端(瀏覽器),Session 保存在服務(wù)器端。
2、存取方式的不同,Cookie 只能保存 ASCII,Session 可以存任意數(shù)據(jù)類型,一般情況下我們可以在 Session 中保持一些常用變量信息,比如說 UserId 等。
3、有效期不同,Cookie 可設(shè)置為長時間保持,比如我們經(jīng)常使用的默認(rèn)登錄功能,Session 一般失效時間較短,客戶端關(guān)閉或者 Session 超時都會失效。
4、隱私策略不同,Cookie 存儲在客戶端,比較容易遭到不法獲??;Session 存儲在服務(wù)端,安全性相對 Cookie 要好一些。
5、存儲大小不同, 單個 Cookie 保存的數(shù)據(jù)不能超過 4K,Session 可存儲數(shù)據(jù)遠(yuǎn)高于 Cookie。
為什么需要 Cookie 和 Session,他們有什么關(guān)聯(lián)?
我們都知道瀏覽器是沒有狀態(tài)的(HTTP 協(xié)議無狀態(tài)),這意味著瀏覽器并不知道是張三還是李四在和服務(wù)端打交道。這個時候就需要有一個機(jī)制來告訴服務(wù)端,本次操作用戶是否登錄,是哪個用戶在執(zhí)行的操作,那這套機(jī)制的實(shí)現(xiàn)就需要 Cookie 和 Session 的配合。
那么 Cookie 和 Session 是如何配合的呢?如下圖:

用戶第一次請求服務(wù)器的時候,服務(wù)器根據(jù)用戶提交的相關(guān)信息,創(chuàng)建創(chuàng)建對應(yīng)的 Session ,請求返回時將此 Session 的唯一標(biāo)識信息 SessionID 返回給瀏覽器,瀏覽器接收到服務(wù)器返回的 SessionID 信息后,會將此信息存入到 Cookie 中,同時 Cookie 記錄此 SessionID 屬于哪個域名。
當(dāng)用戶第二次訪問服務(wù)器的時候,請求會自動判斷此域名下是否存在 Cookie 信息,如果存在自動將 Cookie 信息也發(fā)送給服務(wù)端,服務(wù)端會從 Cookie 中獲取 SessionID,再根據(jù) SessionID 查找對應(yīng)的 Session 信息,如果沒有找到說明用戶沒有登錄或者登錄失效,如果找到 Session 證明用戶已經(jīng)登錄可執(zhí)行后面操作。
根據(jù)以上流程可知,SessionID 是連接 Cookie 和 Session 的一道橋梁,大部分系統(tǒng)也是根據(jù)此原理來驗證用戶登錄狀態(tài)。
既然服務(wù)端是根據(jù) Cookie 中的信息判斷用戶是否登錄,那么如果瀏覽器中禁止了 Cookie,如何保障整個機(jī)制的正常運(yùn)轉(zhuǎn)。
第一種方案:每次請求中都攜帶一個 SessionID 的參數(shù),也可以 Post 的方式提交,也可以在請求的地址后面拼接 xxx?SessionID=123456...。
第二種方案:Token 機(jī)制。Token 機(jī)制多用于 App 客戶端和服務(wù)器交互的模式,也可以用于 Web 端做用戶狀態(tài)管理。
Token 的意思是“令牌”,是服務(wù)端生成的一串字符串,作為客戶端進(jìn)行請求的一個標(biāo)識。Token 機(jī)制和 Cookie 和 Session 的使用機(jī)制比較類似。
當(dāng)用戶第一次登錄后,服務(wù)器根據(jù)提交的用戶信息生成一個 Token,響應(yīng)時將 Token 返回給客戶端,以后客戶端只需帶上這個 Token 前來請求數(shù)據(jù)即可,無需再次登錄驗證。