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を削除してもらうのが(開発者にとっては)一番手っ取り早い解決策になります。
参考リンク
Ruby on Railsでクッキーにドメインやパスを指定すると、cookies.deleteで削除できなくなる。
Deleting Cookies from a Controller