【Web技術】SessionとCookieを✅

やっとこさ正式リリースをする事ができたけど開発に終わりが見えていない23期酒ケジュール作成中です。

アプリURL

https://www.zeroken.site

携帯だと背景画像がぐわンぐわん動いてしまうエラーを早急に解決させたいです。

今回は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を手に入れるのが目的。サイト制作者としては、目立つ場所にログアウトボタンを作成して、ユーザーにセッション情報を削除してもらう工夫が必要。

Rails セキュリティガイド - Railsガイド

Cookieとセッションをちゃんと理解する - Qiita

Action Controller の概要 - Railsガイド