1. ホーム
  2. authentication

[解決済み] ステートレス(=セッションレス)認証の場合、CSRFトークンは必要ですか?

2022-06-02 01:51:23

質問

アプリケーションがステートレス認証 (HMAC のようなものを使用) に依存している場合、CSRF 保護を使用する必要がありますか?

例を挙げます。

  • シングルページのアプリを用意しました(そうでない場合は、各リンクにトークンを付加する必要があります。 <a href="...?token=xyz">...</a> .

  • ユーザが自分自身を認証するために POST /auth . 認証に成功すると、サーバは何らかのトークンを返します。

  • トークンはJavaScriptで単一ページアプリ内の変数に格納されます。

  • このトークンは、以下のような制限されたURLにアクセスするために使用されます。 /admin .

  • トークンは常にHTTPヘッダ内で送信されます。

  • Httpセッションも、Cookieもありません。

私が理解する限り、ブラウザがトークンを保存しないため、サーバーに自動的に送信することができないので、クロス サイト攻撃を使用する可能性はないはずです (これは Cookie やセッションを使用した場合に起こることです)。

何か見逃しているのでしょうか?

どのように解決するのですか?

CSRF + を使って、いくつかの情報を見つけました。 いいえ のクッキーを認証に使うという情報を見つけました。

  1. https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/

    クッキーに依存していないため、クロスサイトリクエストから保護する必要はありません。

  2. http://angular-tips.com/blog/2014/05/json-web-tokens-introduction/

    "私たちがクッキーの道を行くなら、クロスサイトリクエストを避けるためにCSRFを本当に行う必要があります。これは、JWTを使用するときに忘れることができるものです。

    (JWT = Json Web Token、ステートレス アプリケーションのためのトークン ベースの認証)

  3. http://www.jamesward.com/2013/05/13/securing-single-page-apps-and-rest-services

    CSRF脆弱性のリスクを負わずに認証を行う最も簡単な方法は、ユーザーを識別するためにクッキーを使用しないことです"。

  4. http://sitr.us/2011/08/26/cookies-are-bad-for-you.html

    CSRFの最大の問題は、Cookieがこの種の攻撃に対する防御を全く提供しないことです。Cookie認証を使用する場合は、CSRFから保護するための追加の対策も採用する必要があります。最も基本的な予防策は、アプリケーションが GET リクエストに応答していかなる副作用も実行しないことを確認することです。

認証にCookieを使用しないのであれば、CSRF保護は必要ないと述べているページが他にもたくさんあります。もちろん、他のすべてのことにクッキーを使用することは可能ですが を避けることができます。 のようなものを保存することは避けてください。 session_id のようなものは入れないようにしましょう。


ユーザーを記憶する必要がある場合、2つのオプションがあります。

  1. localStorage : ブラウザ内のKey-Valueストアです。保存されたデータは、ユーザーがブラウザのウィンドウを閉じた後でも利用可能です。すべてのサイトが独自のストレージを取得するため、他のウェブサイトからデータにアクセスすることはできません。

  2. sessionStorage : 同じくブラウザ内のデータストアです。違いは ユーザーがブラウザのウィンドウを閉じたときにデータが削除されることです。しかし、あなたのウェブアプリケーションが複数のページで構成されている場合、それはまだ便利です。そのため、以下のようなことが可能です。

  • ユーザーがログインした後、トークンを sessionStorage
  • ユーザーがリンクをクリックすると、新しいページが読み込まれます (= a リンクで、javascript の content-replace はありません)
  • トークンへのアクセスは sessionStorage
  • ログアウトするには、トークンを手動で sessionStorage から削除するか、ユーザーがブラウザのウィンドウを閉じるのを待って、保存されているデータをすべてクリアします。

(両方については、ここをご覧ください。 http://www.w3schools.com/html/html5_webstorage.asp )


トークンオーサーの公式な標準はありますか?

JWT (Json Web Token)です。まだドラフトだと思いますが、すでに多くの人が使っていて、コンセプトもシンプルで安全そうです。(IETFの https://datatracker.ietf.org/doc/html/draft-ietf-oauth-json-web-token-25 )

また、多くのフレームワークに対応したライブラリがあります。ググってみてください。