在使用jwt
的過程中發現了兩個問題續期和退出的問題。
續期
因爲jwt
的token
在簽發之後是有過期時間的,所以就存在管理這個過期時間的問題。我看網上有提出解決方案的大致有下面幾個
- 每次更新過期時間,跟session一樣,每次請求的時候都會去更新下
token
過期時間.但是對於jwt
來說,更新過期時間就意味着jwt
的token
會變,那麼前端就需要每個請求都去保存一次新的token
。這樣使得前端的工作變的複雜起來。而且這樣做的話,會存在多個令牌同時有效,可能會引起一些安全問題。 - 還有一個就是每隔一段時間去更新一次
token
。這種做法也是很多人採用的一種。比如:token
過期時間是一個小時。預設每五十五分鐘去更新token
。這種模式也是需要前端去配合完成的。
退出
因爲token
在簽發之後在一段時間內是一直有效的,那麼這種情況,我們怎麼去管理登出呢?
- 簡單的方式就是客戶端直接刪除
token
。但是這樣的話,如果token
泄露了也是不安全的。 - 有人提出退出的時候將
token
存放在redis
中,過期時間設置爲跟token
的時候一樣。當用戶在次用舊的token
訪問的時候,如果發現redis
中存在token
,那麼提示token
過期。
對於續期的話,個人覺得第二種方案是比較好的一種方案。而退出的話,如果不考慮泄露的問題,那麼第一種方案是比較好的一種方案。但是如果做SSO
的話可能第二種方案是比較好的一種,但是在用到了redis
之後就違背了jwt
的設計初衷,需要與數據庫交互。
其實個人覺得,jwt
的加密方式結合redis
這種也是可以採用的。畢竟這些都是爲了解決問題。當利用到redis
之後,我們就可以將jwt
擴展下。在payload
部分加載一個生成的refresh token
,這個refresh token
也是有過期時間的,我們需要將這個refresh token
存放在redis
中。這樣的話,我們就可以把jwt
的過期時間放在這個refresh token
中維護。續期也就是維護這個refresh token
的過期時間,退出的話 也就是刪除這個refresh token
就可以了。
其實這樣的話就跟傳統的token
驗證一樣了,也就是外層加了一個jwt
的驗證。
可能是我對於這方面瞭解的比較少,不能想到什麼有效的方案。這些都是自己對jwt
的一些理解。如果哪位大佬有更好的方案,希望賜教。感謝