LINEで現役エンジニアに直接質問してみよう!登録無料

rails6を複数ドメインでcookie共有するとセッションが消えてしまう問題の解決方法

アキ

独学でプログラミングを勉強しながらWeb制作会社で働き、プログラミングのエンジニア講師も勤めた経験がある、アキです。

  • rails6でcookieを共有しようと思ったらセッションが消えてしまう
  • config/application.rbconfig/initializers/session_store.rbを編集してみたけど直らない
  • セッションが消えてしまう原因がわからない
  • セッションが消えてしまう原因がなにか調査できない

このような疑問に答えます

結論から言うと、セッションがどこで消えるのか調査し、原因を探る必要があり、その方法は下記の手順で確かめることができます。

  1. railsのエラーページではない正常なページが表示されていることを確認する
  2. cookieの情報を確かめ、下記が正常に確認されているかを確認する
    1. ドメイン
    2. max-age属性とexpire属性
    3. パス
  3. railsのsecret_key_baseが全てのサーバーで同じか確認する
    1. secret_key_baseが異なる環境があると、セッション情報の復号化ができずリセットされてしまいます。

railsのエラーページではない正常なページが表示されていることを確認する

railsのエラーページだと、セッションが設定されることはありません。そのため、ブラウザのcookie取り扱い設定やページの読み込み順序等によってセッションが切れてしまう事があります。

まずは、viewを使ってページが表示されるようにしましょう。

より良い方法は、cookieやセッション情報が一覧で見れるページを作成することです。今後の調査の役に立ちます。ただし、このページがユーザーに見られてしまう事はセキュリティ上危険ですので、開発環境のみ使えるようにすることが必須です。

一例として、私はこのように設定しています。

config/routes.rb
Rails.application.routes.draw do
  if Rails.env.development?
    resource 'cookies', only: [:show]
  end
end
app/controllers/cookies_controller.rb
class CookiesController < ApplicationController
  def show
  end
end
app/views/cookies/show.html.erb
<h2>domainとhostの情報</h2>
<ul>
<li>domain =&gt; <%= request.domain %></li>
<li>host =&gt; <%= request.host %></li>
</ul>
<h2>cookies</h2>
<ul>
<% cookies.to_h.keys.each do |key| %>
<li><%= "#{key} => #{cookies[key]}" %></li>
<% end %>
</ul>

<h2>アプリケーション全体のsession設定</h2>
<%= Rails.application.config.session_options %>

<h2>ユーザー固有のsession設定</h2>
<p><%= request.session_options.to_hash %></p>

<h2>ユーザー固有のsession内容</h2>
<ul>
<% session.keys.each do |key| %>
<li><%= "#{key} => #{session[key]}" %></li>
<% end %>
</ul>

<h2>ActionDispatch::Http::URL.tld_length</h2>
<%= ActionDispatch::Http::URL.tld_length %>

<%= link_to 'Create', cookies_path, method: :post %>

ブラウザ側から、cookieが正しく設定&保存されているかを確認しましょう。確認する手順は、下記になります。

  1. サーバーとブラウザ間でcookie情報がちゃんと送受信されているかを確認する
  2. ブラウザで正しくcookieが設定されていることを確認する

google chomeのデベロッパーツールを使うと確認することができます。

  • developer toolsを開く
  • タブの「Network」を選択
  • ページをリロードする
  • ダウンロード内容一覧の一番上のファイルをクリック
  • Cookiesのタブをクリック

これで、サーバーに送ったcookie(暗号化されたセッション)とサーバーからもらったcookie(暗号化されたセッション)を確認することができます。

  1. ブラウザのcookie情報を確認する

ブラウザに保存された今のcookie情報を確認することができます。

参考 Chromeでcookieを確認する方法小粋空間

特に、

  1. ドメイン
  2. max-age属性とexpire属性
  3. パス

の3項目が正しいかどうかを確認しましょう

rails6のsecret_key_baseが全てのサーバーで同じか確認する

ここまでで異常が無かった場合、railsのsecret_key_baseが異なるため、セッションが復号化できずリセットされている可能性があります。

特に、development環境だと注意が必要です。rails6からcredentials.yml.encが導入されましたが、このファイルで設定したsecret_key_baseはproduction環境でしか使われません

参考 Rails - secret_key_basegithub.com

なので、複数サーバーで開発をしている時は、ここから生じた問題でセッションに影響を与えていることが有るので、確認をしましょう。

解決方法として、config/secrets.ymlを使う方法があります。

config/secrets.yml

development:
    secret_key_base: 836fa3665997a860728bcb9e9a1e704d427cfc920e79d847d79c8a9a907b9e965defa4154b2b86bdec6930adbe33f21364523a6f6ce363865724549fdfc08553
この記事を書いた人

自身がプログラミングを独学で勉強し始めて躓いた経験を元に、これから勉強をする人に向けに「イラスト多めでわかりやすい記事」にこだわって情報を発信しています。

現在はフルスタックエンジニアとしてサービス開発などのお仕事をしています。