セッションにまつわる言葉について整理してみたお話

Webアプリケーションの開発に携わっていると当たり前のように見聞きする「セッション」ですが、徳丸本輪読会でセッション攻撃の対策をまとめていて、ふと理解があやしいなと思ったので、改めてまとめ直してみました。

セッションとは?

ユーザの状態を覚えておくためにサーバに保存するもの。

HTTPはステートレスなプロトコル。文字通り、状態を保存できない。するとこんなことが起きます。

  1. ユーザがサーバにログインの為のリクエストを出して、サーバがレスポンスを返してログインする
  2. ユーザが再度リクエスト投げる
  3. サーバは『このユーザは5秒前にログインしたユーザですよ』と識別できない
    (ので、もう一度ログイン処理が必要になってしまう)

でもそれだと不便なので、ユーザのデータをハッシュ化して、キー(ID)とセットでサーバに保存する。このキーと値のセットをセッションという

もうひとつの意味としては、ユーザがログインしてからログアウトするまでの一連の操作のこと。

セッションとは何か - Railsセキュリティガイド

セッションIDとは?

セッションのキーと値のセットの内のキーのこと。保存先はDBまたはインメモリ、またはサーバ内のファイル。

ユーザ情報をサーバに保存するだけだと、どうやってユーザとセッションを紐づけたらいいかわからない!😖

なので、このセッションIDをサーバとクライアント(いわゆるブラウザ。Cookieとして保存します)に保存して、リクエストを送信する時にセッションIDを送信し、サーバ側に保管されているセッションIDを引いて値を取り出す、ということをしています。

よく聞く「セッションハイジャック」「セッション固定攻撃」はこのセッションIDを盗みとったり、ユーザに強制したりしてなりすましを行う攻撃です。

セッション変数とは?

セッションのキーと値のセットの内の値のこと。

ユーザ情報を保管する他、突合のためのCSRFtokenを保管したりもします。

セッションCookieとは?

セッションIDを保管するためのCookieのこと。

ブラウザを閉じると破棄されるCookieのことを「セッションCookie」ともいうらしい…?(この辺はまだよくわかっていないです)

なんとなくの理解で使っていた「セッション」「セッションID」など、理解するとRailsのコードも何をしているのかが考えやすくなりました!

※ 調べた上で記載していますが、間違っているところがあったらご指摘頂けると大変幸いです!!