少し後であなたの質問に答えて、リフレッシュトークンの目的全体について実際に議論することから始めましょう.
したがって、状況は次のとおりです。
ユーザーはアプリを開き、ログイン資格情報を提供します。現在、おそらくアプリは REST バックエンド サービスと対話しています。REST はステートレスであるため、API へのアクセスを承認する方法はありません。したがって、これまでの説明では、許可されたユーザーが API にアクセスしているかどうか、またはランダムなリクエストが送信されているだけかどうかを確認する方法はありません。
この問題を解決するには、リクエストが許可されたユーザーからのものであることを知る方法が必要です。そこで、アクセストークンと呼ばれるものを導入しました。したがって、ユーザーが正常に認証されると、アクセス トークンが発行されます。このトークンは、長くて非常にランダムなトークンである必要があります (推測できないようにするため)。ここで JWT の出番です。現在、ユーザー固有の詳細を JWT トークンに保存したい場合としない場合があります。理想的には、非常に単純で機密性の低い詳細を JWT に保存するだけです。他のユーザーの詳細 (IDOR など) を取得するための JWT ハッシュの操作は、JWT (使用されているライブラリ) 自体によって処理されます。
したがって、今のところ、承認されたアクセスに関する問題は解決されています。
次に、攻撃シナリオについて説明します。上記のすべてのユーザー Alice を使用して、アプリを使用し、承認されたアクセス トークンを持っているとします。これで、彼女のアプリはすべての API にリクエストを送信し、彼女の承認に従ってデータを取得できます。
何らかの形で Alice が Access Tokenを紛失した、または別の言い方をすれば、敵対者 Bob が Alice の Access Token にアクセスしたとします。これで、Bob は許可されていませんが、Alice が許可されていたすべての API に対してリクエストを行うことができます。
理想的には望まないもの。
この問題の解決策は次のとおりです。
- この種の何かが起こっていることを検出します。
- 攻撃ウィンドウ自体を減らします。
アクセス トークンだけを使用すると、上記の条件 1 を達成するのは困難です。なぜなら、Alice であれ Bob であれ、同じ承認済みトークンが使用されているため、2 人のユーザーからの要求を区別できないからです。
したがって、上記の 2 を達成しようとするため、アクセス トークンの有効期限に有効期限を追加します。たとえば、アクセス トークンは 't' (短期間) 有効です。
それはどのように役立ちますか?ボブはアクセス トークンを持っていても、それが有効な間だけ使用できます。有効期限が切れるとすぐに、彼はそれを再度取得する必要があります。もちろん、彼は最初に手に入れたのと同じ方法でそれを手に入れることができると言えます。しかし、100% のセキュリティに勝るものはありません。
上記のアプローチにはまだ問題があり、場合によっては受け入れられません。アクセス トークンの有効期限が切れると、ユーザーは自分のログイン資格情報を入力し、承認されたアクセス トークンを再度取得する必要があります。これは、少なくともモバイル アプリの場合、ユーザー エクスペリエンスが悪い (受け入れられない) ものです。
解決策:ここでリフレッシュ トークンの出番です。これもランダムで予測不可能なトークンであり、最初にアクセス トークンと共にアプリにも発行されます。この更新トークンは非常に有効期間の長い特別なトークンであり、アクセス トークンの有効期限が切れるとすぐにサーバーに新しいアクセス トークンを要求するため、ユーザーがログイン資格情報を再入力して取得する必要がなくなります。既存のトークンの有効期限が切れると、新しい承認済みアクセス トークン。
ボブは、アクセス トークンを侵害したのと同じように、リフレッシュ トークンにもアクセスできると思うかもしれません。はい。彼はできます。しかし、アクセス トークンだけでは不可能だったそのような発生を特定し、被害を軽減するために必要な措置を講じることが容易になりました。
どのように?
認証されたユーザーごとに (通常、モバイル アプリの場合)、1 対 1 でマップされた更新トークンとアクセス トークンのペアがアプリに発行されます。そのため、任意の時点で、認証された 1 人のユーザーに対して、更新トークンに対応するアクセス トークンは 1 つだけです。ここで、Bob が更新トークンを侵害した場合、彼はそれを使用してアクセス トークンを生成すると仮定します (アクセス トークンは、API を介してリソースにアクセスすることを許可されている唯一のものであるため)。ボブ (攻撃者) が新しく生成されたアクセス トークンを要求するとすぐに、アリス (本物のユーザー) のアクセス トークンがまだ有効であるため、サーバーはこれを異常と見なします。時間。異常を特定すると、サーバーは問題のリフレッシュ トークンを破棄し、それとともに、関連付けられているアクセス トークンも無効になります。したがって、リソースを必要とする承認への、本物または悪意のあるアクセスを防止します。ユーザーの Alice は、資格情報を使用してもう一度認証し、有効な更新トークンとアクセス トークンのペアを取得する必要があります。
もちろん、Bob が再びリフレッシュ トークンとアクセス トークンの両方へのアクセスを取得し、上記のすべての話を繰り返し、実際の真の顧客である Alice に対する DoS につながる可能性があると主張することもできますが、100% のセキュリティに勝るものはありません。 .
また、良い方法として、更新トークンには有効期限がありますが、かなり長いものです。