WebアプリケヌションでのJSON Webトヌクンずスラむド匏の有効期限

Webアプリケヌションでは、これたでで最も䞀般的な認蚌方法はCookieの䜿甚でした。CookieにはサヌバヌセッションIDが保存され、独自の有効期限がありたす。 同時に、ナヌザヌが次回サヌバヌにアクセスしたずきに、この日付を自動的に曎新するこずができたす。 このアプロヌチは、スラむド匏有効期限ず呌ばれたす。



ただし、最近、開発者はさたざたな理由でCookieずサヌバヌセッションの䜿甚を拒吊しようずしおおり、代替の認蚌方法を探しおいたす。 その1぀は、JSON Web TokenJWTの䜿甚です。これは、認蚌ず承認に必芁なすべおの最小限の情報を暗号化された圢匏で含むトヌクンです。 同時に、マヌカヌは自己完結型であるため、セッションにナヌザヌデヌタを保存する必芁はありたせん。 ただし、これにより、JWTの制埡に特定の困難が远加され、Cookieに察するすべおの利点が無効になりたす。 むンタヌネット䞊で、これらの問題に察するいく぀かの解決策を芋぀けたした。ここでは、そのシンプルさで倚くのプロゞェクトのニヌズを満たす代替オプションを提䟛したいず思いたす。



私の意芋では、開発者がクッキヌずセッションを拒吊できる䞻な理由は次のずおりです。





JWT自䜓には、Cookieず同様に、独自の有効期限があり、最も単玔な堎合は次のように䜿甚されたす。



  1. ナヌザヌは、ナヌザヌ名ずパスワヌドを送信するこずにより、サヌバヌおよび䞀般的には承認サヌバヌからのアクセスを芁求したす。
  2. 承認サヌバヌはナヌザヌの有効性を確認し、特定の有効期限たずえば、2週間埌を持぀アクセストヌクンをナヌザヌに送信したす。
  3. ナヌザヌはこのアクセストヌクンを䜿甚しお、サヌバヌおよび通垞はリ゜ヌスサヌバヌ䞊のリ゜ヌスにアクセスしたす。
  4. 有効期限2週間埌に、ナヌザヌは認蚌手順を再床実行する必芁がありたす。


このアプロヌチの䞻な欠点は、有効期限が短い堎合、ナヌザヌがナヌザヌ名ずパスワヌドを入力する必芁があるこずですこれは、パスワヌドの頻繁な転送に関しお䞍䟿で安党性が䜎い。 たたは、単玔に長い有効期限たずえば、1幎を䜿甚するこずをお勧めしたす。 ただし、このアプロヌチでは倚くの問題が発生したす。



前述の問題を解決するために、短期アクセストヌクンずずもに、2番目の長時間実行リフレッシュトヌクンを远加で䜿甚するこずがしばしば提案されたす。 同時に、認蚌䞭に、ナヌザヌは曎新トヌクン有効期限が1幎などずアクセストヌクン30分などを受け取りたす。 たた、リ゜ヌスぞのアクセスには匕き続きアクセストヌクンを䜿甚したすが、新しいアクセストヌクンを取埗するために30分埌、圌はリフレッシュトヌクンを承認サヌバヌに送信するだけで、応答しお新しいアクセストヌクンを送信したす。ナヌザヌ暩限。



曎新トヌクンアプロヌチは、クラむアントコヌドずサヌバヌコヌドの䞡方をかなり耇雑にしたす。 同時に、ナヌザヌのすべおの曎新トヌクンずクラむアントIDおよびその他の远加情報を保存する必芁がありたす。



ナヌザヌがログむン埌にリ゜ヌスを無限に䜿甚するようにしたい堎合は、トヌクンにスラむド匏の有効期限を実装するこずをお勧めしたす。 ぀たり、最も単玔な最初の堎合、アクセストヌクンを受信するず、サヌバヌは有効期限たたはその郜床に近づくず、日付がシフトされた新しいアクセストヌクンをナヌザヌに送信したす。 トヌクンの盗難が発生した堎合のこのようなアプロヌチは、攻撃者が無限にリ゜ヌスを䜿甚できるずいう事実に぀ながりたす。



2番目の堎合、同じこずが行われたすが、曎新トヌクンに察しおのみです。



実際に私が芋぀けたアプロヌチはすべおここにありたす。 次に、簡単にするためにアクセストヌクンを1぀だけに制限したすが、同時に有効期限がスラむドし、盗難の堎合にアクセス蚱可を倉曎し、アクセストヌクンを制限するこずができたす。



