web-dev-qa-db-ja.com

JSON Webトークンを使用したCSRF保護

JWTを使用する場合、CRSF攻撃から保護する必要はありません。たとえば、「 Cookieに依存していないため、クロスサイトリクエストから保護する必要はありません 」。

しかし、私が理解していないもの:トークンをlocalStorageに保存すると(同じウェブサイトのチュートリアルで (== --- ==)がアドバイスされたように )、攻撃者がクッキーの代わりにlocalStorageを読み取ることで悪意のあるリクエストを偽造しますか?

サーバー側で生成されたため、トークンをクライアントのどこかに保存せずにクライアントリクエストに使用する方法はわかりません。

43
JulienD

厳密に言えば、はい、ローカル/セッションストレージ(これをHTML5ストレージと呼びます)に格納されているものはすべて、クロスサイトスクリプティング(XSS)攻撃で盗まれる可能性があります。 この記事 を参照してください。

ただし、検討すべき可動部分がたくさんあります。

まず、JavaScriptアクセスに関してHTML5ストレージとCookieのスコープが微妙に異なります。

HTML5ストレージは次のとおりです。

  • httpとhttpsに分けられます。 http://example.com HTML5ストレージに保存されているアイテムには、https://example.comで実行されているJavaScriptからアクセスできません。
  • サブドメイン間で分割されます。 http://example.com HTML5ストレージに格納されたアイテムは、http://sub.example.comで実行されているJavaScriptからアクセスできません(ただし、これを回避するために tricks を実行できます)。

クッキーはよりルーズグースです:

  • ドメインexample.comを持つCookieはhttp://example.comhttps://example.comの両方に移動します-nless属性にはsecureがあり、その場合のみhttpsに送信されます。
  • 明示的なドメインで送信されないCookieは、送信元のドメインにのみ送信されます。ドメインがexample.comと明示的に定義されている場合、example.comsub.example.comの両方に送信されます。 (これはCookie "spec"の最も混乱しやすい部分です。残念ながら、 この記事 を参照してください)。
  • 一致するドメイン(およびsecure Cookieフラグを尊重する)で実行されている場合、JavaScriptでCookieを読み取ることができますnless CookieのhttpOnly属性は、その場合、JavaScriptはそれを読み取ることができません。

第二に、Cookieはドメインでマークされているため、サーバーへのリクエストが行われると、ブラウザは一致するドメインを持つすべてのCookieを送信しますリクエストを発信したページのドメインに関係なく

最後の部分は、CSRF攻撃がどのように達成されるかです(同じ起源のポリシーは非常に役立ちます)。 CSRFのOWASPページ は、これらの種類の攻撃がどのように機能するかを学習するための優れたリソースです。

認証トークンをローカルストレージに保存し、各リクエストに手動で追加してCSRFから保護する理由は、Word:マニュアルというキーです。ブラウザは自動的に認証トークンを送信しないため、evil.comにアクセスし、POST http://example.com/delete-my-accountを送信できた場合、認証トークンを送信できないため、リクエストは無視されます。

上記を念頭に置いて、CookieまたはHTML5ストレージのどちらを使用するかは、一連のトレードオフになります。

認証トークンをHTML5ストレージに保存すると、次のことを意味します。

  • (-) XSS攻撃で盗まれるリスク。
  • (+) CSRF保護を提供します。
  • (-)サーバーに送信される各リクエストを手動で変更し、SPA(AngularJs)Webアプリケーションに制限する必要があります。

一方、httpOnlyandsecureとマークされたCookieに認証トークンを保存する場合、次のようになります。

  • (+) authnトークンはXSSによって盗まれません。
  • (-)自分でCSRF保護を提供する必要があります。一部のフレームワークでは、CSRF保護の実装が他のフレームワークよりも簡単です。

どちらのオプションが良いかは、ニーズによって異なります。

  • あなたの認証トークンはお金に関係する何かを保護していますか?おそらくCookie httpOnlysecureオプションが必要でしょう。
  • CSRF保護を実装するために必要な労力のレベルは、保護している資産に値しませんか?その場合、HTML5ストレージが適切な場所になる可能性があります。
95
kuporific

トークンベースの認証を使用する場合、トークンをリクエストに手動で関連付ける必要があります。 Cookieとは異なり、トークンはブラウザによって自動的に設定されないため、csrf攻撃の影響を受けません。

このアプローチはcsrf攻撃から安全ですが、xss攻撃を受けやすくなります。

最小限の労力での改善は、session storage の代わりに local storage以来session storageユーザーがタブ/ブラウザを閉じた後、データは削除されます。

1