HTTP協議是一種無狀態協議,即每次服務端接收到客戶端的請求時,都是一個全新的請求,服務器并不知道客戶端的歷史請求記錄。Cookie和Session都是用來跟蹤瀏覽器用戶身份的會話方式,目的就是為了彌補HTTP的無狀態特性。
Cookie是服務器發送到用戶瀏覽器并保存在本地的一小塊數據,它會在瀏覽器下次向同一服務器再發起請求時被攜帶。
Cookie中保存已經登錄過的用戶信息,下次訪問網站的時候,頁面可以自動填寫登錄的一些基本信息。通常,它用于告知服務端兩個請求是否來自于同一瀏覽器,如保持用戶的登錄狀態。此外,Cookie還能保存用戶首選項,主題和其他設置信息。
Session的作用是通過服務端記錄用戶的狀態。一般我們會使用Cookie來管理Session,服務器第一次接收到請求時,生成一個Session ID ,通過響應頭的Set-Cookie命令設置Session ID字段,并向客戶端發送要求設置Cookie的響應。客戶端收到響應后,在本機保存一個包含Session ID字段的Cookie信息,接下來客戶端每次向同一服務器發送請求時,請求頭都會帶上包含該Session ID的Cookie,然后服務器通過讀取請求頭中的Cookie,獲取到此次請求的Session ID。
需要注意的是,如果客戶端禁用了Cookie,通過Cookie保存Session ID的方式就無法使用了,這時我們也可以把Session ID放在請求的URL里面,考慮到安全性,我們還可以對Session ID進行加密。
整體上看,Cookie和Session存在5點區別:
1.存放位置不同,Cookie 數據保存在客戶端瀏覽器上,而Session 數據保存在服務器上。
2. 安全性不同,Cookie存放在本地瀏覽器上,可以對其進行偽造從而進行Cookie欺騙,所以相對來說,Session安全性更高。
3. 存儲數據大小不同,單個Cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個Cookie,而Session則存儲于服務端,瀏覽器對其沒有限制。
4. 數據類型不同, Cookie 只支持存儲字符串數據,而 Session 可以存儲任意數據類型。
5. 有效期不同,Cookie 可設置為長時間保持,比如我們經常使用的自動登錄功能,Session 一般生效時間較短,客戶端關閉或者 Session 超時都會失效。