70

Rails 3 では、データを Cookie に保存することと、セッション ストアがデフォルトの CookieStore に設定されているセッションにデータを保存することの違いは何ですか?

例えば

cookie[:foo] = 'bar'

# MyApp::Application.config.session_store :cookie_store, key: '_myapp_session'
session[:foo] = 'bar'

私が知る限り、どちらも最終的にクライアント側の Cookie に保存されます。

どちらを使用するかを選択するのはいつですか?

ありがとう。

4

2 に答える 2

125

Rails 3の主な違いは、使用cookie[:foo] = 'bar'するとユーザーがCookieの値を確認できること'bar'です。使用するsession[:foo] = 'bar'と、値はレールによって暗号化され、_myapp_sessionCookieに保存されます。

cookie[]保存する情報がセッションにバインドされていない場合、たとえばユーザーが優先言語を選択する場合などに、この形式を使用します。

session[]ユーザーの情報など、現在のセッションに関連する情報を保存する場合は、この形式を使用しidます。

Rails 4から、Cookieはデフォルトで暗号化されました。

于 2013-03-01T09:01:16.577 に答える
14

Rails には、セッション ハッシュ用のストレージ メカニズムがいくつか用意されています。最も重要なのはActiveRecord::SessionStoreActionDispatch::Session::CookieStoreです。

Rails がセッション ハッシュとセッション ID を保存する場所など、多数のセッション ストレージがあります。ほとんどの実際のアプリケーションActiveRecord::SessionStoreは、パフォーマンスとメンテナンスの理由から、ファイル ストレージよりも (またはその派生の 1 つ) を選択します。ActiveRecord::SessionStoreセッション ID とハッシュをデータベース テーブルに保持し、リクエストごとにハッシュを保存して取得します。

Rails 2 では、新しいデフォルトのセッション ストレージCookieStore. CookieStoreセッション ハッシュをクライアント側の Cookie に直接保存します。サーバーは Cookie からセッション ハッシュを取得し、セッション ID を不要にします。これにより、アプリケーションの速度が大幅に向上しますが、物議を醸すストレージ オプションであり、セキュリティへの影響について考える必要があります。

Cookie は、4kB の厳密なサイズ制限を意味します。前に説明したように、とにかくセッションに大量のデータを保存するべきではないので、これは問題ありません。現在のユーザーのデータベース ID をセッションに保存することは、通常は問題ありません。クライアントは、セッションに保存されたすべてのものを見ることができます。これは、クリア テキスト (実際には Base64 でエンコードされているため、暗号化されていない) で保存されるためです。したがって、もちろん、ここにシークレットを保存する必要はありません。セッション ハッシュの改ざんを防ぐために、サーバー側のシークレットを使用してセッションからダイジェストが計算され、Cookie の末尾に挿入されます。つまり、このストレージのセキュリティは、このシークレット (および、まだ侵害されていない SHA512 にデフォルト設定されるダイジェスト アルゴリズム) に依存することを意味します。したがって、些細な秘密、つまり辞書の単語、または 30 文字未満の単語は使用しないでください。

于 2013-02-25T12:39:19.247 に答える