MAGAZINE
ルーターマガジン
Sinatraでsession cookieを利用する
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が保存されていることが確認できます。
Expires / Max-Age
がSession
となっており、現在のセッションが切れるまで有効であるためブラウザを閉じると同時に破棄されるようになっています。そのためブラウザを再起動した後に 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を利用していますが、調べてみるとやりたいことは意外となんでもできてしまうのでぜひ色々な機能を試してみてください。
CONTACT
お問い合わせ・ご依頼はこちらから