天天看點

jwt token 過期重新整理_JWT Token 重新整理和廢棄Token續簽問題1.更新Payload裡面的過期時間。2.快過期的時候更新Token3.使用Cache記錄Token過期時間4.使用refreshToken5.推薦方案Token廢棄問題1.Cache2.使用者關聯3.黑名單是否需要使用JWT Token?

之前一篇文章簡單介紹了下JWT的用法,涉及到token的簽發和驗證。有人說JWT不适合用于替換傳統的 session+cookies 機制用于Web應用的使用者登入狀态維護,很大原因就是這塊問題。

雖然之前的案例裡面,我們可以成功在登入後擷取一個Token,然後通路伺服器的時候帶着這個Token,伺服器就可以知道目前通路的使用者Uid了,假設現在有一下需求:

  • 登入後7天不用重複登入
  • 超過30天沒有通路網站則需重新登入,否則一直有效
  • 修改密碼功能
jwt token 過期重新整理_JWT Token 重新整理和廢棄Token續簽問題1.更新Payload裡面的過期時間。2.快過期的時候更新Token3.使用Cache記錄Token過期時間4.使用refreshToken5.推薦方案Token廢棄問題1.Cache2.使用者關聯3.黑名單是否需要使用JWT Token?

Token續簽問題

對于第一個問題,我們可以在jwt的 Payload 裡面設定一個過期時間,比如說7天,超過這個時間Token無效。但是如果隻是簡單的這麼做的話就會帶來另一個問題: 假如一個使用者正在通路網站,突然Token失效了,使用者就會掉登入,體驗太差。

是以,大部分時候我們都是采用第二種政策: 超過xx天不通路網站則需要重新登入,如果中間連續通路網站的話則不要重新登入,對于很多手機App,我們可不希望使用者天天輸賬号密碼登入,但如果永久有效可能會帶來一些安全問題。

這其實就是Token的續簽問題,我們看一下網上提到的一些解決方案:

1.更新Payload裡面的過期時間。

JWT的Payload裡面可以設定一個過期時間,我們可以在使用者每次通路的時候把這個過期時間更新一下。由于JWT的secret加密機制,隻要exp變了,整個Token就變了,是以這種機制相當于每次重新頒發了一個新的Token。

這種方案簡單粗暴,存在性能問題,還有安全問題,以前的那麼多Token咋辦?

2.快過期的時候更新Token

比如說離過期時間還有不到1個小時的時候才更新Token,性能上面可能好一點,但是如果一個使用者一直在通路,但是恰好最後一個1個小時内沒有通路網站,那豈不是也gg了?

3.使用Cache記錄Token過期時間

Token本身不設定過期時間,然後我們在redis或memcached等緩存裡面單獨設定一個有效期,每次通路的時候重新整理過期時間。

其實這個方案和使用session機制無異,session也可以儲存在redis或者memcached裡面的。是以,有人戲說這是重新發明了session 。。。

4.使用refreshToken

借鑒 oauth2 的設計,傳回給用戶端一個 refreshToken,允許用戶端主動重新整理JWT。一般而言,jwt 的過期時間可以設定為數小時,而 refreshToken 的過期時間設定為數天。 我對oauth2不太熟悉,不過很明顯這個方案更加複雜了,而且為什麼不拿舊的Token去重新整理JWT呢?

5.推薦方案

最後說一下我覺得比較合适的方案,當伺服器接受到一個Token後,如果它已經過期,但是已過期的時間在xx天内,比如說30天,我們就傳回一個新的Token。比如說Token的有效期是7天,但是如果過期時間不超過30天就可以用舊的Token換取一個新的Token,如果超過了30天那就需要重新登入。

Token廢棄問題

當使用者登出、修改密碼之後,講道理我們是需要廢棄之前的Token,比如說使用者的Token被盜用了,隻能通過修改密碼來防止賬号被盜用。如果使用session機制就很簡單了,我們清空伺服器session,或者使用新的session替換之前舊的session也行。

由于Token是無狀态的,理論上隻要不過期就可以一直用,你說這咋辦?為了安全,必須得做一些額外的工作!

1.Cache

如果你之前是采用把Token存在cache裡面這種方案,那麼你隻要删除cache裡面的key就可以了。不過如果你真的是采用這種方案,還不如直接用session,這時候的Token和sessionid沒差別。

2.使用者關聯

有人說,建一張表把uid和Token關聯起來,這樣一個使用者隻有一個有效的Token,或者存cache也行,建立uid和Token的一對一關系,這方案和1差不多。無論是存表還存cache,每次通路都必不可免的需要通路庫或cache。

3.黑名單

在資料表或cache裡面維護一個黑名單,也避免不了查庫或者查cache,為了避免這個庫内容過多,可以定期清理資料庫,或者給cache設定一個有效期。比如說在上面說的例子裡面,有效期應該設定為30天,30天之後就不用管了。

其實我比較喜歡第3種方案,第2種方案如果使用者多了對庫壓力大,而第3種,除非使用者經常修改密碼或者登出,不然這個資料集不會很大。

如果不考慮安全,我們完全可以不考慮Token廢棄問題,那麼我們就必須在防止XSS攻擊上面做好工作,比如說使用https,cookies設定httpOnly。。。

是否需要使用JWT Token?

看完之後大家是否發現原來JWT Token并沒有那麼好用,這也是很多人說的不要采用JWT的原因了: 講真,别再使用JWT了!、請停止使用 JWT 認證 。。。

仔細看完這些文章其實大家會發現JWT尤其适合那些一次性驗證的應用,比如說有些網站的檔案下載下傳為了防止盜鍊,會在url後面追加一些字元串,這些字元串其實就是Token,它裡面可能包含了使用者資訊和過期時間,你發送給别人下載下傳或者想盜鍊就非常麻煩了。

至于用不用我覺得還是看需求,你覺得呢?

繼續閱讀