セッション
セッションとは、ステートレスな HTTP 通信において通信状態を表す情報を保持するための仕組み。
- CookieStore:ブラウザ内にクッキーとして保持する
- ActiveRecord::SessionStore:データベースに保存する
- CacheStore:サーバーもしくはインメモリに保存する (CacheStore の設定に依存)
- Redis stores:Redis サーバーで保持する (基本的にインメモリ/設定次第で定期的にスナップショットを保存できる)
- DalliStore:memcached サーバーに保存する
参考:
Rails のセッション管理方法について | odaillyjp blog
rails のクッキーとセッションについてまとめ | おもしろ web サービス開発日記
暗号化済みセッションストレージ | Rails ガイド [公式]
セッションデータ使用のガイドライン
- セッションに巨大なオブジェクトを保存しない (クッキーにはセッション ID のみを格納する)
- セッションに重要なデータを保存しない (クッキーはいつでも消去される可能性がある/ブラウザを閉じることで消去される可能性がある)
参考:
セッションの取り扱いに関するガイドライン | Rails ガイド [公式]
導入
参考:
Rails のセッション管理方法について | odaillyjp blog
Rails でセッションを試してみる | yk5656 diary
session
参考:
Rails で session を空にしたり削除したり | 破いて捨てたノート
session – rails/metal.rb at v5.2.2 · rails/rails – GitHub
session – rails/controller_helper.rb at v5.2.2 · rails/rails – GitHub
session= – rails/request.rb at v5.2.2 · rails/rails – GitHub
set – rails/session.rb at v5.2.2 · rails/rails – GitHub
session – rack/request.rb at 2.0.6 · rack/rack – GitHub
config.session_store
参考:
session_store – Rails::Application::Configuration | Ruby on Rails API [Official]
CookieStore
参考:
ActionDispatch::Session::CookieStore | Ruby on Rails API [Official]
rails/cookie_store.rb at v5.2.2 · rails/rails – GitHub
session_options[:key]
参考:
Accessing the “session key” cookie name from anywhere in Rails – Stack Overflow
session_options[:id]
参考:
セッションの ID (session.session_id) を得る方法 | GENDOSU@NET
クッキーにおけるセッションデータのマーシャルと復元
参考:
Rails で (Rack の) セッション情報を Cookie に保存する仕組み – Qiita
クッキーストアの問題点
セッションの保存先がサーバーサイドではないので、任意のタイミングでセッションを消去できない。
参考:
Session に CookieStore 使った時の問題点 | OAuth.jp
クッキーストアセッションの使い方
参考:
Rails の cookie_store のセッション有効期限を変更する | blog.tnantoka.com
rails のクッキーとセッションについてまとめ | おもしろ web サービス開発日記
session – リファレンス – – Railsドキュメント
cookies_serializer
参考:
rails 4.1.0 にあげたら JSON::ParserError になった問題 | CubicLouve
Cookies シリアライザ | Rails ガイド [公式]
expire_after
Rails.application.config.session_store \ :cookie_store, expire_after: 14.days
参考:
ActionDispatch::Session::CookieStore | Ruby on Rails API [Official]
ActionDispatch::Session::CacheStore | Ruby on Rails API [Official]
ActionDispatch::Session::MemCacheStore | Ruby on Rails API [Official]
rails/cookie_store.rb at master · rails/rails – GitHub
rack/cookie.rb at 2.0.6 · rack/rack – GitHub
rack/memcache.rb at 2.0.6 · rack/rack – GitHub
How to I dynamically set the expiry time for a cookie-based session in Rails – Stack Overflow
activerecord-session_store
参考:
rails/activerecord-session_store: Active Record’s Session Store extracted from Rails – GitHub
Session を ActiveRecord で管理する | プログラマ憧れプログラマ日記
Rails4 で session store を ActiveRecord に変更 | EasyRamble
session にいろいろぶち込みすぎてエラーになる場合の対応 – Qiita
Rails で session 管理に active_record を使う方法と型の注意点 (特にフォームが多い時とかに) – Qiita
セッションの ActiveRecordStore に追加情報を入れる | CLARA ONLINE techblog
CacheStore
参考:
Rails キャッシュとセッションを別々の memcached で管理 | yuhei.kagaya
ChacheStore でセッション情報が保存されない | Ruby on Rails 5 アプリケーションプログラミング読解物語
Configuration Cache and Rails Session Store with Redis | Kirill Shevchenko
ActionDispatch::Session::CacheStore | Ruby on Rails API [Official]
rails/cache_store.rb at v5.2.2 · rails/rails – GitHub
Redis stores
参考:
redis-store/redis-activesupport: Redis stores for ActiveSupport – GitHub
redis-store/redis-rails: Redis stores for Ruby on Rails – GitHub
Built-in Redis cache store by jeremy · Pull Request #31134 · rails/rails – GitHub
rails で session を redis に保存する – Qiita
Rails のセッションを Redis に保存する | yosuke.saito
Rails のセッションを Redis で管理 | 酒と涙とRubyとRailsと
Dalli
参考:
petergoldstein/dalli: High performance memcached client for Ruby – GitHub
memcached を利用した session管理 – Qiita
Rails のセッション管理方法について | odaillyjp blog
比較
参考:
Memcached vs. Redis? – Stack Overflow
仕組み
参考:
Rails の session 周りコードリーディング | freedom-man
ActionDispatch::Request::Session
参考:
rails/session.rb at v5.2.2 · rails/rails – GitHub
ActionDispatch::Session::CookieStore
参考:
rails/cookie_store.rb at v5.2.2 · rails/rails – GitHub
ActionDispatch::Session::CacheStore
参考:
rails/cache_store.rb at v5.2.2 · rails/rails – GitHub
ActionDispatch::Cookies::CookieOverflow
クッキーに格納可能なデータサイズ (4kb) を超えた場合に発生するエラー。
MAX_COOKIE_SIZE = 4096
参考:
CookieOverflow エラーを解決する | Hello world, I am kgmx.
Rails を本番稼働させるときは nginx と session store の設定に注意 – Qiita
ActionDispatch::Cookies::CookieOverflow | 株式会社田村倉庫
ActionDispatch::Cookies::CookieOverflow エラー | よしそぶろぐ
CookieOverflow in Rails 4 | Coderwall
CookieOverflow – rails/cookies.rb at v5.2.2 · rails/rails – GitHub
Cookie overflow in rails application? – Stack Overflow
how to save a big array in session? (ActionDispatch::Cookies::CookieOverflow) – Stack Overflow
CookieStore における再生攻撃
ユーザーに付与した残高などをクッキーに保存していると、ブラウザからクッキーを抜き出しておいて後で復元することにより不正行為が発生しうる。クッキーに保存する情報を暗号化していても、過去の状態には暗号化したまま復元可能であるので防止策にならない。クライアント側で勝手に改変されては困るような重要な情報はクッキーに保存するべきではない。
参考:
CookieStore セッションに対する再生攻撃 | Rails ガイド [公式]
セッション固定攻撃の対策
セッション固定攻撃を防ぐためには、ユーザーがログインに成功した直後に古いセッションを破棄して新しいセッション ID を発行する。
reset_session
参考:
セッション固定攻撃 対応策 | Rails ガイド [公式]
セッションの有効期限
sweep
メソッドの定義例:
class Session < ApplicationRecord def self.sweep(time = 1.hour) if time.is_a?(String) time = time.split.inject { |count, unit| count.to_i.send(unit) } end delete_all "updated_at < '#{time.ago.to_s(:db)}'" end end
Session.sweep("20 minutes")
を呼び出すと、20分以上経過したセッションが期限切れになる。
参考:
クロスサイトリクエストフォージェリ (CSRF)
参考: