Rails 3では、セッションストアをCookieStoreのデフォルトに設定して、データをCookieに保存することとセッションにデータを保存することの違いは何ですか?
例えば.
cookie[:foo] = 'bar'
# MyApp::Application.config.session_store :cookie_store, key: '_myapp_session'
session[:foo] = 'bar'
私が知る限り、両方ともクライアント側のCookieに保存されます。
どちらを使用するかはいつ選択しますか?
ありがとう。
主な違いは、cookie[:foo] = 'bar'
を使用すると、ユーザーはCookieの値、つまり'bar'
を表示できることです。 session[:foo] = 'bar'
を使用すると、値はRailsによって暗号化され、_myapp_session
Cookieに保存されます。
格納する情報がセッションにバインドされていない場合は、cookie[]
形式を使用します。ユーザーが優先言語を選択したとき。
現在のセッションに関連する情報を保存する場合は、session[]
形式を使用します。ユーザーのid
。
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文字より短いものを使用しないでください。