cookie、session的總結

cookie、session、stroage我想大家都不陌生,我呢只是知道一些皮毛,於是就想着更深入的總結一下。

cookie

什麼是cookie
HTTP Cookie(也叫 Web Cookie或瀏覽器 Cookie)是服務器發送到用戶瀏覽器並保存在本地的一小塊數據,它會在瀏覽器下次向同一服務器再發起請求時被攜帶併發送到服務器上。通常,它用於告知服務端兩個請求是否來自同一瀏覽器,如保持用戶的登錄狀態。Cookie 使基於無狀態的 HTTP 協議記錄穩定的狀態信息成爲了可能。
瀏覽器中的cookie展示
其實也可以這樣說,cookie就是一種瀏覽器管理狀態的一個文件,它有name,也有value,後面那些看不見的是Domain、path等等

cookie的原理
cookie原理圖
(這張圖是借鑑別人的,在此非常感謝)
第一次訪問網站的時候,瀏覽器發出請求,服務器響應請求後,會將cookie放入到響應請求中,在瀏覽器第二次發請求的時候,會把cookie帶過去,服務端會辨別用戶身份,當然服務器也可以修改cookie內容

Cookie 主要用於以下三個方面:
會話狀態管理(如用戶登錄狀態、購物車、遊戲分數或其它需要記錄的信息)
個性化設置(如用戶自定義設置、主題等)
瀏覽器行爲跟蹤(如跟蹤分析用戶行爲等)

session

什麼是session
Session 代表着服務器和客戶端一次會話的過程。Session 對象存儲特定用戶會話所需的屬性及配置信息。這樣,當用戶在應用程序的 Web 頁之間跳轉時,存儲在 Session 對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。當客戶端關閉會話,或者 Session 超時失效時會話結束。與Cookie不同的是,session是以服務端保存狀態的。

session機制原理
當客戶端請求創建一個session的時候,服務器會先檢查這個客戶端的請求裏是否已包含了一個session標識 - sessionId,
如果已包含這個sessionId,則說明以前已經爲此客戶端創建過session,服務器就按照sessionId把這個session檢索出來使用(如果檢索不到,可能會新建一個)
如果客戶端請求不包含sessionId,則爲此客戶端創建一個session並且生成一個與此session相關聯的sessionId
sessionId的值一般是一個既不會重複,又不容易被仿造的字符串,這個sessionId將被在本次響應中返回給客戶端保存。保存sessionId的方式大多情況下用的是cookie。

Cookie 和 Session 有什麼不同?

1.作用範圍不同,Cookie 保存在客戶端(瀏覽器),Session 保存在服務器端。
2.存取方式的不同,Cookie 只能保存 ASCII,Session 可以存任意數據類型,一般情況下我們可以在 Session 中保持一些3.常用變量信息,比如說 UserId 等。
4.有效期不同,Cookie 可設置爲長時間保持,比如我們經常使用的默認登錄功能,Session 一般失效時間較短,客戶端關5.閉或者 Session 超時都會失效。
6.隱私策略不同,Cookie 存儲在客戶端,比較容易遭到不法獲取,早期有人將用戶的登錄名和密碼存儲在 Cookie 中導致
7.信息被竊取;Session 存儲在服務端,安全性相對 Cookie 要好一些。
8.存儲大小不同, 單個 Cookie 保存的數據不能超過 4K,Session 可存儲數據遠高於 Cookie。
或者可以這樣說
cookie數據存放在客戶的瀏覽器上,session數據放在服務器上
cookie不是很安全,別人可以分析存放在本地的cookie並進行cookie欺騙,考慮到安全應當使用session。用戶驗證這種場合一般會用 session
session保存在服務器,客戶端不知道其中的信息;反之,cookie保存在客戶端,服務器能夠知道其中的信息
session會在一定時間內保存在服務器上,當訪問增多,會比較佔用你服務器的性能,考慮到減輕服務器性能方面,應當使用cookie
session中保存的是對象,cookie中保存的是字符串
session不能區分路徑,同一個用戶在訪問一個網站期間,所有的session在任何一個地方都可以訪問到,而cookie中如果設置了路徑參數,那麼同一個網站中不同路徑下的cookie互相是訪問不到的

如何考慮分佈式 Session 問題?
在互聯網公司爲了可以支撐更大的流量,後端往往需要多臺服務器共同來支撐前端用戶請求,那如果用戶在 A 服務器登錄了,第二次請求跑到服務 B 就會出現登錄失效問題。
分佈式 Session 一般會有以下幾種解決方案:

1.Nginx ip_hash 策略,服務端使用 Nginx 代理,每個請求按訪問 IP 的 hash 分配,這樣來自同一 IP 固定訪問一個後臺服務器,避免了在服務器 A 創建 Session,第二次分發到服務器 B 的現象。

2.Session 複製,任何一個服務器上的 Session 發生改變(增刪改),該節點會把這個 Session 的所有內容序列化,然後廣播給所有其它節點。

3.共享 Session,服務端無狀態話,將用戶的 Session 等信息使用緩存中間件來統一管理,保障分發到每一個服務器的響應結果都一致。

建議採用第三種方案。

推薦兩篇非常好的文章:聊一聊session和cookie關於Cookie、session和Web Storage
其實有好多文章總結都很好,有很多都是借鑑他們的,非常感謝:你真的瞭解 Cookie 和 Session 嗎把cookie聊清楚這兩篇文章的幫助

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章