MAGAZINE

ルーターマガジン

web / UI

Sinatraでsession cookieを利用する

2023.02.21
Pocket

Sinatraでsession cookieを利用する

弊社では日々大量のデータを扱っているのですが、それらの中身をサンプリングして人力でチェックする必要しなければならない場面がたまにあります。その際、社内で使う簡単なUIを備えたお手軽webアプリを作るためにrubyの軽量webアプリケーションフレームワークであるsinatraを利用します。今回はそのsinatraのwebアプリでsession cookieを利用し、session情報を保持する方法と注意点をご紹介します。

環境

  • OS: macOS13.0
  • ruby: 3.2.0

事前準備

gem install sinatra puma

実践

sinatraでのsession cookieの利用方法は以下のようになります。

require 'sinatra'

enable :sessions

get '/' do
  session[:hoge] = 'HOGE'
  redirect('/hoge')
end

get '/hoge' do
  session[:hoge]
end

sinatraではRack::Session::Cookieを利用してsession情報の全てを(デフォルトでは)有効期限が「session」のcookieとして発行し、ブラウザで保持、使用されます。

ローカルで上のスクリプトを実行し localhost:4567 にアクセスするとコードの通り、session[:hoge]が作成されたのち、 localhost:4567/hoge にリダイレクトされ、HOGEと表示されます。この時、Chromeのデベロッパーツールを見ると以下のようにブラウザにrack.sessionという名前の暗号化されたcookieが保存されていることが確認できます。

chrome_session_cookie

Expires / Max-AgeSessionとなっており、現在のセッションが切れるまで有効であるためブラウザを閉じると同時に破棄されるようになっています。そのためブラウザを再起動した後に localhost:4567/hoge に直接アクセスするとsession cookieは保持されておらず、何も表示されないはずです。

が、実際に試してみるとなぜかHOGEと表示されたままで、session cookieが破棄されずに残ってしまっていました。

結論から言いますとこの現象はChromeの設定が原因でした。

Safari、Firefoxでは再現しなかったためChromeに原因がありそうだと考え調べてみたところ、Chromeの設定で起動時 → 「前回開いていたページを開く」にチェックが入っているとブラウザを閉じた場合でもsession cookieが保持されてしまい、再度アクセスした際に利用されてしまうようです。

開発中に特定のブラウザのみで挙動確認をしているとこのようなブラウザ依存の問題が発生しかねないので、webアプリ開発の際にはトップシェアの複数のブラウザアプリでのテストが重要になりますね。

session cookieに有効期限を設定

上記でお伝えしたとおり、sinatraではRack::Session::Cookieを利用おり、cookieに保存するsession情報の有効期限を指定することが可能です。この場合、当然ですがブラウザのセッションが続いていても有効期限を過ぎてしまうとcookieは破棄されてしまうので注意が必要です。

session情報を有効期限つきで永続cookieとして発行する方法は以下になります。

require 'sinatra'

use Rack::Session::Cookie,
  # :domain => 'mywebsite.com',
  :path => '/',
  :expire_after => 3600*24, # 有効期限、秒数
  :secret => '**unique secret key**' # 暗号化キー

get '/' do
  session[:hoge] = 'HOGE'
  redirect('/hoge')
end

get '/hoge' do
  session[:hoge]
end

まとめ

今回はsinatraでsession cookieを利用する方法と実際に動かした際の注意点を紹介させていただきました。session、cookieを扱う際には有効期限を意識することが大切ですね。また、弊社では簡単なwebアプリ作成の際にsinatraを利用していますが、調べてみるとやりたいことは意外となんでもできてしまうのでぜひ色々な機能を試してみてください。

Pocket

CONTACT

お問い合わせ・ご依頼はこちらから