概要
Rails環境でのCookie
, Session
利用についてまとめました。
Cookie
, Session
そのものは知っているけど、
Rails
での利用方法がわからない方向けに執筆しています。
Session, Cookie について
セッション...? クッキー...? という方は以下の記事をご一読ください。
Session
Sessionデータの保存先について
Railsでは、Session
データの保存場所として、以下を指定することができます。
データの保存先として、Cookie
やDB
を利用できることを認識しておきましょう!
ストアタイプ | 説明 |
---|---|
cookie_store |
クッキーにセッションデータを保存。 デフォルトではセッションクッキー(ブラウザ終了時に削除)として設定。 key を省略した場合、cookie 名は_session_id となる |
cache_store |
Rails のキャッシュストア(例: Memcached 、Redis )を利用してセッションデータを保存。 |
active_record_store |
データベースのテーブル(デフォルトは sessions テーブル)にセッションデータを保存。 |
mem_cache_store |
Memcached を使用してセッションデータを保存。 |
保存先の設定はconfig/application.rb
で行います。
-
config.session_store
で保存先を指定 -
Session
を利用するためのミドルウェアを有効化
# config/application.rb
module SampleApp
class Application < Rails::Application
# ...
# ここから
config.session_store :cookie_store
config.middleware.use ActionDispatch::Cookies
config.middleware.use config.session_store, config.session_options
# ここまで
end
end
Session
データを取り扱う前に上記設定が必要になるため、忘れずに対応しましょう!
Sessionのアクセス
# Write
session[:test_session] = "test_session"
# Read
session[:test_session]
これだけです。
簡単ですね...!
Cookie
続いてはCookie
を見ていきましょう。
Cookieのアクセス
# Write
cookies[:test_cookie] = "test_cookie"
# Read
cookies[:test_cookie]
こちらも簡単ですね。
cookie
にはよく利用するオプションがいくつかありますので、以下で詳しく解説します。
Cookie
のオプション
Cookieにはさまざまなオプションを指定できます。
以下オプションは、中でも利用機会が多いので、必ず覚えておきましょう。
http_only
secure
expires
設定例
cookies[:test_cookie] = { value: "test_cookie", httponly: true, secure: true }
オプション名 | 概要 |
---|---|
http_only |
CookieをHTTPプロトコル経由でのみアクセス可能にする。 JavaScriptからのアクセスを防ぎ、XSS攻撃から保護。 |
secure |
HTTPS接続時のみCookieを送信する。 Cookieが暗号化されていない接続で送信されるのを防ぐ。 |
permanent |
Cookieの有効期限を永久(約20年後)に設定する。 Cookieを長期間保持させたい場合に使用します。 |
signed |
Cookieの値を署名付きで保存。 Cookieがクライアント側で改ざんされていないことを検証できる。 署名/検証に利用するキーは credentials で管理される。 |
expires |
Cookieの有効期限を具体的な日時で設定する |
max_age |
Cookieの有効期間を秒数で設定する |
domain |
Cookieが有効となるドメインを指定する。 サブドメインとCookieを共有したい場合に使用する。 |
path |
Cookieが有効となるパスを指定する。 特定のパスでのみCookieを送信したい場合に設定します。 |
samesite |
CookieのSameSite属性を設定する:lax 、:strict 、:none のいずれかを指定し、クロスサイトリクエストに対するCookieの送信ポリシーを制御する。 |
encrypted |
Cookieの値を暗号化して保存する。 Cookieの内容が第三者に読み取られることを防ぐ。 |
serializer |
Cookieのデータシリアライザを指定する。:json や:marshal を指定して、Cookieのデータ形式を制御する。 |
ハンズオン
それでは実際にSession
(cookie_store
)を利用してみましょう。
準備
まずは、config/application.rb
でセッションストアの設定を行います。
# config/application.rb
module SampleApp
class Application < Rails::Application
# ...
# 追加
config.session_store :cookie_store, key: "test_app"
config.middleware.use ActionDispatch::Cookies
config.middleware.use config.session_store, config.session_options
end
end
次に、対応するコントローラーとルーティングを定義します。
Rake
コマンドを使用しましょう。
rails g controller custom/cookies_controller index
# app/controllers/custom/cookies_controller.rb
class Custom::CookiesController < ApplicationController
def index
session[:test_session] = { value: "test_session" }
cookies[:test_cookie] = { value: "test_cookie" }
render json: {
message: "Session and Cookie have been set.",
session: session[:test_session],
cookies: cookies[:test_cookie]
}
end
end
# config/routes.rb
namespace :custom do
get "cookies/index"
end
以上で設定は完了です。
アクセス
ブラウザで http://localhost:3000/custom/cookies/index
にアクセスしましょう。
開発者ツールの Application
タブから Cookie
情報を確認します。
session
に格納したデータ(_session_id
)と
cookie
に格納したデータ(test_cookie
)それぞれ確認できれば正常動作になります。
まとめ
お疲れ様でした!
これで基本的な取り扱いについてはマスターできたと思います!