酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

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を実行。

1
2
# Gemfile
gem "redis-rails"

設定の修正

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

1
2
3
4
5
6
# 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 }

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

1
2
3
4
5
# 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']

Special Thanks

おすすめの書籍