web-dev-qa-db-ja.com

CookieとCookieStoreを使用したセッション

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

例えば.

cookie[:foo] = 'bar'

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

私が知る限り、両方ともクライアント側のCookieに保存されます。

どちらを使用するかはいつ選択しますか?

ありがとう。

63
gjb

主な違いは、cookie[:foo] = 'bar'を使用すると、ユーザーはCookieの値、つまり'bar'を表示できることです。 session[:foo] = 'bar'を使用すると、値はRailsによって暗号化され、_myapp_session Cookieに保存されます。

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

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

110
Wolfgang

Railsは、セッションハッシュ用のいくつかのストレージメカニズムを提供します。最も重要なのはActiveRecord::SessionStoreおよびActionDispatch::Session::CookieStore

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

Rails 2では、新しいデフォルトのセッションストレージCookieStoreが導入されました。 CookieStoreは、クライアント側のCookieにセッションハッシュを直接保存します。サーバーは、Cookieからセッションハッシュを取得し、セッションIDの必要性を排除します。これにより、アプリケーションの速度が大幅に向上しますが、これは議論の余地のあるストレージオプションであり、そのセキュリティへの影響を考慮する必要があります。

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

11
danilodeveloper