Token無狀態登錄驗證

傳統的web端登錄,是將登錄信息緩存到服務端的session中,每個session有一個唯一的sessionId。瀏覽器請求服務端會自動在請求頭的cookie中帶上sessionId,一般開發的時候對sessionId是無感知的。而token的本質是一段加密的字符串,包含了登錄用戶的信息

token登錄驗證序列圖

Token無狀態登錄驗證

token登錄序列圖.png

為什麼使用token

相比session而言,token有以下幾點優勢

  1. 服務端不需要緩存用戶信息,減少服務器壓力
  2. token緩存在客戶端,服務器重啟,登錄狀態不會失效
  3. session是瀏覽器特有的,app要支持會比較繁瑣,token就沒有這樣的限制
  4. 易於擴展,存在多臺服務器的情況下,使用負載均衡,第一次登錄請求轉發到A服務器,在A服務器的session中緩存了用戶的登錄信息,如果第二次請求轉發到了B服務器,就丟失了登錄狀態。雖然可以使用redis等手段共享session,但token就簡單很多,不同的服務器只需要使用相同的一段解密代碼即可

java生成token方法

JWT(JSON Web Token)

網上找到的大部分資料都是使用JWT來生成token,JWT生成的token包含三部分

  1. header:包含token類型和加密算法
  2. payload:存放自定義數據
  3. signature:對前面兩部分的簽名,防止篡改數據\r\n\r\n用JWT生成的token是很長的一串字符串,用Base64進行編碼,可以解碼出原數據,注意不能放一些私密信息,比如用戶密碼
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9\r\n.eyJleHBpcmVUaW1lIjoxNTQ5NTU0NDUyLCJ1c2VyTmFtZSI6IuacveacqCIsInVzZXJJZCI6IjY2NiJ9\r\n.fiQKWuMTWbkfQ3dOozoJr13pJSmKnc5El4EBnKyU42o

上面這很長的一串就是用JWT生成的token,可以感受一下這個長度。客戶端的每次請求都要帶上這麼一大串,服務端的每次響應都要返回這麼一大串,我個人是難以接受的。所以我用了下面那種方法

AES(Advanced Encryption Standard)

token本質是一段加密的字符串,包含登錄用戶的一些信息,通過解密可以獲取這些信息,所以理論上任何安全的加密解密手段都可以用來生成token

高級加密標準AES,在密碼學中又稱Rijndael加密法,是美國聯邦政府採用的一種區塊加密標準。AES採用對稱加密,相比於非對稱加密,對稱加密效率更快

  • 對稱加密:加密和解密使用相同的密鑰。適用於單方面的加密解密,密鑰不能洩露
  • 非對稱加密:使用公鑰加密,私鑰解密。適用於一方加密,另一方解密,比如前後端的數據傳輸,可以在客戶端使用公鑰對數據進行加密,在服務端使用密鑰進行解密,增強數據安全性
  • token的加密解密都在服務端進行,所以使用對稱加密的AES算法即可
EmaZUvyM9aabQ2Jmo6THJ/r3/e2xAjpRmoA5TzvuR4I=

上面這一小串就是用AES生成的token了,是不是清爽了很多,而且沒有密鑰無法解密,相比JWT生成的token,AES生成的token攜帶的數據更安全

鏈接:https://www.jianshu.com/p/7c34b78f1675


分享到:


相關文章: