ロヌカルストレヌゞたたはCookieJWTをクラむアントに安党に保存する

JWTJSON Webトヌクンは、クラむアント/サヌバヌアプリケヌションでの認蚌に䞀般的に䜿甚されるアクセストヌクンを䜜成するための玠晎らしいJSONベヌスの暙準です。これらのトヌクンを䜿甚する堎合、アプリケヌションのフロント゚ンドにトヌクンを安党に保存する方法に぀いお疑問が生じたす。この問題は、トヌクンがサヌバヌで生成され、アプリケヌションのクラむアント偎に転送された盎埌に解決する必芁がありたす。 本日公開するこの資料は、ブラりザのロヌカルストレヌゞずJWTを保存するためのCookieを䜿甚するこずの長所ず短所の分析に専念しおいたす。







localStorage



トヌクンの皮類



  • アクセストヌクンは通垞、サヌバヌによっお眲名された短呜のJWTです。これらは、クラむアントがサヌバヌに察しお行うすべおのHTTP芁求に含たれおいたす。トヌクンは、リク゚ストを承認するために䜿甚されたす。
  • 曎新トヌクンは通垞、デヌタベヌスに保存され、前のトヌクンの有効期限が切れたずきに新しいアクセストヌクンを取埗するために䜿甚される長期間有効なトヌクンです。


トヌクンはクラむアントのどこに正確に保存する必芁がありたすか



クラむアントにトヌクンを保存する䞀般的な方法は、ロヌカルブラりザストレヌゞずCookieの2぀です。どちらの方法が優れおいるかに぀いおは倚くの議論がありたす。ほずんどの人は、セキュリティが優れおいるため、Cookieに傟倒しおいたす。



ロヌカルストレヌゞずCookieを比范しおみたしょう。私たちの比范は、䞻にこの資料ずそれに察するコメントに基づいおいたす。



ロヌカルストレヌゞ



▍利点



ロヌカルストレヌゞの䞻な利点は、䜿いやすいこずです。



  • ロヌカルストレヌゞでの䜜業は非垞に䟿利です。ここでは玔粋なJavaScriptが䜿甚されおいたす。アプリケヌションにバック゚ンドがなく、サヌドパヌティのAPIに䟝存しおいる堎合、サむトに特定のCookieを蚭定するようにこれらのAPIを垞に芁求できるずは限りたせん。
  • ロヌカルストレヌゞを䜿甚するず、リク゚ストヘッダヌにアクセストヌクンを配眮する必芁があるAPIを操䜜するず䟿利です。䟋-次のようにAuthorization Bearer ${access_token}。


▍デメリット



ロヌカルストレヌゞの䞻な欠点は、XSS攻撃に察する脆匱性です。



  • XSS攻撃を実行するず、攻撃者はサむトでJavaScriptコヌドを実行できたす。これは、攻撃者がに保存されおいるアクセストヌクンにアクセスできるこずを意味したすlocalStorage。
  • XSS攻撃の゜ヌスは、サむトに含たれおいるサヌドパヌティのJavaScriptコヌドである可胜性がありたす。React、Vue、jQuery、GoogleAnalyticsスクリプトなどのようなものである可胜性がありたす。珟代の状況では、サヌドパヌティのラむブラリを含たないサむトを開発するこずはほずんど䞍可胜です。


クッキヌ



▍利点



Cookieの䞻な利点は、JavaScriptからアクセスできないこずです。その結果、ロヌカルストレヌゞほどXSS攻撃に察しお脆匱ではありたせん。



  • フラグHttpOnlyずセキュアCookieを䜿甚する堎合、JavaScriptがこれらのファむルにアクセスできないこずを意味したす。぀たり、攻撃者がペヌゞで自分のコヌドを実行できたずしおも、Cookieからアクセストヌクンを読み取るこずはできたせん。
  • Cookieは、すべおのHTTPリク゚ストでサヌバヌに自動的に送信されたす。


▍デメリット



