理解 Cookie,Session,Token 並結合 Redis 的使用


Http 協議是一個無狀態協議, 客戶端每次發出請求, 請求之間是沒有任何關系的。但是當多個瀏覽器同時訪問同一服務時,服務器怎么區分來訪者哪個是哪個呢?

cookie、session、token 就是來解決這個問題的。

cookie

  • cookie 僅僅是瀏覽器實現的一種數據存儲功能,就是瀏覽器里面能永久存儲的一種數據
  • 瀏覽器每次發生http請求,都會將請求域的 cookie 一同發給 server 端
  • server 端可以修改 cookie 並返回給瀏覽器
  • 瀏覽器端也可以通過 js 修改 cookie, 但是是有限制的,例如記錄用戶登錄數據的某些 cookie 是禁止瀏覽器端隨意修改的

session

如果說 cookie 是客戶身上的“通行證”,那么 session 就是服務器上的“客戶明細表”。客戶第一次訪問服務器,服務器會保存客戶的信息,並給客戶一個 cookie,下一次客戶攜帶 cookie 訪問服務器時,服務器會通過該 cookie 在客戶明細表(session)中找出該用戶信息,服務器就知道是哪個在訪問了。

  • session 只保存在服務器上,是服務器端使用的一種記錄客戶端狀態的機制
  • session 的使用方式是:客戶端 cookie 里存 userid,服務端 session 存用戶數據,客戶端訪問服務端的時候,根據 userid 找對應用戶數據

token

token 也稱作令牌, 注意在客戶端里存 userid(也就是token)、用戶信息、密文,而服務端只有一段加密代碼,用來判斷當前加密后的密文是否和客戶端傳遞過來的密文一致,如果不一致,就是客戶端的用戶數據被篡改了,如果一致,就代表客戶端的用戶數據正常且正確。

token 在客戶端一般存放於localStorage,cookie,或sessionStorage中。在服務器一般存於數據庫中。token 組成:

· uid: 用戶唯一身份標識
· time: 當前時間的時間戳
· sign: 簽名, 使用 hash/encrypt 壓縮成定長的十六進制字符串,以防止第三方惡意拼接
· 固定參數(可選): 將一些常用的固定參數加入到 token 中是為了避免重復查庫

token 認證流程與 cookie 類似:

1. 用戶登錄,成功后服務器返回Token給客戶端。
2. 客戶端收到數據后保存在客戶端
3. 客戶端再次訪問服務器,將 token 放入 headers 中
4. 服務器端校驗。校驗成功則返回請求數據,校驗失敗則返回錯誤碼(401)

redis:

redis 和 mysql 區別

  • redis 是 web server 最常用的緩存數據庫,數據存放在內存中, 可存儲的數據量較小,但是讀取速度較快
  • 相比於 mysql, mysql 是關系型數據庫,存儲在硬盤中,可存儲的數量較大,但是讀取速度較慢
  • redis 和 mysql 一般配合使用

為何 session 或 token 更適合存儲在 redis

  • session 或 token 訪問頻繁,對性能要求極高
  • session 或 token 不必但是丟失數據(丟失后,用戶只需要重新登錄即可)
  • 與其他存儲在 mysql 中的數據相比,session 或 token 的數據量較小

為何其他網站數據不適合存儲在 redis

  • 防止數據丟失
  • 數據量大,內存成本高
  • 操作頻率不高


免責聲明!

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



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