CookieStore::DEFAULT_SAME_SITE を Ractor 安全化

rails/rails

CookieStore がデフォルトで使用する :same_site 判定ロジックを、Ractor 間で安全に共有できるように変更しました。DEFAULT_SAME_SITE に設定された proc を ActiveSupport::Ractors.shareable_proc でラップし、動作はそのまま保ちつつ Ractor の隔離エラーを回避します。

背景

CookieStore はセッションクッキーの SameSite 属性を決定する際、DEFAULT_SAME_SITE 定数に格納された proc を呼び出します。この proc はリクエストオブジェクトの cookies_same_site_protection を取得し、デフォルトの SameSite ポリシーを返すだけのシンプルな実装です。

従来は単純な proc で定義されていたため、Ractor の境界を越えて渡すと Ractor::IsolationError が発生する可能性があり、マルチ Ractor 環境で CookieStore を利用できないという制約が残っていました。

この制約を解消することが、本変更の主目的となります。

技術的な変更

actionpack/lib/action_dispatch/middleware/session/cookie_store.rb における DEFAULT_SAME_SITE の定義が次のように置き換えられました。

-DEFAULT_SAME_SITE = proc { |request| request.cookies_same_site_protection } # :nodoc:
+DEFAULT_SAME_SITE = ActiveSupport::Ractors.shareable_proc { |request| request.cookies_same_site_protection } # :nodoc:

ActiveSupport::Ractors.shareable_proc は渡されたブロックを不変オブジェクトに変換し、Ractor 間で安全に共有できる形にします。このラップにより、DEFAULT_SAME_SITE が保持するロジックは変わらず、options[:same_site] が未指定の場合でも同一の判定が利用可能です。

initialize メソッド内では依然として options[:same_site] = DEFAULT_SAME_SITE が実行され、他のコードパスへの影響はありません。

設計判断

本改修は 既存定数のラップ という最小限の手法を選択しています。新たな設定キーや API を導入せず、shareable_proc を用いるだけで Ractor 安全性を確保することで、既存コードとの互換性を保ちました。

DEFAULT_SAME_SITE が外部状態を捕捉しない(request だけを引数に取る)という前提があるため、shareable_proc の使用は副作用を生むことなく安全に適用できることが設計上の根拠となります。

このアプローチは、同様のプロックを保持する他のミドルウェアでも同様の手法で Ractor 対応を行える指針を示しています。

まとめ

CookieStore::DEFAULT_SAME_SITEActiveSupport::Ractors.shareable_proc でラップしたことで、Ractor 環境下でも SameSite 判定ロジックを安全に共有できるようになりました。動作は変更されず、既存の API もそのまま利用可能です。この変更は Rails の Ractor 移行に伴う後方互換性を維持しつつ、実装上の安全性を高めた重要なステップです。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
01328f11

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文、背景、技術的変更、まとめが揃っており、総論→各論→結論の流れが明確です。設計判断は任意要素として適切に記載されています。

カスタムMarkdown構文 ⚠ WARNING

シンタックスハイライト・GitHubリンク記法の正確性

コードブロックは正しい `言語:ファイルパス` 形式ですが、PRリンクが `[PR #57837](URL)` となっており、仕様の `[#123](URL)` と完全に一致していません。リンク形式を修正すると PASS になります。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

Rails の内部実装に詳しいエンジニア向けの内容で、初心者向けの過度な説明はありません。

パラグラフ・ライティング ⚠ WARNING

トピックセンテンス・1段落1トピック・段落長

各セクションは導入パラグラフと詳細パラグラフがあるものの、セクションごとの結論パラグラフが欠如しています。各章の最後に要点を簡潔にまとめる段落を追加すると評価が向上します。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事中のコードブロックは提供された Diff と完全に一致し、変更点が正確に反映されています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`proc`、`shareable_proc`、`Ractor`、`IsolationError` などの用語が正しく使用され、PR の記述と合致しています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

技術的な説明は Diff と PR 内容に基づき正確であり、因果関係も論理的です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

全ての主張が PR のタイトル、説明、Diff で裏付けられており、推測や外部知識の付加はありません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR 番号 #57837 が正しく記載されています。数値や固有名詞の誤りはありません。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトルは PR タイトル「Make CookieStore::DEFAULT_SAME_SITE ractor safe」の意味を日本語で適切に表現しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

LTS やリリース日程など、PR に記載されていない外部情報は含まれていません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

時間表現の歪曲はなく、PR の記述と一致しています。