單token存在的問題
????????我們都知道,token是我們在前后端數據傳輸的時候為了保證安全從而必須需要進行設置的東西,他的主要作用實際上就是為了保證我們的數據安全,進行身份驗證和授權,并且相對于session而言更加適合如今的分布式系統,但是,token本身是無狀態的,無法動態設置能不能使用,也就是說任何人獲得了當前的token就能夠利用token進行網絡攻擊,例如多臺ip設備并發攻擊當前網站等,下面列出傳統的解決方案
解決
給token設置一個過期時間,例如jwt生成的token實際上是可以設置時間的,當時間過期之后當前token就無法進行使用了,可以有效的避免因泄露造成的安全,但是,這樣就會出現一個問題,時間應當設置多少,如果設置的比較短,用戶會頻繁的登錄,如果設置的比較長,會不太安全,為了解決這個問題,我們采取【雙token三驗證】的解決方案來解決這個問題
方案原理
token有效期長不安全
????????登錄成功之后,生成兩個token,分別是access_token,和refresh_token,前者有效期可以較短,后者有效期可以較長
? ? ? ? 正常請求后端服務的時候,攜帶access_token,如果發現access_token失效,就通過refresh_token到后臺去獲取新的access_token和refresh_token,你可以理解為token的續表,
? ? ? ? 以此往復,直到refresh_token過期重新登錄即可
token的無狀態性
? ? ? ? 為了使token有狀態,也就是我們可以控制token的什么時候失效,我們可以將refresh_token設置為只能夠使用一次
? ? ? ? 那么這個時候就需要將refresh_token存儲到redis中,并且設置過期時間
? ? ? ? 當我們檢測到token異常的時候,就可以直接令refresh_token失效即可
具體流程
1.前端將用戶名和密碼給予我們的時候,我們判斷是否合理,然后生成access_token以及refresh_token即可
2.refresh_token和access_token可以都是jwt生成,但是,要注意,access_token的時間要短一下,refresh_token的時間要長一下,并且,refresh_token的有效時間并非是由jwt控制的,而是我們的redis存入的時候進行控制的,這也是為了使得token具有有效性,
3.將a_token和r_token返回前端即可
4.當登錄成功之后再次發出請求,這一次可以僅僅返回access_token也就是那個時間比較短的token,然后我們進行校驗,如果當前的access_token合理,返回響應結果即可,也就是第一次驗證
5.如果access_token不合理,那我們返回401,讓前端返回refresh_token,我們檢驗這個token是否有效,無效返回重新登錄,有效繼續,也就是第二次驗證
6.我們查詢redis中當前的refresh_token,看看是否存在和使用過,如是是,返回錯誤,不是的話就去刪除舊的token生成新的access_token和refresh_token
7.循環往復
這樣就解決了token的無狀態性帶來的問題。/