cookie 和session、三種保持登陸會話的方式


  session和cookie都是會話跟蹤技術。cookie通過在客戶端記錄信息確定用戶身份,而session通過在服務器端記錄信息確定用戶身份。但session的實現依賴於cookie,sessionID(session的唯一標識)需要存放在客戶端。

cookie和session的區別:

  • cookie數據存放在客戶的瀏覽器上,session數據存放在服務器上。
  • cookie不是很安全,別人可以分析存放在本地的cookie並進行cookie欺騙,考慮到安全應當使用session
  • session會在一定時間內保存在服務器上。當訪問增多,會比較占用服務器的性能,考慮到減輕服務器性能方面,應當使用cookie
  • 單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie

 cookies與session能單獨用嗎?

  • session采用的是在服務器端保持狀態的方案,而cookie采用的是在客戶端保持狀態的方案。
  • 但是禁用cookie就不能得到session。因為session是用sessionID來確定當前會話所對應的服務器session,而sessionID是通過cookie來傳遞的,禁用cookie相當於禁用sessionID,也就得不到session了。

 為什么session比cookie要安全?

  • session的鍵值都是存儲在服務器端,返回給用戶的僅僅是sessionID,具體的session值對於用戶來說是完全未知的。
  • cookie的鍵值是會返回給客戶端,對於用戶來說是完全可知的。那么用戶就可以根據cookie的鍵值來反向推測服務器對於cookie的使用邏輯,進而進行cookie的偽造。

 

狀態記錄的實現機制其實本質上很簡單。

  • 請求A:需要記錄狀態的操作。一般來說,服務器就會返回特定的狀態記錄字段,根據技術不同,常見的有session、cookie、token、crsf、表單字段等等。
  • 請求B:依賴於請求A的操作,需要用到狀態字段。一般就酌情添加cookie管理器、做關聯等操作。

 三種會話保持的方式

(一)session機制保持會話

存在的問題

  •  高並發下,會占用服務器大量內存。
  • 分布式(一個業務分成幾個子業務,部署在多個服務器)或者集群(一個業務部署在多個服務器)時,session不能共享

解決方案

  •  高並發時可以將session存儲到redis,如果用戶長時間沒有訪問,將session存儲到redis,就減少了服務器的壓力。
  • 分布式或者集群時,先通過redis來判斷用戶狀態也可以實現session共享。

(二)cookie機制保持會話

 

 使用方法

  •  登錄驗證后,創建登錄憑證(比如:用戶id+登錄時間+過期時間),將登錄憑證進行加密(為了避免暴露信息),加密碼后寫到瀏覽器的cookie,以后,每次請求都發送cookie,服務器根據對應的解密算法對其進行驗證(或者將加密過的cookie內容存儲到數據庫,請求服務器時,服務器在數據庫進行查找)。

存在的問題

  •  每次訪問都提交cookie,增加請求量。
  • 其他訪問可能需要cookie(比如購物車的信息存放在cookie),瀏覽器對每個域存儲的cookie的大小有限制,那么需要控制加密后的憑證。
  • 一般而言,sessionID會以類似於cookie的形式返回給客戶端。sessionID是服務器端用來識別、讀取服務器上所存儲的session值的一個標志字段。
  • session和cookie都是有其生命周期的。瀏覽器在向服務器發送請求時,會自動將客戶端所保留的、存活的cookie封裝在請求頭cookie中向服務器發送。
  • 對於cookie而言,它的生命周期有兩個因素決定:
    • cookie自身的生命周期,由服務器生成該cookie時指定。
    • 客戶端是否保留cookie。
    • PS:客戶端是否保留cookie僅僅是對客戶端自身有效,對於封包工具(各種接口、性能測試工具)是無效的。
  • 對於session而言,它的生命周期也和兩個因素有關:session和cookie都是有其作用域的。session和cookie都是有其作用域的。
    • 服務器端對於session的存儲周期的設置。
    • 客戶端進程是否關閉。
    • PS:客戶端進程關閉,僅對客戶端自身有效,對於封包工具(各種接口、性能測試工具)是無效的。
  • session和cookie都是有其作用域的。

(三)token機制保持會話

使用方法

  •  cookie和session依賴於瀏覽器,如果客戶端不是瀏覽器,那么需要手動添加token(和cookie類似,也就是登錄憑證),將token添加到http header或者作為參數添加到url。

存在的問題

  •  每次訪問時手動添加token。
  • 和cookie的方式一樣增加了請求量。

總結

  •  不同的方式適合不同的應用場景,視情況使用。

相同點

  •  所有的方式目的都是為了驗證用戶狀態。
  • 都需要在客戶端存儲憑證。

不同點

  •  第一種是通過空間換時間,消耗內存存儲session對象,但是判斷用戶狀態不用復雜的邏輯。
  • 第二種第三種用時間換空間,在服務器端邏輯處理進行判斷用戶狀態。

 

轉載:https://blog.csdn.net/qq_34170700/article/details/107877570


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM