Closed8

RailsでRedisをつかってセッション管理をする際に気になったこと

N04hN04h

いままで redis-rails を使っていたが、リポジトリのREADMEに以下記述があった

If you need session storage, consider directly using redis-actionpack instead.

セッションで使うならredis-actionpackを使うことを検討してねと翻訳されました。
こっちのリポジトリのREADMEをみてもまあ、セッションストアに使えるよーとまでしか書かれていない。

なぜこの一文があるんだろ?

N04hN04h

あ、キャッシュストアはRailsですぐ使えるやつ(ActiveSupport::Cache::RedisCacheStore)ができたから、セッション管理だけで使うケースしかないでしょ?ってことか

A quick note about Rails 5.2

Rails 5.2.0 includes a Redis cache store out of the box, so you don't really need this gem anymore if you just need to store the fragment cache in Redis. Maintenance on the redis-activesupport gem will continue for security and compatibility issues, but we are no longer accepting new features. We are still actively maintaining all other gems in the redis-store family, such as redis-actionpack for session management, and redis-rack-cache for HTTP cache storage.

N04hN04h

この記事がわかりやすかった
https://tech.basicinc.jp/articles/203

つまりキャッシュ・セッションでRedisを扱う場合のライブラリ選定として、
どっちもredis-railsを使って実現するならそれを使えばいいけど、エラーにするかどうかという基準も検討材料にする必要がある

  • キャッシュストアではRailsが用意している機能を使う場合はエラーにはならない
    • キャッシュとしては効率などで使われることがほとんどの目的なので、エラーにならないでよさそう
    • 検知できる仕組みは用意されているべきかも
  • セッションストアではredis-rails, redis-actionpackを使う場合はエラーになる
    • redis-session-storeの場合はエラーにならないとのこと
N04hN04h

ミドルウェアは適用されている

$ bin/rails middleware

use ActionDispatch::HostAuthorization
use Rack::Sendfile
use ActionDispatch::Static
use ActionDispatch::Executor
use ActionDispatch::ServerTiming
use ActiveSupport::Cache::Strategy::LocalCache::Middleware
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use ActionDispatch::RemoteIp
use Sprockets::Rails::QuietAssets
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use ActionDispatch::DebugExceptions
use ActionDispatch::ActionableExceptions
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use ActiveRecord::Migration::CheckPending
use ActionDispatch::Cookies
use ActionDispatch::Session::RedisStore
use ActionDispatch::Flash
use ActionDispatch::ContentSecurityPolicy::Middleware
use ActionDispatch::PermissionsPolicy::Middleware
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
use Rack::TempfileReaper
run RailsTemplate::Application.routes
N04hN04h

接続も問題なくRails consoleからできるけどなー...

irb(main):017:0> redis = Redis.new(host: "redis", db: 0)
=> #<Redis client v4.8.0 for redis://redis:6379/0>
irb(main):018:0> redis.keys
=> []
irb(main):019:0> redis.set("test", "hoge")
=> "OK"
irb(main):020:0> redis.keys
=> ["test"]
irb(main):021:0> redis.get("test")
=> "hoge"
irb(main):022:0> redis.del("test")
=> 1
irb(main):023:0> redis.keys
=> []
N04hN04h

secureの設定ミスだった

secure = ENV['REDIS_SECURE'] || false

としてsecureを設定していたが、
環境変数に

REDIS_SECURE=false

と設定しているが、文字列として判定されtrufyとなったのだろう...

このスクラップは2022/12/13にクローズされました