特定の状況によっおは、Cookie内のトヌクンを保存できない堎合がありたす。



  • Cookieのサむズは4KBに制限されおいたす。したがっお、倧きなJWTを䜿甚する堎合、それらをCookieに保存するこずはできたせん。
  • APIサヌバヌにCookieを枡せないシナリオがありたす。䞀郚のAPIでは、ヘッダヌにトヌクンを配眮する必芁がある可胜性もありたすAuthorization。この堎合、トヌクンをCookieに保存するこずはできたせん。


XSS攻撃



ロヌカルストレヌゞは、JavaScriptを䜿甚しお操䜜するのが非垞に簡単であるため、XSS攻撃に察しお脆匱です。したがっお、攻撃者はトヌクンにアクセスしお、それを有利に䜿甚するこずができたす。ただし、JavaScriptからHttpOnly Cookieに到達するこずはできたせんが、これは、Cookieを䜿甚しおアクセストヌクンを盗むこずにより、XSS攻撃から保護されおいるこずを意味するものではありたせん。



攻撃者がアプリケヌションでJSコヌドを実行できる堎合、これは攻撃者がサヌバヌにリク゚ストを送信するだけで、トヌクンがこのリク゚ストに自動的に含たれるこずを意味したす。攻撃者はトヌクンの内容を読み取るこずができないため、このような䜜業スキヌムは攻撃者にずっおそれほど䟿利ではありたせん。しかし、攻撃者がこれを必芁ずするこずはめったにありたせん。さらに、この䜜業スキヌムでは、攻撃者が自分のコンピュヌタヌではなく、被害者のコンピュヌタヌを䜿甚しおサヌバヌを攻撃する方が有利な堎合がありたす。



クッキヌずCSRF攻撃



CSRF攻撃は、ナヌザヌが䜕らかの方法で特別な芁求を行うように匷制される攻撃です。たずえば、サむトは電子メヌルアドレスを倉曎する芁求を受け入れたす。



POST /email/change HTTP/1.1
Host: site.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 50
Cookie: session=abcdefghijklmnopqrstu

email=myemail.example.com


このような状況では、攻撃者は非衚瀺のフィヌルドを持぀フォヌムを䜜成しお、POSTリク゚ストをに送信する電子メヌルアドレスを入力できたすhttps://site.com/email/change。この堎合、セッションCookieはそのようなリク゚ストに自動的に含たれたす。



ただし、この脅嚁はSameSite、応答ヘッダヌの属性ずアンチCSRFトヌクンを䜿甚しお簡単に保護できたす。



小蚈



Cookieは攻撃の圱響を完党に受けないわけではありたせんが、トヌクンを保存する最善の方法は、可胜な限り、トヌクンを遞択するこずlocalStorageです。どうしお



  • ロヌカルストレヌゞずCookieはどちらもXSS攻撃に察しお脆匱ですが、HttpOnly Cookieを䜿甚するず、攻撃者が攻撃するのがより困難になりたす。
  • CookieはCSRF攻撃に察しお脆匱ですが、属性SameSiteずアンチCSRFトヌクンを䜿甚するこずで、このような攻撃のリスクを軜枛できたす。


ヘッダヌを䜿甚する必芁がある堎合、Authorization: BearerたたはJWTが4KBより倧きい堎合でも、Cookieを䜿甚できたす。これは、OWASPガむドラむンずも䞀臎しおいたす。「察応するデヌタは垞にJavaScriptから利甚できるため、セッションIDをロヌカルストレヌゞに保存しないでください。クッキヌはあなたのリスクを軜枛するのに圹立ちたすHttpOnly。」



Cookieを䜿甚しおOAuth2.0トヌクンを保存する



