現在バックエンドには
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分間コンピュータから離れたとします。再度ウェブサイトを見ようとしたときにはアクセストークンが消えているので再度ログインする必要性が出てきます。そしてアクセストークンがないのでリフレッシュすることもできませんよね?この実装方法は根本的に間違っているのでしょうか?
理想としては、ユーザーに頻繁にログインさせないために定期的にアクセストークンをリフレッシュする仕組みを実装したいです。
あなたの回答
tips
プレビュー