railsでサブドメイン間のcookieを共有する方法

railsでサブドメイン間のcookieを共有する方法メモ。



.example.comを指定すればサブドメインでcookieを共有できる


cookieのdomainの値を.example.comにすれば、サブドメイン間でcookieを共有できます。ベースとなるexample.comのcookieも共有できます。


先頭のドットは歴史的な経緯とか色々あるっぽいですが、分かりやすい必要性としては、「後方一致なので、example.comを指定するとhello-example.comにもマッチしてしまう」という理由があるようです。


railsでcookieのdomainの値を設定する方法は以下の通り。


# config/initializers/session_store.rb
Rails.application.config.session_store :cookie_store, key: '[app_name]', domain: '.example.com'


cookieをサブドメインで共有すればsessionも一緒に共有される


cookieはブラウザに値を保存する仕組みです。sessionは、cookieにsession_idだけを保存しておき紐付いた値はサーバーに保存する仕組みです。


なので、sessionをサブドメインで共有したい場合は、cookieをサブドメインで共有するようにすればOKです。連動してsessionもサブドメインで共有されます。



domainやpathを指定するとcookie.deleteで単純に削除できなくなる


cookieの仕様として、個別のcookieにdomainやpathを設定すると、cookie.deleteでは値を削除できなくなることがあるようです。詳しくは下記のリンクをご参照ください。


Ruby on Railsでクッキーにドメインやパスを指定すると、cookies.deleteで削除できなくなる。

Deleting Cookies from a Controller


session_store.rbで共通のdomainを指定している場合は、cookie.deleteだけで削除できるようです。また、途中でcookieのdomainの値を変えると、複数のdomain違いのcookieがブラウザに共存してしまうことがあります。


その場合は、ユーザーにブラウザのcookieを削除してもらうのが(開発者にとっては)一番手っ取り早い解決策になります。



参考リンク


Cookie仕様 日本語訳

Ruby on Railsでクッキーにドメインやパスを指定すると、cookies.deleteで削除できなくなる。

サブドメインでCookieを共有するRails3の設定

HTTP Cookies

Deleting Cookies from a Controller


著者プロフィール
Webサイトをいくつか作っています。
著者プロフィール