SessionとCookie
Sessionとは
コンピュータシステムやネットワーク通信において、接続/ログインしてから、切断/ログオフするまでの、一連の操作や通信のこと
(https://e-words.jp/w/セッション.html)
何故必要なのか
HTTPはステートレスなプロトコルなため、「状態」を持てないから。
そのため、状態をもつことのできるモノ、sessionを代わりに作成する必要がある。
こうすることで、リンクなどを張ってページを移動しても内容を保持することができる。
セッションが不要になった場合は、reset_sessionを使って全体のsessionを削除することが出来る。
特徴
- クライアント側のブラウザに保持され、サーバー側にリクエストする際に、HTTPリクエストのボディにsession情報が記述されたcookieを格納している。
- Webブラウザを閉じるまで保存される
- cookie内のセッションidによって識別できる。
中身にあるメソッドは、下記の通りになっている。
ActionDispatch::Session::CookieStore
: すべてのセッションをクライアント側のブラウザのcookieに保存するActionDispatch::Session::CacheStore
: データをRailsのキャッシュに保存するActionDispatch::Session::ActiveRecordStore
: Active Recordを用いてデータベースに保存する (activerecord-session_store
gemが必要)
あらゆるセッションは、セッション固有のIDをcookieに保存される(注意: セッションIDは必ずcookieで渡さなくてはならない)。
Cookieの役割
- WebサーバーからWebブラウザへHTTPレスポンスのヘッダを利用して小さな情報を送る。この情報は「名前=値」の組み合わせで表される。
- Webアプリケーション側では、リクエスト•ヘッダに入っているCookieを調べることで、アクセスしてきた相手がどのような相手なのかを知ることができる。
セッションの中身は以下の通り。現在のユーザーを認証している裏側。
class ApplicationController< ActionController::Base
private
# キー付きのセッションに保存されたidでユーザーを検索する
# :current_user_id はRailsアプリケーションでユーザーログインを扱う際の定番の方法。
# ログインするとセッション値が設定され、
# ログアウトするとセッション値が削除される。
def current_user
@_current_user||= session[:current_user_id]&&User.find_by(id: session[:current_user_id])
end
end
セッションに何かを保存したければ、ハッシュのようにキーに対して保存したい情報を割り当てる。
class LoginsController < ApplicationController
# "Create" a login, aka "log the user in"
def create
if user = User.authenticate(params[:username], params[:password])
# セッションのuser idを保存し、
# 今後のリクエストで使えるようにする
session[:current_user_id] = user.id
redirect_to root_url
end
end
end
SessionとCookieのやり取り
- セッションに保存された内容は、Webサーバーにファイルとして保存されている。
- ユーザーのWebブラウザにはセッションID(無作為な英数字)がCookieに記録される。
- セッションIDとWebサーバー上のファイルが照合されてセッション内容を取り出す。
Session関連のセキュリティ
Sessionハイジャック
サイトからログアウト(セッション情報を削除)し忘れると、悪意のある第三者がそのサイトにアクセスしてセッション情報を乗っ取ってしまう可能性がある。そのことにより、下記のような攻撃を受けてしまう恐れがある。
攻撃対象のWebサイトの脆弱性を突き、攻撃者がそこに悪質なサイトへ誘導するスクリプトを仕掛けることで、サイトに訪れるユーザーの個人情報などを詐取する攻撃のことを指します
(https://www.amiya.co.jp/column/cross_site_scripting_20210118.html)
クロスサイトスクリプティング (XSS) 攻撃は、多くの場合、ユーザーのcookieを手に入れるのが目的。サイト制作者としては、目立つ場所にログアウトボタンを作成して、ユーザーにセッション情報を削除してもらう工夫が必要。