web-dev-qa-db-ja.com

Rails 4のnull_sessionとreset_sessionの違いは何ですか?

現在、Railsアプリケーションを他の数人の開発者とともに使用しています。また、Angularを介してAJAXを介してサーバーにPOSTが作成されています。メールログにいくつかのInvalidAuthenticityToken例外が発生していることに気付きました。

このリクエストはAngularを通じて送られてくるので、サーバーをAPIとして扱い、protect_from_forgery with: :null_sessionを使用する必要があると考えています。ただし、protect_from_forgery with: :reset_sessionは同じ解像度を提供するようです。

推奨されているという理由だけでコードをやみくもにプラグインしたくないので、これら2つの偽造防止アプローチの違いを知りたいと思います。いつ他のものよりも一方を使用し、なぜその使用を好むのですか?

34
Makoto

コードの私の解釈に基づいて、それは次のようです:

  • null_sessionは、セッションオブジェクトを使用しないAPIスタイルのコントローラーで使用する必要があります。これは、Angularアプリに適切なソリューションのようです。ユーザーの既存のセッション(つまり、他の従来のコントローラーによって設定されたもの)はそのまま残ります。指定しない場合のデフォルトの動作です。 protect_from_forgeryへのwithオプション。
  • reset_sessionは従来のコントローラー用です。 CSRFチェックが失敗すると、Railsにユーザーのセッションを吹き飛ばし、リクエストの処理を続行するように伝えます。これは、次の場合にユーザーをアプリからログアウトさせる「妄想モード」のように聞こえます。リクエストに改ざんの証拠があります。

Railsアプリがセッションをまったく使用しない場合、これらは交換可能です。

ただし、アプリの一部でセッションを使用し、他の部分では使用しない場合(つまり、従来のコントローラーとAPIコントローラーの混合)、null_sessionを使用する必要があります。それ以外の場合、reset_sessionを使用すると、ブラウザーによって行われたAPI要求により、ユーザーはブラウザーセッションからログアウトされます。

50
Matt Brictson