什麽是 Cookie 和 Session ?
什麽是 Cookie
HTTP Cookie(也叫 Web Cookie或浏覽器 Cookie)是服務器發送到用戶浏覽器并保存在本地的一(yī)小(xiǎo)塊數據,它會在浏覽器下(xià)次向同一(yī)服務器再發起請求時被攜帶并發送到服務器上。通常,它用于告知(zhī)服務端兩個請求是否來自同一(yī)浏覽器,如保持用戶的登錄狀态。Cookie 使基于無狀态的 HTTP 協議記錄穩定的狀态信息成爲了可能。
Cookie 主要用于以下(xià)三個方面:
會話(huà)狀态管理(如用戶登錄狀态、購物(wù)車(chē)、遊戲分(fēn)數或其它需要記錄的信息)
個性化設置(如用戶自定義設置、主題等)
浏覽器行爲跟蹤(如跟蹤分(fēn)析用戶行爲等)
什麽是 Session
Session 代表着服務器和客戶端一(yī)次會話(huà)的過程。Session 對象存儲特定用戶會話(huà)所需的屬性及配置信息。這樣,當用戶在應用程序的 Web 頁之間跳轉時,存儲在 Session 對象中(zhōng)的變量将不會丢失,而是在整個用戶會話(huà)中(zhōng)一(yī)直存在下(xià)去(qù)。當客戶端關閉會話(huà),或者 Session 超時失效時會話(huà)結束。
Cookie和Session的區别
cookie和session的共同之處在于:cookie和session都是用來跟蹤浏覽器用戶身份的會話(huà)方式。
區别在于:
1. 由于HTTP協議是無狀态的協議,所以服務端需要記錄用戶的狀态時,就需要用某種機制來識别具體(tǐ)的用戶,這個機制就是Session,典型的場景比如購物(wù)車(chē),當你點擊下(xià)單按鈕時,由于HTTP協議無狀态,所以并不知(zhī)道是哪個用戶操作的,所以服務端要爲特定的用戶創建了特定的Session,用于标識這個用戶,并且跟蹤用戶,這樣才知(zhī)道購物(wù)車(chē)裏面有幾本書(shū)。這個Session是保存在服務端的,有一(yī)個唯一(yī)标識。在服務端保存Session的方法很多,内存、數據庫、文件都有。
集群的時候也要考慮Session的轉移,在大(dà)型的網站,一(yī)般會有專門的Session服務器集群,用來保存用戶會話(huà),這個時候 Session 信息都是放(fàng)在内存的,使用一(yī)些緩存服務比如Memcached之類的來放(fàng) Session。
2. 思考一(yī)下(xià)服務端如何識别特定的客戶?這個時候Cookie就登場了。每次HTTP請求的時候,客戶端都會發送相應的Cookie信息到服務端。實際上大(dà)多數的應用都是用 Cookie 來實現Session跟蹤的,第一(yī)次創建Session的時候,服務端會在HTTP協議中(zhōng)告訴客戶端,需要在 Cookie 裏面記錄一(yī)個Session ID,以後每次請求把這個會話(huà)ID發送到服務器,我(wǒ)(wǒ)就知(zhī)道你是誰了。
有人問,如果客戶端的浏覽器禁用了 Cookie 怎麽辦?一(yī)般這種情況下(xià),會使用一(yī)種叫做URL重寫的技術來進行會話(huà)跟蹤,即每次HTTP交互,URL後面都會被附加上一(yī)個諸如 sid=xxxxx 這樣的參數,服務端據此來識别用戶。
3. Cookie其實還可以用在一(yī)些方便用戶的場景下(xià),設想你某次登陸過一(yī)個網站,下(xià)次登錄的時候不想再次輸入賬号了,怎麽辦?這個信息可以寫到Cookie裏面,訪問網站的時候,網站頁面的腳本可以讀取這個信息,就自動幫你把用戶名給填了,能夠方便一(yī)下(xià)用戶。這也是Cookie名稱的由來,給用戶的一(yī)點甜頭。
所以,總結一(yī)下(xià):
Session是在服務端保存的一(yī)個數據結構,用來跟蹤用戶的狀态,這個數據可以保存在集群、數據庫、文件中(zhōng);
Cookie是客戶端保存用戶信息的一(yī)種機制,用來記錄用戶的一(yī)些信息,也是實現Session的一(yī)種方式。
因此,如果遇到面試官問你Cookie 和 Session 有什麽不同?我(wǒ)(wǒ)們可以做如下(xià)回答
1、作用範圍不同,Cookie 保存在客戶端(浏覽器),Session 保存在服務器端。
2、存取方式的不同,Cookie 隻能保存 ASCII,Session 可以存任意數據類型,一(yī)般情況下(xià)我(wǒ)(wǒ)們可以在 Session 中(zhōng)保持一(yī)些常用變量信息,比如說 UserId 等。
3、有效期不同,Cookie 可設置爲長時間保持,比如我(wǒ)(wǒ)們經常使用的默認登錄功能,Session 一(yī)般失效時間較短,客戶端關閉或者 Session 超時都會失效。
4、隐私策略不同,Cookie 存儲在客戶端,比較容易遭到不法獲取,早期有人将用戶的登錄名和密碼存儲在 Cookie 中(zhōng)導緻信息被竊取;Session 存儲在服務端,安全性相對 Cookie 要好一(yī)些。
5、存儲大(dà)小(xiǎo)不同, 單個 Cookie 保存的數據不能超過 4K,Session 可存儲數據遠高于 Cookie。
爲什麽需要 Cookie 和 Session,他們有什麽關聯?
說起來爲什麽需要 Cookie ,這就需要從浏覽器開(kāi)始說起,我(wǒ)(wǒ)們都知(zhī)道浏覽器是沒有狀态的(HTTP 協議無狀态),這意味着浏覽器并不知(zhī)道是張三還是李四在和服務端打交道。
這個時候就需要有一(yī)個機制來告訴服務端,本次操作用戶是否登錄,是哪個用戶在執行的操作,那這套機制的實現就需要 Cookie 和 Session 的配合。
那麽 Cookie 和 Session 是如何配合的呢?
用戶第一(yī)次請求服務器的時候,服務器根據用戶提交的相關信息,創建創建對應的 Session ,請求返回時将此 Session 的唯一(yī)标識信息 SessionID 返回給浏覽器,浏覽器接收到服務器返回的 SessionID 信息後,會将此信息存入到 Cookie 中(zhōng),同時 Cookie 記錄此 SessionID 屬于哪個域名。
當用戶第二次訪問服務器的時候,請求會自動判斷此域名下(xià)是否存在 Cookie 信息,如果存在自動将 Cookie 信息也發送給服務端,服務端會從 Cookie 中(zhōng)獲取 SessionID,再根據 SessionID 查找對應的 Session 信息,如果沒有找到說明用戶沒有登錄或者登錄失效,如果找到 Session 證明用戶已經登錄可執行後面操作。
根據以上流程可知(zhī),SessionID 是連接 Cookie 和 Session 的一(yī)道橋梁,大(dà)部分(fēn)系統也是根據此原理來驗證用戶登錄狀态。
既然服務端是根據 Cookie 中(zhōng)的信息判斷用戶是否登錄,
那麽:如果浏覽器中(zhōng)禁止了 Cookie,如何保障整個機制的正常運轉。
第一(yī)種方案,每次請求中(zhōng)都攜帶一(yī)個 SessionID 的參數,也可以 Post 的方式提交,也可以在請求的地址後面拼接 xxx?SessionID=123456...。
第二種方案,Token 機制。Token 機制多用于 App 客戶端和服務器交互的模式,也可以用于 Web 端做用戶狀态管理。
Token 的意思是“令牌”,是服務端生(shēng)成的一(yī)串字符串,作爲客戶端進行請求的一(yī)個标識。Token 機制和 Cookie 和 Session 的使用機制比較類似。
當用戶第一(yī)次登錄後,服務器根據提交的用戶信息生(shēng)成一(yī)個 Token,響應時将 Token 返回給客戶端,以後客戶端隻需帶上這個 Token 前來請求數據即可,無需再次登錄驗證。