jwt與token?
1. 問題描述
jwt與token+redis,哪種方案更好用?
問題結論剛好最近有項目使用了jwt,而且是定制化的jwt的認證機制,就個人的理解而言,各自有其優缺點,并且針對不同的場景需要進行約束性開發,如用戶剔除、同一用戶每2h只生成一次jwt等。2. Token機制簡述2.1 Token的用途用戶在登錄APP時,APP端會發送加密的用戶名和密碼到服務器,服務器驗證用戶名和密碼,如果驗證成功,就會生成相應位數的字符產作為token存儲到服務器中,并且將該token返回給APP端。以后APP再次請求時,凡是需要驗證的地方都要帶上該token,然后服務器端驗證token,成功返回所需要的結果,失敗返回錯誤信息,讓用戶重新登錄。其中,服務器上會給token設置一個有效期,每次APP請求的時候都驗證token和有效期。在存儲的時候把token進行對稱加密存儲,用到的時候再解密。文章最開始提到的簽名sign:將請求URL、時間戳、token三者合并,通過算法進行加密處理。
2.2 token+redis機制用戶驗證通過后,服務端通過如uuid相關的方法,生成token,存儲用戶信息。當請求服務時,客戶端將token帶上來,進行查詢驗證,如token存在并在有限期內,請求有效,否則請求非法。token + redis機制是中心化的,每次驗證token有效性時,都需要訪問redis,其核心優點實服務端可以主動讓token失效,缺點是每次都要進行redis查詢。占用redis存儲空間。
2.3 jwt機制這是一種無狀態身份驗證機制,因為用戶狀態永遠不會保存在服務器內存中。 服務器受保護的路由將在授權頭中檢查有效的JWT,如果存在,則允許用戶訪問受保護的資源。 由于JWT是獨立的,所有必要的信息都在那里,減少了多次查詢https://www.b5b6.com/shujuku/的需求。
Java jwt普遍選用java-jwt工具包依賴,gradle依賴:compile 'com.auth0:java-jwt:3.2.0'用戶發起登錄請求,驗證通過后,服務端創建一個加密后的JWT信息,作為Token返回。在后續請求中JWT信息作為請求頭,發給服務端。服務端拿到JWT之后進行解密,正確解密表示此次請求合法,驗證通過;解密失敗說明Token無效或者已過期。jwt的有點主要有:a.其是去中心化的,便于分布式系統使用; 2. 基本信息可以直接放在token中。 user_id,session_id; 3. 功能權限信息可以直接放在token中。用bit位表示用戶所具有的功能權限。 其缺點有:服務端無法主動讓token失效,另一個是無法很好的控制payload的數據量。
3. 小結jwt和token+redis兩種方案,沒有最優,只有結合不同的業務場景,需求最適合的方案。就比如token 2h過期,同一用戶每1.5h只生成一次token,當兩次token并存時,同時有效。大家可以考慮在這兩種方案的前提下,分別如何實現?作者:夕陽雨晴,歡迎關注我的頭條號:偶爾美文,主流Java,為你講述不一樣的碼農生活。