Railsセッションの現在の慣行


83

Railsとセッションに関する「ベストプラクティス」のヒントはありますか?Rails 3のデフォルトのセッションタイプはまだCookieStoreですよね?私はしばらくSqlSessionStoreを使用し、それはうまく機能しましたが、CookieStoreを支持してそれから離れることができます。

塩漬けの情報であっても、機密情報にCookieStoreを使用することはまだ良い考えではありませんか、それともDBに保存する方がよいでしょうか。


1
また、セッションストレージにMemcachedを使用することについての現在の考えは何ですか?
Lukas 2010

回答:


102

機密性の高い情報を保存するために使用すべきではないCookieベースのデフォルトの代わりに、セッションにデータベースを使用します

でセッションテーブルを作成します

rake db:sessions:create

移行を実行する

rake db:migrate

また、セッションの管理にもActiveRecordを使用するようにrailsに指示するようにしてください。

Rails 3

config / initializers / session_store.rb:

Rails.application.config.session_store :active_record_store

Rails 2

config / environment.rb:

config.action_controller.session_store = :active_record_store

2
最後に、セッションのARstoreが非常に遅いと聞きました。ベンチマークを知っている人はいますか?
Lukas 2010

4
セッションテーブルの増加を監視し、それに応じてプルーニングするジョブを設定すると、パフォーマンスの問題は発生しません。
ビルリーパー2012年

3
これはデバイスと競合しますか?
David Mauricio 2012年

4
ここでは、Rails 3.2で、TheNameOfMyApplication :: Application.config.session_store:active_record_store
Eduardo

3
これrake db:sessions:createは、Rails 4で非推奨になり、削除されました。これは、ユーザー数が多い(データベースの読み取りと書き込みが多すぎる)アプリケーションでは適切に拡張できないためです。rails 4.0、rake db:sessions:createを参照してください。

53

Rails4ではデフォルトでCookieが暗号化されています

Rails 4では、CookieStore Cookieはデフォルトで暗号化され、署名されています。

secret_token設定しただけの場合、Cookieは署名されますが、暗号化されません。つまり、ユーザーはuser_idアプリの秘密鍵を知らずにユーザーを変更することはできませんが、簡単に読み取ることができます。user_id。これはRails3アプリのデフォルトでした。

secret_key_base設定している場合、Cookieは暗号化されます。これは、暗号化されたCookieをユーザーが変更したり読み取ったりすることができないという点で、署名されたCookieよりも一歩進んだものです。これは、Rails4以降のデフォルトです。

あなたが両方を持っている場合 secret_tokensecret_key_baseのセットを、あなたのクッキーは暗号化され、3レールによって生成された署名付きクッキーは透過的に読み、スムーズなアップグレードパスを提供するために、暗号化されます。

Active Record SessionStoreはRails4で非推奨になりました

この回答は、Rails 4に関しては古くなっています。アクティブレコードセッションストアは非推奨になり、Railsから削除されたため、次のジェネレーターは機能しなくなります。

  • rake db:sessions:create

  • rails generate session_migration

これはこの回答で指摘されました。Active Record Session Storeが非推奨になった理由は、このブログ投稿で述べられているように、アプリケーションにアクセスするユーザーが多数いる場合、データベースへの読み取り/書き込みが適切にスケーリングされないためです。

... Active Recordセッションストアの大きな問題の1つは、スケーラブルではないことです。それはあなたのデータベースに不必要な負荷をかけます。アプリケーションが大量のトラフィックを受信すると、セッションデータベーステーブルは継続的に読み取り/書き込み操作で攻撃されます。

Rails 4の時点で、Active Recordセッションストアはコアフレームワークから削除され、非推奨になりました。

それでもActiveRecord Session Storeを使用したい場合は、gemとして引き続き利用できます

現在のRailsセッションのベストプラクティス

Ruby on Railsセッションの最新のベストプラクティスについては、Ruby onRailsセキュリティガイドの最新バージョンを確認することをお勧めします。


9

どのプラットフォームの誰もがCookieベースのセッションを処理する方法に変更はないと思います。サーバーの制御を超えて通過するもの(Cookie、フォーム投稿など)には懐疑的です。これがWeb開発の一般原則です。

暗号化に関しては、その面で何かが変わったかどうかはわかりません。

Cookieストアで注意すべき点は、データ量の制限と、このデータがすべてのリクエストでネットワーク上で送信されるという落とし穴です。データベースストアはIDのみを転送し、データはサーバー上に存在します。 。


4

FWIW、レール3.1はランニングを提案します

rails generate session_migration

ただし、これにより、とまったく同じ移行が生成されます。

rake db:sessions:create

同じように、rakeタスクdb:sessions:createsession_migrationジェネレーターを直接呼び出すようになりました。task:create =>:environmentは、ActiveRecord :: Base.connection.supports_migrationsを除いて、「このデータベースではタスクを利用できません(移行サポートなし)」を発生させますか?'rails / generators'が必要ですRails :: Generators.configure!require'rails / generators / rails / session_migration / session_migration_generator 'Rails :: Generators :: SessionMigrationGenerator.start [ENV ["MIGRATION"] || "add_sessions_table"]終了
傾斜

rake db:sessions:createそしてrails generate session_migration、彼らは多くのユーザー(あまりにも多くのデータベースは読み取りおよび書き込み)を使用したアプリケーションのためにうまく拡張しないため、発電機は、レール4で非推奨となり、削除されます。rails 4.0、rake db:sessions:createを参照してください。

2

Railsのデフォルトは私にはかなり良いようです-CookieStoreは高速であり、ユースケースの大部分をカバーするはずです。確かに4kbに制限されており、データはユーザーに表示されますが、Railsの方法は、整数IDや基本的な文字列値などのセッションのみを使用することです-オブジェクトや機密性の高い情報をセッションに保存しようとしている場合あなたはおそらくそれを間違っているのでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.