Rails6でRedisを利用する
概要
railsのセッション情報の保存先はcookieなのですが
このままだと4kbまでしか保存できなかったりセッションリプレイのセキュリティリスクがあります。
rails的にはセッションに重要な情報を置くなというスタンスらしいですが(ソース見つからず)
とはいえ、制限があったりセキュリティリスクがあるというところでredisなどのストレージに保存したい要求もあります。
(この仕様は根が深そうだ)
ライブラリを入れる
redis-rails
が昔は使われていたようですが
rails5.2以降からはフラグメントキャッシュの仕様が追加されたとかで利用されなくなっています。
セッションストレージを利用したい場合はredis-actionpack
を利用するようですのでこちらをgemに追加してください。
gem 'redis-actionpack'
redis-actionpackの設定をする
以下の内容をconfig/initializers/session_store.rb
に設定。
それぞれのオプションはredis-actionpackを参照してください。
# {Rails.application.class.parent_name.downcase}は変えたほうがいいかも、rails6.1でparent_nameが削除されるみたい MyApplication::Application.config.session_store :redis_store, servers: ["redis://localhost:6379/0/session"], expire_after: 90.minutes, key: "_#{Rails.application.class.parent_name.downcase}_session", threadsafe: true, signed: true, secure: true
※ railsの設定次第では設定するファイルが違うかもしれません。
余談
redisは今回始めて設定したのですが、redisのセキュリティは基本的にパスワードは設定せず
信頼されたクライアントが接続することを前提に設計されているみたいですね。
ただ、設定をうまくできず不正アクセスが多いとのことでパスワードをつけないで起動した場合は「protected mode」で自動的に起動するようです。
(ちなみにDocker環境で利用しているredis:alpineではデフォルトでOFF設定になるみたいです)
役に立つかわからない情報
Docker環境でsigned: true
の時にアクセスの度にredisサーバーに新しいセッションが作られるという現象に遭遇した。
ここを参考にしてください、依存ライブラリが新しいと発生するらしい。
https://github.com/redis-store/redis-actionpack/issues/33
ただ、これにするとcookieの暗号化…正確にはセッションIDの暗号化…が無くなるようです、暗号化が影響して不具合が発生しているようです。