1、首先http協議是無狀態的
什么是無狀態?就是服務器不知道是誰發送了這個http請求,無法區分用戶
2、為什么要有登錄態
交互式網站的興起,比如購物網站,服務器必須知道有哪些人往自己購物車里增加了商品,哪些人下了訂單,就意味着,每次發送接口請求都必須區分出每個人。但是http又是沒有狀態的,沒辦法記錄和區分用戶。所以登錄態就是用來區分用戶的,讓服務器知道每次的請求會話都是誰發送的,誰需要處理的。
3.區分用戶的幾種方式
1)、sessionid
登錄的時候,服務器生成一個sessionid返回給客戶端,客戶端記住這個sessionid,然后每次請求的時候都把這個sessionid一起發送過來,就能區分出誰是誰了,但前提是服務器必須記住所有的sessionid。
2)、token
針對sessionid的弊端(要占用大量服務器資源進行存儲)所產生的新的方式。同樣是服務端發送一個唯一標識給客戶端,然后每次的請求都將這個標識傳給服務器進行驗證。區別在於,服務端不用存儲這個唯一標識。
如何生成這個唯一標識?
將登陸發送過來的數據,用某種算法,然后再加一個秘鑰,做一次簽名,把這個數據和簽名一起作為token發送給客戶端。
如何驗證唯一標識?
當請求發送到服務端的時候,再用同樣的算法和秘鑰,對token中的數據做一次簽名,和token中的簽名進行對比,如果相同,說明認證通過。
注意:token中不能保存密碼等用戶敏感信息。
token驗證請求過程:
1、用戶登錄時,發送用戶名和密碼到服務端;
2、服務端驗證用戶名和密碼的正確性;
3、驗證通過,返回一個帶有簽名的token給客戶端;
4.客戶端cookie存儲token,並且之后每次發送請求時都將這個token放到header中;
5、服務端接收到請求,並且拿到token,進行簽名驗證,然后返回信息給客戶端