Redis-rails RailsのセッションをRedisで管理


サーバサイドでのセッション管理はセキュリティを向上させたり、通信で無用なCookieを送らない等の意味でメリットがあります。
今回は『redis-store/redis-rails - GitHub』を使う手順のメモです!


🍮 サーバサイド/クライアントでのセッション管理のPros/Cons

セッションに関する説明は次のサイトがお勧めです。注意点としては次の2点と考えられます。

- セッションの基礎
  - Webアプリでは、接続ごとに固有の識別子(セッションID)を割り当て、一時的なidを割り振る
  - セッションは他のCookieと合わせて通信のたびにやり取りされる
  - Cookieのサイズは4 KBと厳密に定められている

- セッションにおけるセキュリティのリスク
  - 他人のセッションを取得すると他人に一時的になりすましてログインができてしまう
  - セッション/Cookieにデータを保持するとクライアント側でデータを復元できてしまう

- サーバサイドでセッションを管理するメリット
  - 通信時にやりとりされるCookieの通信量を減らす

- Rails固有の話
  - Railsではセッションidは、32バイトのMD5ハッシュ値である

- セキュリティ強度を上げるための対策
  - Cookieのsecure属性とSSL => HTTPSでの通信でのみ使い、暗号化
  - Cookieのhttponly属性 => JavaScriptから読み書きさせない

😼 開発環境の準備

Mac等でのRedisの導入については、拙著
CentOS/Mac OSXへのRedis導入手順 - memcacheライクなKey-Value方式と、永続化対応のインメモリDB
がお勧めです。

🐡 Gemインストール

Gemfileに以下を追加して、bundle installを実行。

# Gemfile
gem "redis-rails"

🎃 設定の修正

まずはキャッシュの保存先をRedisに設定。

# config/application.rb
# /cache はアプリ名や、Rails.env等の環境情報をいれてもいいかも
config.cache_store = :redis_store, "redis://localhost:6379/0/cache", { expires_in: 90.minutes }
# ちなみに環境変数に入れてしまうのもおすすめです
# config.cache_store = :redis_store, ENV['REDIS_URL'], { expires_in: 90.minutes }

続いてバックエンドのセッションの保存先を設定。

# config/initializers/session_store.rb
MyApplication::Application.config.session_store :redis_store, servers: "redis://localhost:6379/0/cache"
# 環境変数で設定する場合
#MyApplication::Application.config.session_store :redis_store, servers: ENV['REDIS_URL']

🗻 参考リンク

📚 おすすめの書籍