セッション

セッションとは、ステートレスな HTTP 通信において通信状態を表す情報を保持するための仕組み。

  • CookieStore:ブラウザ内にクッキーとして保持する
  • ActiveRecord::SessionStore:データベースに保存する
  • CacheStore:サーバーもしくはインメモリに保存する (CacheStore の設定に依存)
  • Redis stores:Redis サーバーで保持する (基本的にインメモリ/設定次第で定期的にスナップショットを保存できる)
  • DalliStore:memcached サーバーに保存する

参考:

Rails のセッション管理には何が最適か – Qiita

Rails のセッション管理方法について | odaillyjp blog

セッション管理の要注意点 – Qiita

rails のクッキーとセッションについてまとめ | おもしろ web サービス開発日記

セッション | Rails ガイド [公式]

暗号化済みセッションストレージ | 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

redis-store/redis-store: Namespaced Rack::Session, Rack::Cache, I18n and cache Redis stores for Ruby web frameworks – 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 ガイド [公式]

セッション固定攻撃 | 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分以上経過したセッションが期限切れになる。

参考:

セッションの期限切れ | Rails ガイド [公式]

クロスサイトリクエストフォージェリ (CSRF)

参考:

クロスサイトリクエストフォージェリ対策 (CSRF) | Site-Builder.wiki

タグ:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です