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