連結:shotCathttps://juejin.im/post/5c6e6063f265da2da53ec8f3
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SZlhTY5QTYycTNkVTYiJWMzkzY3YGO5ImNjhDZ5AzN38CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
什麼是Token?
Token是使用者身份的驗證方式,通常叫它:令牌。當使用者第一次登入後,伺服器生成一個Token并将此Token傳回給用戶端,以後用戶端隻需帶上這個Token前來請求資料即可,無需再次帶上使用者名和密碼。
Token由哪幾部分組成?
uid(使用者唯一的身份辨別)、time(目前時間的時間戳)、sign(簽名,由token的前幾位+鹽以雜湊演算法壓縮成一定長的十六進制字元串,可以防止惡意第三方拼接Token請求伺服器)。還可以把不變的參數也放進Token,避免多次查庫。
Token就象一個護照。第一次需要在前台驗證你的身份(通過你的使用者名和密碼),如果你成功驗證了自己,你就可以取得這個通行證。當你走進大樓的時候(試圖從調用API擷取資源),你會被要求驗證你的護照,而不是在前台重新驗證。
驗證流程
大概的流程是這樣的:
1, 用戶端使用使用者名和密碼請求登入;
2, 服務端收到請求,去驗證使用者名與密碼;
3, 驗證成功後,服務端會簽發一個 Token,再把這個 Token 發送給用戶端;
4, 用戶端收到 Token 以後可以把它存儲起來,比如放在 Cookie 裡或者 Local Storage 裡;
5, 用戶端每次向服務端請求資源的時候需要帶着服務端簽發的 Token;
6, 服務端收到請求,然後去驗證用戶端請求裡面帶着的 Token,如果驗證成功,就向用戶端傳回請求的資料;
總的來說就是用戶端在首次登陸以後,服務端再次接收http請求的時候,就隻認token了,請求隻要每次把token帶上就行了,伺服器端會攔截所有的請求,然後校驗token的合法性,合法就放行,不合法就傳回401(鑒權失敗)。
優點
1.Token 完全由應用管理,是以它可以避開同源政策. (Cookie是不允許垮域通路的,token不存在)
2.Token 可以避免 CSRF 攻擊(也是因為不需要cookie了)
3.Token 可以是無狀态的,可以在多個服務間共享
4.Token 支援手機端通路(Cookie不支援手機端通路)
伺服器隻需要對浏覽器傳來的Token值進行解密,解密完成後進行使用者資料的查詢,如果查詢成功,則通過認證.是以,即時有了多台伺服器,伺服器也隻是做了Token的解密和使用者資料的查詢,它不需要在服務端去保留使用者的認證資訊或者會話資訊,這就意味着基于token認證機制的應用不需要去考慮使用者在哪一台伺服器登入了,這就為應用的擴充提供了便利,解決了session擴充性的弊端。
缺點
1.占帶寬: 正常情況下token要比 session_id更大,需要消耗更多流量,擠占更多帶寬.(不過幾乎可以忽略)
2.性能問題: 相比于session-cookie來說,token需要服務端花費更多的時間和性能來對token進行解密驗證.其實Token相比于session-cookie來說就是一個"時間換空間"的方案.