Ruby で HTTP セッションを使ういろいろな方法

投稿日: 2021年 2月 16日

library cgi/session

最もベーシックな session ?? 何でしょうか?

# filename: index.rb
require "cgi/session"
cgi = CGI.new
session = CGI::Session.new(cgi)

session["name"] = cgi.params["name"]
puts session["name"]

ruby コマンドで上記スクリプトを実行したら、
(offline mode: enter name=value pairs on standard input)
と表示されて、対話的になる。

実行例:

$ ruby index.rb
(offline mode: enter name=value pairs on standard input)
name=hakaseTaro
hakaseTaro

プログラムを操作するには、

  • key=value の形式で入力する(standard input へ入力)
  • 入力後、Enter
  • 入力が終わったら、Ctrl + d でプログラムを再開

cgi とかついているし、この session の使い方はよくある web の session とは異なるような・・・・
(そもそも session という概念が理解しきれてないのですが)

Sinatra で、session を有効にする

sinatra で session を使うには、sinatra/cookies を使って、enable :sessions と書くだけ

require 'sinatra/cookies'
enable :sessions

リファレンスによると

Support for signed (but not encrypted), cookie-based sessions

とあるので、session は ハッシュ化された cookieだが、暗号化はしないので、セキュリティーのリスクになりうる?

例えば、ユーザー ID とかを session に入れたときに、ハッシュ化された cookie としてクライアントに返されるけど、
それは暗号化されていないので、そのクッキーが漏れたりして、第三者がクッキーに対してレインボーテーブル攻撃仕掛けて
ユーザーの ユーザー ID を特定できるということ?

sinatra で session をどのように使うかは下記のチュートリアルをやるといいかもしれない。(チラ見しただけなんですが^^;)
http://www.getlaura.com/how-to-enable-sessions-with-sinatra/

Rails のやり方

特に下準備不要で めっちゃ簡単に session 使える。

蛇足ですが、session に クラスのインスタンスを入れると、後々変更がしづらくなるという弊害があるので、やらないほうがいい。(クラスのインスタンスを入れると、クラスのプロパティでいろいろ値が管理できて便利そうではありますが・・・)

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