傳統(tǒng)的web端登錄巢价,是將登錄信息緩存到服務(wù)端的session中出革,每個session有一個唯一的sessionId贝或。瀏覽器請求服務(wù)端會自動在請求頭的cookie中帶上sessionId,一般開發(fā)的時候?qū)essionId是無感知的泼诱。而token的本質(zhì)是一段加密的字符串坛掠,包含了登錄用戶的信息
token登錄驗證序列圖
token登錄序列圖.png
為什么使用token
相比session而言,token有以下幾點優(yōu)勢
- 服務(wù)端不需要緩存用戶信息治筒,減少服務(wù)器壓力
- token緩存在客戶端屉栓,服務(wù)器重啟,登錄狀態(tài)不會失效
- session是瀏覽器特有的耸袜,app要支持會比較繁瑣友多,token就沒有這樣的限制
- 易于擴展,存在多臺服務(wù)器的情況下堤框,使用負載均衡域滥,第一次登錄請求轉(zhuǎn)發(fā)到A服務(wù)器,在A服務(wù)器的session中緩存了用戶的登錄信息蜈抓,如果第二次請求轉(zhuǎn)發(fā)到了B服務(wù)器启绰,就丟失了登錄狀態(tài)。雖然可以使用redis等手段共享session沟使,但token就簡單很多委可,不同的服務(wù)器只需要使用相同的一段解密代碼即可
java生成token方法
JWT(JSON Web Token)
網(wǎng)上找到的大部分資料都是使用JWT來生成token,JWT生成的token包含三部分
- header:包含token類型和加密算法
- payload:存放自定義數(shù)據(jù)
- signature:對前面兩部分的簽名格带,防止篡改數(shù)據(jù)\r\n\r\n用JWT生成的token是很長的一串字符串撤缴,用Base64進行編碼,可以解碼出原數(shù)據(jù)叽唱,注意不能放一些私密信息屈呕,比如用戶密碼
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9\r\n.eyJleHBpcmVUaW1lIjoxNTQ5NTU0NDUyLCJ1c2VyTmFtZSI6IuacveacqCIsInVzZXJJZCI6IjY2NiJ9\r\n.fiQKWuMTWbkfQ3dOozoJr13pJSmKnc5El4EBnKyU42o
上面這很長的一串就是用JWT生成的token,可以感受一下這個長度棺亭』⒄#客戶端的每次請求都要帶上這么一大串,服務(wù)端的每次響應(yīng)都要返回這么一大串镶摘,我個人是難以接受的嗽桩。所以我用了下面那種方法
AES(Advanced Encryption Standard)
token本質(zhì)是一段加密的字符串,包含登錄用戶的一些信息凄敢,通過解密可以獲取這些信息碌冶,所以理論上任何安全的加密解密手段都可以用來生成token
高級加密標準AES,在密碼學(xué)中又稱Rijndael加密法涝缝,是美國聯(lián)邦政府采用的一種區(qū)塊加密標準扑庞。AES采用對稱加密譬重,相比于非對稱加密,對稱加密效率更快
- 對稱加密:加密和解密使用相同的密鑰罐氨。適用于單方面的加密解密臀规,密鑰不能泄露
- 非對稱加密:使用公鑰加密,私鑰解密栅隐。適用于一方加密塔嬉,另一方解密,比如前后端的數(shù)據(jù)傳輸租悄,可以在客戶端使用公鑰對數(shù)據(jù)進行加密谨究,在服務(wù)端使用密鑰進行解密,增強數(shù)據(jù)安全性
token的加密解密都在服務(wù)端進行泣棋,所以使用對稱加密的AES算法即可
EmaZUvyM9aabQ2Jmo6THJ/r3/e2xAjpRmoA5TzvuR4I=
上面這一小串就是用AES生成的token了记盒,是不是清爽了很多,而且沒有密鑰無法解密外傅,相比JWT生成的token,AES生成的token攜帶的數(shù)據(jù)更安全