こんにちは寝る

古い記事の情報は参考程度にお願いします

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設定になるみたいです)

Redis セキュリティ – Redis 日本語訳

役に立つかわからない情報

Docker環境でsigned: trueの時にアクセスの度にredisサーバーに新しいセッションが作られるという現象に遭遇した。

ここを参考にしてください、依存ライブラリが新しいと発生するらしい。

https://github.com/redis-store/redis-actionpack/issues/33

ただ、これにするとcookieの暗号化…正確にはセッションIDの暗号化…が無くなるようです、暗号化が影響して不具合が発生しているようです。