web-dev-qa-db-ja.com

ログアウト要求を認証する必要がありますか?

認証サーバーなしでアクセストークンと更新トークンを実装しました(私のAPIサーバーも認証を行います)。

  • アクセストークン:クライアント(localstorage)に保存されます。 20分で期限切れになります。
  • 更新トークン:クライアント(localstorage)とサーバー(データベース)に保存されます。 3か月で有効期限が切れます。
  • 更新「ウィンドウ」は1週間なので、その週内に再ログインしなくてもトークンを更新できます。
  • 3か月後に更新トークンの有効期限が切れるため、ユーザーは再ログインする必要があります。

ユーザーがログアウトすると、ローカルストレージからアクセストークンと更新トークンが削除されます。しかし、サーバー上の更新トークンも削除する必要があるため、/logoutサーバーへのリクエスト。

そのログアウト要求を認証する必要がありますか?

はいとしましょう。問題は、ユーザーがログインしていない(つまり、アクセストークンの有効期限が切れている)場合、更新ウィンドウが経過すると(たとえば、1週間)、自動更新を実行できないため、強制的にログインして、ログアウトできるようにします。おかしい!

代替案は、そのエンドポイントがアクセスと更新トークンのペアを期待することですが、1)アクセストークンの期限切れを許可し、2)アクセストークンが有効であること、および更新トークンが有効かつ最新であることを確認します。その場合、データベースから更新トークンを削除します。

これを処理する一般的な方法は何ですか?私が考慮していない長所/短所はありますか?

4
lonix

ログアウトリソースを保護する必要はありません。

ログアウト要求でセッションが存在する場合。それは無効になります。それ以外の場合は、ログアウトページに直接リダイレクトされます。

3
Shobhit

ユーザーがリクエストしたログアウトとトークンの有効期限には違いがあると思います。

簡単に言えば、攻撃者がすべてのユーザーを強制的にログアウトしないように、/logoutエンドポイントを確実に認証する必要があります。このエンドポイントを検証しない場合、誰でも任意のユーザーをログアウトできます。したがって、このエンドポイントは保護する必要があります。

アクセストークンと更新トークンの両方が期限切れの場合-ユーザーはページに移動しようとします。 /accountおよびバックエンドがアクセストークンの有効期限が切れたことを検出すると、リダイレクトしてエンドポイントを更新します。 /refresh

/refreshは、更新トークンも期限切れであることを検出し、ユーザーを/loginページにリダイレクトします。ユーザーがログインすると、ユーザーは新しい更新トークンとアクセストークンを取得し、すべてが再び順調に進みます。

すべてのアクティブな更新トークンのリストを保持している場合は、2回目のユーザーログイン中にリストを更新する必要があります。別の/logoutを呼び出す必要はありません。ただし、これらのトークンリストは通常​​、検証済みのポストトークン検証のみであり、トークンの有効期限が切れている場合は検証されません。

3
keithRozario

ログアウトエンドポイントを保護する、または保護しない理由は何ですか?

アクセストークンが有効かどうか(有効期限が切れていても)を確認して、更新トークンを取り消します

なぜ:

  • access = currentrefresh = current:これは通常の認証済みリクエストなので、revoke
  • access = expiredrefresh = current:トークンの更新を実行できるので、revoke
  • access = expiredrefresh = expired:ユーザーはとにかくログインする必要があるため、revoke

  • access = invalidおよび/またはrefresh = invalid:トークンがハッキング/盗難されたため、必ずrevoke

だから私が見ることができるすべての道は失効につながる。アクセストークンが有効である限り、有効期限が切れていても対応する更新トークンを取り消すだけです。


これらすべての代替策は、通常の方法でエンドポイントを保護することです。しかし、これはログアウト->更新(失敗)->ログイン->ログアウトループにつながります。私のアプローチはそれを避けます。

1
lonix