Session和Cookie的原理,以及在分佈式應用中出現的問題和解決方案

產生原因

  由於http協議是無狀態的,同一個瀏覽器對服務器的兩次請求之間是沒有關係的,服務器認爲兩次請求都是全新的請求,不會記住上次請求成功的數據。然而現有的業務常常需要服務器能記住用戶的訪問情況,

  Cookie和Session都是爲了解決http協議無狀態而產生的。

Cookie

原理

  客戶端請求服務器,服務器會通過Response將Cookie發送到瀏覽器,並保存在瀏覽器端,下次瀏覽器再向服務器發送請求時,會把Cookie放到Request裏發給服務器。

缺點

  由於Cookie是將信息存儲在客戶端本地,而客戶端本地存儲並無任何安全機制,容易造成泄漏、竊取,所以一般Cookie存儲的信息如用戶基礎姓名、年齡等,而不存儲隱私性較強的信息,如密碼、身份證等

Session

原理

  Session機制與Cookie相似,不過是將數據保存在服務器上,能避免數據泄漏的問題。Session底層利用了Cookie來存儲SessionId,下次瀏覽器請求服務器時,會將SessionId帶上發給服務器,那麼服務器就能將請求和Session對應起來。

 

分佈式出現的問題

  多臺服務器如何解決同一個用戶唯一標識存儲的問題,現大部分架構使用分佈式,有可能用戶A第一次請求被代理轉發到Server1服務器上(在Server1完成登錄),此時用戶在此請求獲取服務器資源被代理轉發到Server2服務器上,那麼傳統的會話以服務器文件存儲,則此時在Server2上並沒有存儲用戶A的會話文件,所以用戶A在第二次訪問的時候仍然是未登錄狀態。

服務器代理轉發是由Nginx算法配置,通常有Hash算法、隨機訪問、最小連接數、權重分配法等

解決方案

  1. 將用戶會話存儲在同一存儲層中,使得會話在分佈式架構中共享會話。常用的是數據庫層,如Mysql、Redis。不建議使用Mysql存儲層,Mysql通常是應用的最後一道關卡,在高併發請求的情況下,容易造成服務器崩潰。一般使用的是Redis分佈式緩存存儲Session,Redis是純內存,訪問速度快
  2. JWT(Json Web Token)。是一種基於JSON的、用於在網絡上聲明某種主張的令牌(token)。JWT通常由三部分組成: 頭信息(header), 消息體(payload)和簽名(signature)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章