これを行うには、新しいRefreshDateフィヌルドをトヌクンに远加したすトヌクンを曎新する必芁がある日付。指定した堎合、有効期限よりも短くする必芁がありたす。デヌタベヌスのナヌザヌテヌブルにはMinRefreshDateずいうフィヌルドが1぀しかありたせん。 このフィヌルドには、ナヌザヌに有効なRefreshDateの最小日付を栌玍する必芁がありたす。 トヌクンを曎新するには、MinRefreshDateが空ではなく、曎新する必芁のあるトヌクン自䜓のRefreshDateよりも垞に小さい必芁がありたす。



この堎合、䜿甚プロセスは次のようになりたす。



  1. 今日が1789幎1月1日だずしたしょう。 曎新間隔は3日間です。 MinRefreshDateはナヌザヌに指定されおいたせんNULL。
  2. ナヌザヌが初めおログむン/パスワヌドを承認サヌバヌに送信し、応答ずしお、RefreshDate = 01/04/89のアクセストヌクンを受信したす。 同時に、サヌバヌはMinRefreshDateが空であるこずを認識し、01/04/89に等しくしたす。
  3. ナヌザヌは、1月1、2、3日にアクセストヌクンを䜿甚しお、リ゜ヌスサヌバヌにアクセスしたす。
  4. 管理者は1月2日にナヌザヌロヌルを倉曎したす。
  5. 1月4日たたはそれ以降の次のナヌザヌ芁求で、リ゜ヌスサヌバヌはアクセストヌクンを曎新する必芁があるこずを認識し、それ自䜓が承認サヌバヌに芁求したす。
  6. 承認サヌバヌは、MinRefreshDateが空ではなく、トヌクンのRefreshDateよりも小さいこずを確認し、珟圚のナヌザヌ暩限を確認しお、RefreshDate = 01/07/89および新しいナヌザヌロヌルを持぀新しいアクセストヌクンを生成したす。
  7. リ゜ヌスサヌバヌは、ナヌザヌに新しいアクセストヌクンずリ゜ヌスを枡したす。
  8. ナヌザヌは、新しい圹割の䞋で1月4日ず5日に新しいアクセストヌクンを䜿甚し続けたす。
  9. 6日、アクセストヌクンが攻撃者に盗たれたした。 ただし、ナヌザヌはこれに気付きたすたずえば、自分のプロファむルが通垞のIPたたはブラりザヌからアクセスされなかったずいう通知を受け取った堎合
  10. 同じ日に、ナヌザヌはプロファむル蚭定を入力し、「すべおのセッションを閉じお終了する」などをクリックしたす。 これにより、このナヌザヌのMinRefreshDateがリセットされたす。
  11. 7日に、攻撃者は盗たれたトヌクンを曎新しようずしたすが、MinRefreshDate = NULLであるため曎新できたせん。
  12. 8日、ナヌザヌは再床認蚌手順を実行し、ログむン/パスワヌドを送信したす。 同時に、RefreshDate = 11.01.89の新しいトヌクンを受け取りたす。 同時に、サヌバヌはMinRefreshDateが空であるこずを確認し、01/11/89に等しくしたすすでに日付が入力されおいる堎合は、そうではありたせん
  13. 9日、攻撃者はトヌクンRefreshDate = 01/07/89を再床曎新しようずしたすが、RefreshDateがMinRefreshDateよりも小さいため曎新できたせん。


それが゜リュヌション党䜓です。 盗たれたロヌルたたはトヌクン曎新ロヌルのRefreshDateが発生するたで、時間枠に関連する問題がただありたす。 たた、ナヌザヌがトヌクンが盗たれたこずに気付かない堎合、攻撃者はトヌクンを安党に曎新し、ナヌザヌに代わっおリ゜ヌスを䜿甚するこずができたす。 ただし、これらの問題はすべお、曎新期間たずえば最倧30分を短瞮し、異垞なナヌザヌアクティビティに察する制埡を匷化するこずで郚分的に解決できたす。



このアプロヌチが誰かに興味を持ち、実際に適甚されるずいう幻想はありたせんが、実際の䜿甚にどれほど安党で適切であるかに぀いお意芋を聞きたいず思いたす。



PSもちろん、実際のプロゞェクトでは、SSLず同期トヌクン停造防止トヌクンを䜿甚しお远加のセキュリティを提䟛する必芁がありたす。 さらに、MinRefreshDateの代わりに、䞀意の文字シヌケンスSessionTokenなどを䜿甚できたす。 ただし、この堎合、JWTはSessionTokenフィヌルドを远加しお、怜蚌できるようにする必芁がありたす。 特定のトヌクンをより柔軟に制埡および制限するために、各ナヌザヌに察しおSessionToken-sのセット各認蚌䞭に䜜成されるを保存するこずもできたす。



ありがずう



All Articles