1. 程式人生 > 實用技巧 >【網路通訊與資訊保安】之深入分析Token、session和cookie的使用場景和區別

【網路通訊與資訊保安】之深入分析Token、session和cookie的使用場景和區別

在Web開發領域,相信大家對於 Cookie 和 Session 都很熟悉,Cookie 和 Session 都是會話保持技術的解決方案。隨著技術的發展,Token 機制出現在我們面前,不過很多開發者對於 Token 和 Cookie、Session 的區別及使用場景分辨不清。

session 和 cookie
一、什麼是 session 和 cookie
  • 首先要知道HTTP請求是無狀態的,也就是不知道這一次的請求和上一次請求是否有關係,比如我們登入一個系統的時候,驗證使用者名稱密碼之後,開啟系統各個頁面的時候就不需要再進行登入操作了,直到我們主動退出登入或超時退出登入;這裡為了避免訪問每個都登入一下,就要用到 session、cookie;
  • cookie 是在客戶端(瀏覽器)儲存使用者資訊的一種機制;而且每種瀏覽器儲存大小會有一些差異,一般不超過4KB;
  • session是在服務端儲存,可以用於記錄客戶狀態,比如我們經常會用 session 儲存客戶的基本資訊、許可權資訊等;使用者第一次登入之後,伺服器就會建立一個 session,瀏覽器再次訪問時,只需要從該 session 中查詢該客戶的資訊就可以了。
二、Cookie和Session的用途
  • 要知道我們訪問網站都是通過HTTP協議或HTTPS協議來完成的,HTTP協議它本身是無狀態的協議(即:伺服器無法分辨哪些請求是來源於同個客戶)。而業務層面會涉及到客戶端與伺服器端的互動(同網站下多個頁面間能共享資料),此時伺服器端必須要保持會話狀態,這樣才能進行使用者身份的鑑別。
  • 由於HTTP無狀態的特性,如果要實話客戶端和伺服器端的會話保持,那就需要其它機制來實現,於是Cookie和Session應運而生。
  • 通常情況下,Session和Cookie是搭配在一起使用的。
    在這裡插入圖片描述
Token
一、為什麼會產生Token?

在這裡會有個問題,伺服器要儲存所有使用者的 session 資訊,開銷會很大,如果在分散式的架構下,就需要考慮 session 共享的問題,需要做額外的設計和開發,例如把 session 中的資訊儲存到 Redis 中進行共享;所以因為這個原因,有人考慮這些資訊是否可以讓客戶端儲存,可以儲存到任何地方,並且保證其安全性,於是就有了Token。

二、什麼是Token?
  • Token是服務端生成的一串字串,可以看做客戶端進行請求的一個令牌。
  • 當客戶端第一次訪問服務端,服務端會根據傳過來的唯一標識userId,運用一些加密演算法,生成一個Token,客戶端下次請求時,只需要帶上Token,伺服器收到請求後,會驗證這個Token。
  • 有些公司會建設統一登入系統(單點登入),客戶端先去這個系統獲取Token,驗證通過再拿著這些Token去訪問其他系統;API Gateway也可以提供類似的功能,我們公司就是這樣,客戶端接入的時候,先向閘道器獲取Token,驗證通過了才能訪問被授權的介面,並且一段時間後要重新或者Token。
    在這裡插入圖片描述
  • Token俗稱為“令牌”,它的構成是:
    • uid:使用者唯一身份標識;
    • timestamp:當前時間戳;
    • sign:簽名字串,防止第三方偽造資料;簽名金鑰是儲存在伺服器端的,其它人無法知道;
    • 其它附加引數。
三、基於Token的認證流程
  • 客戶端使用使用者名稱、密碼做身份驗證;
  • 服務端收到請求後進行身份驗證(也可能是統一登入平臺、閘道器);
  • 驗證成功後,服務端會簽發一個Token返回給客戶端;
  • 客戶端收到Token以後可以把它儲存起來(可以放在);每次向服務端傳送請求的時候,都要帶著Token;
  • Token會有過期時間,過期後需要重新進行驗證;
  • 服務端收到請求,會驗證客戶端請求裡面的Token,驗證成功,才會響應客戶端的請求;

在這裡插入圖片描述

總結
  • cookie:
    • 儲存在瀏覽器中,有大小限制,有狀態;
    • 由於存放在客戶端,所以是不安全的,人為可以清除;
    • cookie有過期時間設定,如果不設定過期時間,說明這個cookie就是當前瀏覽器的會話時間,瀏覽器關了,cookie 就存在了。如果有過期時間,cookie就會儲存到硬碟上,瀏覽器關閉不影響cookie。下次開啟瀏覽器,cookie還存在;
    • cookie有大小的限制,4KB。
  • session:儲存在伺服器中,伺服器有資源開銷,分散式、跨系統不好實現;
  • Token:客戶端可以將Token儲存到任何地方,無限制,無狀態,利於分散式部署。