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

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

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

cookie

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

session

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

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

token

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

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

  • 防止數據丟失
  • 數據量大,內存成本高
  • 操做頻率不高
相關文章
相關標籤/搜索