cookie和session的區別?一文講透

一、問題

cookie和session的區別?

 

二、回答

1、總結如下
- cookie:
  - cookie存儲於客戶端本地,即瀏覽器緩存
  - cookie存儲着sessionId,作爲後臺session緩存的主鍵,可以快速識別用戶身份,減少後臺請求
  - 問題:數據量較小,不適合存儲大數據,如有些圖片很大就支撐不了
  - 問題:有些服務器禁用cookie,就無法使用cookie
  - 替代方案:採用HTML5的Session Storage,支持較大的數據存儲


- session:
  - session存儲於服務器端,即web服務器緩存
  - session存儲着登錄後用戶的基本信息,以減輕數據庫服務器的壓力
  - session後臺有設置緩存失效時間,長時間不登錄,後臺會清除session緩存
  - 服務器重啓會導致session緩存數據丟失
  - 問題:集羣數據共享問題,如web1存用戶基本信息,web2下單,從web2中無法獲取到web1的用戶信息
  - 替代方案1:使用Redis替代session,實現分佈式緩存
  - 替代方案2:不使用緩存,將信息寫在HTTP協議裏,使用token

 

2、cookie與session交互示意圖

 

如上圖,當客戶端用戶在www.xxx.com網址下輸入用戶名密碼,登錄成功,服務器端會爲admin這個用戶創建一份session緩存空間,存儲admin用戶的基本用戶信息,其主鍵爲sessionId;

服務器端在響應的header中,將sessionId返回給客戶端,客戶端得到sessionId,會將其存儲到本地磁盤中:名稱sessionId,值1234,Domain爲.xxx.com,還有過期時間等;

當用戶繼續操作如添加購物車,此時客戶端檢測到本地有.xxx.com域名的cookie,會自動在請求header中加上該cookie,值爲sessionId=1234,發給服務端;

服務器端接收到請求,檢測sessionId爲1234在緩存區有該主鍵的session,從而知道用戶身份是admin用戶,返回成功。

 

3、cookie的問題及解決方案
(1)清理掉cookie導致重新登錄的原因?
當我們將瀏覽器中的cookie清除掉以後,它會清掉本地存儲的sessionId信息,這樣再次訪問該網站,請求頭裏沒有攜帶sessionId,後臺無法通過sessionId檢測到你是誰,就會認爲你是沒登錄過的用戶,讓你重新登錄。

(2)cookie容量較小,現在有的圖片很大,無法存儲,且有的服務器禁用cookie,如何解決?
可以採用HTML5的Session Storage,以支持較大的數據存儲。

 

4、session的問題及解決方案
(1)長時間不登錄導致賬號被踢掉的原因?
服務器端的sessionId緩存空間很小,大概只有4k,當大量用戶登錄,服務器需要爲每個用戶創建session緩存空間,就不夠用對服務器來說有壓力,爲了解決這個問題就有了session緩存的失效時間,一般爲30分鐘。

長時間不登錄,如超過30分鐘,服務器端的session超過失效時間就會自動清掉,此時客戶端拿着老的cookie裏存的sessionId去訪問服務器,服務器檢測不到對應的session信息,即不認識你,就會讓你重新登錄。

 

(2)服務器重啓導致session緩存數據丟失的原因?
因爲session數據存在緩存裏,又沒有落在磁盤上,服務器重啓緩存數據會丟失,session緩存數據自然也就沒了,這是正常的特性,如同未保存的word文檔打開後數據丟失一樣。

 

(3)session真正的問題是:集羣環境下的數據共享問題
現在很多後臺服務器都是分佈式集羣環境,比如我有2臺web服務器,web1緩存中存儲了登錄後的用戶基本信息,web2下單,那麼在web2服務器上想要獲取web1緩存中的用戶信息是獲取不到的。

爲了解決這個問題,目前有2種替代方案:
第一種是:利用redis緩存存儲,也就是不把緩存緩在單個服務器上,而是緩在一個redis緩存數據庫裏,這樣web1可以寫redis,web2讀redis,大家都操作一份緩存數據;

第二種是:利用token,也就是用戶基本信息不放在緩存中,而是寫到http協議裏,這樣web1登錄完了以後,把用戶信息放在token裏返回,web2操作時帶着token去訪問,服務器也能識別到用戶身份。

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