JWTの正しい実装について
前提
現在バックエンドには
- django rest framework
- django rest framework jwt
フロントエンドには
- next.js
- react
- redux
を用いてウェブサイトを開発しています。 JWT の正しい実装についていくつか質問があります。
また前提として
- Next.js を使用しているので JWT は localStorage ではなく cookies に保存
- JWT は REST framework JWT Auth を使用
- ログインするとアクセストークンが cookies としてフロントエンドに送られる
- アクセストークンとリフレッシュの有効期限は以下の通り
'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300),
'JWT_ALLOW_REFRESH': True,
'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),
'JWT_AUTH_COOKIE': 'token'
これらを踏まえた上で質問させていただきます。
発生している問題
アクセストークンをリフレッシュするタイミングについて
この質問に関して根本的な理解が足りていないのかもしれませんが、記述した通りアクセストークンは 5 分で有効期限が切れてしまいます。
5 分以内なら permission_classes = (IsAuthenticated,)
のページには header にアクセストークンをのせてリクエストすることができるということはわかります。
そして、もし 5 分経過するとクッキーが自動的に削除されユーザーは再度ログインする必要が出てくる、ということを避けるためにリフレッシュという仕組みがあると考えているのですが、まずこの認識で間違いないですか?
間違ってない場合、アクセストークンのリフレッシュはいつ行うのが正解なのでしょうか?
クライアントからアクセストークンを header に乗せてリクエストを送信する前にフロントエンド側でアクセストークンの有効期限と現在時刻を比較し、もし期限切れが迫っていたら、一旦アクセストークンのリフレッシュを先に axios で行い、 cookies に新しくセットされたアクセストークンを用いて再び本来送信しようとしていたリクエストを送信する、これで合っていますか?
他に正しい方法があれば教えてください。
cookies にあるアクセストークンが消えてしまった場合について
cookies にあるアクセストークンは有効期限が切れると自動的に削除されますよね?
例えばユーザーがログインし、 10 分間コンピュータから離れたとします。再度ウェブサイトを見ようとしたときにはアクセストークンが消えているので再度ログインする必要性が出てきます。そしてアクセストークンがないのでリフレッシュすることもできませんよね?
この実装方法は根本的に間違っているのでしょうか?
理想としては、ユーザーに頻繁にログインさせないために定期的にアクセストークンをリフレッシュする仕組みを実装したいです。