Sinatra の Session について

投稿日: 2021年 2月 17日

Sinatra の Session 機能 の概要

  • デフォルトで Cookie based(cookie の中に、session のデータが保存される)

    Note that enable :sessions actually stores all data in a cookie
    Sinatra README.md

  • signed (but not encrypted) とあり、cookie のデータはダイジェストにはなっているが、暗号化はされていない

    Support for signed (but not encrypted), cookie-based sessions are included with Sinatra but are disabled by default
    Sinatra: Configuring Settings (sinatrarb.com)

  • Rack::Session::Cookie を使って、sinatra のセッションは実装されている

    Sessions are implemented by inserting the Rack::Session::Cookie component into the application’s middleware pipeline.
    Sinatra: Configuring Settings (sinatrarb.com)

下記のスクリプトで検証してみた

# filename is "server.rb"
require "sinatra"
require "sinatra/reloader"
require "sinatra/cookies"

enable :sessions

# http://localhost:4567/?name=junya のようなクエリパラメータ付きURLでアクセス
get "/" do
  session[:name] = params[:name]
  'hello, <a href="session">check session</a>'
end

# クエリパラメータで渡した name が session[:name] に保存され、それを出力する
get "/session" do
  "Your name is #{session[:name]}"
end
  1. ruby server.rb でスクリプトを実行して、sinatra のサーバーを起動
  2. ブラウザから http://localhost:4567?name=hogehoge にアクセス
    • sessin に name の値を保存するため、クエリに name=hogehoge を設定
  3. 開発者ツールで、session のデータが保存されていると思われる cookie の存在を確認
  4. cookie の値は BAh7CUkiD3Nlc3Npb25faWQGOgZFVG86... のような base64 でエンコードされてるっぽい文字列であることを確認
  5. get "/session" のルートにアクセスすると、Your name is hogehoge が表示されて、session のデータが機能していることを確認
  6. 肝心の session データが格納されている cookie の中身の確認

    • BAh7CUkiD3Nlc3Npb25faWQGOgZFVG86... を オンラインツールの base64 デコーダーでデコードしてみる

Rack::Session::Cookie に記載の通り、base64 でエンコードされた状態で session のデータがクッキーに保存されていることが確認できました!
パスワードとか機密情報をsessionで扱うのはダメそうです。
session の store 先をサーバーに設定することもできるっぽいけど、今は必要ないから、スルー。
デコードされた cookie が微妙に文字化けしているのはなぜだろうか・・・。

プログラミングに関するオススメ書籍