1.簡單介紹
session(會話):
當(dāng)用戶打開某個web應(yīng)用時,便與web服務(wù)器產(chǎn)生一次session。服務(wù)器為了區(qū)分當(dāng)前給自己發(fā)請求的是誰,給每個客戶端分配了一個不同的“身份標識”??蛻舳税l(fā)請求時需要攜帶該“身份標識”?!吧矸輼俗R”的存儲方式很多,通常使用cookie。
服務(wù)器使用session把用戶的信息臨時保存在了服務(wù)器上,用戶離開網(wǎng)站后session會被銷毀??墒莝ession有一個缺陷:如果web服務(wù)器做了負載均衡,那么下一個操作請求到了另一臺服務(wù)器的時候session會丟失。
cookie:
cookie是瀏覽器里面能永久存儲的一種數(shù)據(jù)。
cookie由服務(wù)器生成,發(fā)送給瀏覽器,瀏覽器把cookie以key-value形式保存到某個目錄下的文本文件內(nèi),下一次請求同一網(wǎng)站時會把該cookie發(fā)送給服務(wù)器。由于cookie是存在客戶端上的,所以瀏覽器加入了一些限制確保cookie不會被惡意使用,同時不會占據(jù)太多磁盤空間,所以每個域的cookie數(shù)量是有限的。
token(令牌):
token是用戶身份的驗證方式,最簡單的token組成:uid(用戶唯一的身份標識)、time(當(dāng)前時間的時間戳)、sign(簽名,由token的前幾位+鹽以哈希算法壓縮成一定長的十六進制字符串,可以防止惡意第三方拼接token請求服務(wù)器)。還可以把不變的參數(shù)也放進token,避免多次查庫
2.傳統(tǒng)身份驗證
HTTP是一種沒有狀態(tài)的協(xié)議,并不知道誰是訪問者。假設(shè)一個客戶端訪問服務(wù)端時發(fā)送賬號密碼,通過驗證。下回它再次訪問時,還是需要驗證。
解決辦法(session+cookie):
1)客戶端訪問時,通過了驗證。
2)服務(wù)端生成一條記錄,記錄一些必要信息。
3)把記錄這些信息的ID號發(fā)送給客戶端
4)客戶端收到ID號后存儲在cookie中
5)下次客戶端重新訪問服務(wù)端時,帶上cookie信息
6)服務(wù)端驗證cookie里面的信息,如果能找到對應(yīng)的記錄,則用戶通過了驗證
3.token身份驗證
1)客戶端使用賬號密碼請求登錄
2)服務(wù)端收到請求,驗證賬號密碼
3)驗證通過,服務(wù)端簽發(fā)一個token給客戶端
4)客戶端收到token存儲起來(例:存在cookie)
5)客戶端每次請求服務(wù)端時帶著服務(wù)端簽發(fā)的token
6)服務(wù)端收到請求,驗證token。驗證成功則返回數(shù)據(jù)給客戶端
4.常見問題
1.服務(wù)器上的token存儲到數(shù)據(jù)庫中,每次查詢會不會很費時?
如果存儲到數(shù)據(jù)庫中會造成系統(tǒng)的性能問題,可以放在內(nèi)存中
2.客戶端得到的token需要如何處理?
i.在存儲的時候把token對稱加密
ii.將請求url、時間戳、token三者合并加鹽簽名,服務(wù)器驗證有效性