Http 協議是一個無狀態協議, 客戶端每次發出請求, 請求之間是沒有任何關係的。可是當多個瀏覽器同時訪問同一服務時,服務器怎麼區分來訪者哪一個是哪一個呢?mysql
cookie、session、token 就是來解決這個問題的。web
若是說 cookie 是客戶身上的「通行證」,那麼 session 就是服務器上的「客戶明細表」。客戶第一次訪問服務器,服務器會保存客戶的信息,並給客戶一個 cookie,下一次客戶攜帶 cookie 訪問服務器時,服務器會經過該 cookie 在客戶明細表(session)中找出該用戶信息,服務器就知道是哪一個在訪問了。redis
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)
緩存數據庫
,數據存放在內存
中, 可存儲的數據量較小,可是讀取速度較快關係型數據庫
,存儲在硬盤
中,可存儲的數量較大,可是讀取速度較慢