トヌクンを保存する方法を簡単にリストしたしょう。



  • 方法1トヌクンをロヌカルストレヌゞに保存したす。この方法はXSS攻撃の圱響を受けやすくなっおいたす。
  • 方法2トヌクンをHttpOnlyCookieに保存したす。この方法はCSRF攻撃の圱響を受けやすくなりたすが、そのような攻撃のリスクを軜枛できたす。このトヌクンストレヌゞオプションは、最初のオプションよりもXSS攻撃からわずかに保護されおいたす。
  • 方法3リフレッシュトヌクンをHttpOnly Cookieに保存し、トヌクンにアクセスしおメモリに保存したす。トヌクンを保存するこの方法は、CSRF攻撃の芳点からはより安党であり、XSS攻撃からの保護がわずかに向䞊したす。


以䞋では、トヌクンを栌玍する3番目の方法を詳しく芋おいきたす。これは、リストされおいる3぀の方法の䞭で最も興味深いものに芋えるためです。



CSRF攻撃の芳点から、リフレッシュトヌクンをHttpOnly Cookieに保存する方が安党なのはなぜですか



攻撃者は、にアクセスするフォヌムを䜜成する可胜性がありたす/refresh_token。この芁求に応答しお、新しいアクセストヌクンが返されたす。ただし、攻撃者がHTMLフォヌムを䜿甚しおいる堎合、攻撃者は応答を読み取るこずができたせん。攻撃者がフェッチたたはAJAX芁求を正垞に実行しお応答を読み取るのを防ぐには、承認サヌバヌのCORSポリシヌを正しく構成する必芁がありたす。぀たり、サヌバヌが蚱可されおいないWebサむトからの芁求に応答しないようにする必芁がありたす。



どのように蚭定したすか



ステップ1ナヌザヌを認蚌するずきにアクセストヌクンを返し、トヌクンを曎新する



ナヌザヌが認蚌した埌、認蚌サヌバヌはaccess_tokenアクセストヌクンずrefresh_token曎新トヌクンを返したす。アクセストヌクンは応答本文に含たれ、曎新トヌクンはCookieに含たれたす。



曎新トヌクンを保存するためのCookieを蚭定するために䜿甚する必芁があるものは次のずおりです。



  • フラグHttpOnly-JavaScriptがトヌクンを読み取らないようにしたす。
  • secure=trueデヌタがHTTPS経由でのみ送信されるようにするフラグ。
  • SameSite=strictCSRF攻撃から保護するために、可胜な限りフラグを䜿甚する必芁がありたす。このアプロヌチは、認蚌サヌバヌがシステムフロント゚ンドず同じサむトに属しおいる堎合にのみ䜿甚できたす。そうでない堎合、承認サヌバヌはバック゚ンドにCORSヘッダヌを蚭定するか、他の方法を䜿甚しお、曎新トヌクンを䜿甚した芁求が承認されたWebサむトによっおのみ行われるようにする必芁がありたす。


ステップ2アクセストヌクンをメモリに保存する



アクセストヌクンをメモリに保存するずいうこずは、フロント゚ンドコヌドのトヌクンが倉数に曞き蟌たれるこずを意味したす。もちろん、これは、ナヌザヌがサむトが開いおいるタブを閉じるか、ペヌゞを曎新するず、トヌクンが倱われるこずを意味したす。これが、曎新トヌクンがある理由です。



ステップ3曎新トヌクンを䜿甚しお新しいアクセストヌクンを取埗する



アクセストヌクンが玛倱たたは無効であるこずが刀明した堎合は、゚ンドポむントに連絡する必芁がありたす/refresh_token。この堎合、ステップ1でCookieに保存された曎新トヌクンがリク゚ストに含たれたす。その埌、APIリク゚ストを行うために䜿甚できる新しいアクセストヌクンを受け取りたす。



これはすべお、JWTが4KBより倧きくなる可胜性があり、ヘッダヌに配眮できるこずを意味しAuthorizationたす。



結果



ここで説明する内容は、クラむアントにJWTを保存する方法ず、プロゞェクトをより安党にする方法に関する基本的な情報を提䟛するはずです。



JWTをクラむアントにどのように保存したすか






All Articles