一文搞懂cookie和session
cookie、session和token存在的意義是什么?#
http是無狀態(tài)的,每次請求是獨立的,服務(wù)端不保存會話信息,所以他的好處也就是快,但缺點也顯而易見,就是無法對不同用戶進行區(qū)分。
什么是cookie?#
cookie存儲于客戶端,請求后由服務(wù)器發(fā)送回瀏覽器,下次訪問同一服務(wù)器時,將cookie作為參數(shù)攜帶至服務(wù)器。cookie是瀏覽器實現(xiàn)的一種數(shù)據(jù)存儲功能,是name=value的鍵值對。
優(yōu)點:不占用服務(wù)器資源,效率高。
缺點:數(shù)據(jù)安全性較低。
什么是session?#
session基于cookie實現(xiàn),存儲于服務(wù)端,sessionID會被存儲到客戶端cookie中,瀏覽器第二次訪問服務(wù)器時,服務(wù)器從cookie中獲取sessionID查找對應(yīng)session信息,存在說明用戶已登錄。
優(yōu)點:安全性較高。
缺點:占用服務(wù)器資源,可能會占滿,多臺服務(wù)器下又會出現(xiàn)session存儲在其中一臺服務(wù)器上,其他服務(wù)器沒法使用的情況,可以用redis服務(wù)器去解決,所有服務(wù)器都去調(diào)用redis服務(wù)器。
cookie和session區(qū)別#
cookie存于客戶端,session存于服務(wù)器。
cookie中數(shù)據(jù)不能超過4k,session存儲空間大于cookie。
cookie只能存字符串,其他類型會被轉(zhuǎn)為字符串類型,session可存儲任意數(shù)據(jù)類型。
cookie的安全性比session低。
cookie和session執(zhí)行流程#
瀏覽器第一次向服務(wù)器發(fā)送請求,服務(wù)器檢查是否有攜帶JSESSIONID的cookie。
如果存在,將cookie值取出,在服務(wù)器的session池中找到對應(yīng)的session進行是否登錄的校驗。
如果不存在,服務(wù)器會創(chuàng)建一個session對象,并隨機生成一個唯一的sessionID,保存到session池中,在響應(yīng)瀏覽器時服務(wù)器會在http包的header中創(chuàng)建一個建為JSESSIONID,值為sessionID的cookie對象包含在Set-Cookie屬性中返回給瀏覽器,瀏覽器將其存儲起來下次訪問時攜帶。
用戶登出時,服務(wù)器會將session銷毀,并生成新的JSESSIONID返回給瀏覽器,瀏覽器下次攜帶給服務(wù)器后通過JSESSIONID找不到對應(yīng)的session說明用戶是第一次登錄。
不一定非要cookie和session配合使用,例如只用cookie也能實現(xiàn)相同功能,但將用戶信息存放在cookie是有很大安全風險的,而將sessionID存放在cookie中則沒有影響。
cookie的失效時間(會話cookie和持久cookie)#
會話cookie#
不設(shè)置過期時間,cookie保存在內(nèi)存里,瀏覽器關(guān)閉,cookie就消失。
持久cookie#
設(shè)置過期時間,setMaxAge(...),cookie保存在硬盤,只有時間過了才會失效。