Railsでpath付きcookieが削除できなくて困った件

Railsでpath付きcookieが削除できなくて困った件

皆さんこんにちは

先日Railsでpath付きのcookieが削除できなくて困りましたが、最終的には以下のようにして対応できました。

cookies[:abc] = {:value =>"", :path => "/home", :expires => Time.at(0) }

しかしよく調べてみたところ、削除時にpathを指定すれば普通に削除できたので、いい加減な対応をして終わらせた事への反省の意味を込めて調べた内容を公開しようと思います。

検証環境

  • Ruby 2.2.2
  • Rails 4.2.4

Railsでcookieを扱う場合はActionDispatch#cookiesを使います。

cookieを読み書きする

コントローラ内で以下のように記述することでcookieを書き込むことができます。

cookies[:abc] = 'test'

書き込んだcookieは以下のように読み出せます。

value = cookies[:abc]

cookieを削除する

コントローラ内に以下のように記述することでcookieを削除できます。

cookies.delete(:abc)

オプションを指定してcookieをセットする

オプションを指定してcookieをセットする場合は以下の用にハッシュで指定します。

cookies[:abc] = {
value: 'test',
expires: 1.day.from_now
}

上記の例では一日後の有効期限を付けたcookieをセットしています。

指定できるオプションは以下のとおりです。

オプション 説明 デフォルト値
:value クッキーの値
:path クッキーが有効なパス
:domain クッキーが有効なドメイン 現在のホスト
:expires クッキーの有効期限 /
:secure 暗号化通信でのみクッキーを送信 false
:httponly HTTPクッキーを有効 false

署名付きcookieを読み書きする

通常のcookieでは平文でブラウザに保存されますが、署名付きcookieとして保存するとブラウザ側で中身が見られることはありません。

以下のようにすることで署名付きcookieを書き込めます。

cookies.signed[:abc] = 'test'

オプションを指定する場合は通常のcookieと同じでハッシュを渡します。

cookies.signed[:abc] = {
value: 'test',
expires: 1.day.from_now
}

読み込む場合は以下のようにします

value = cookies.signed[:abc]

signedを付けないで署名付きcookieを読み込もうとすると、暗号化された値が取得されます。

パスやドメインを指定したcookieが削除できない場合

パスやドメインを指定したcookieを削除する場合は、削除時には以下のように:path:domainを指定する必要があります。

パスを指定したドメインをセット

cookies.signed[:abc] = {
value: 'test',
expires: 1.day.from_now,
path: '/home'
}

パスを指定したドメインを削除

cookies.delete :abc, path: '/home'

永続化cookieをセットする

以下のようにすると、永続化cookie(有効期間が20年に設定されたcookie)を設定できます。

cookies.permanent[:abc] = 'test'

TAG

  • このエントリーをはてなブックマークに追加
金子 将範
エンジニア 金子 将範 rubyist

新しいことや難しい課題に挑戦することにやりがいを感じ、安定やぬるい事は退屈だと感じます。 考えるより先に手が動く、肉体派エンジニアで座右の銘は諸行無常。 大事なのは感性、プログラミングにおいても感覚で理解し、感覚で書きます。