セッションにまつわる言葉について整理してみたお話
Webアプリケーションの開発に携わっていると当たり前のように見聞きする「セッション」ですが、徳丸本輪読会でセッション攻撃の対策をまとめていて、ふと理解があやしいなと思ったので、改めてまとめ直してみました。
セッションとは?
ユーザの状態を覚えておくためにサーバに保存するもの。
HTTPはステートレスなプロトコル。文字通り、状態を保存できない。するとこんなことが起きます。
- ユーザがサーバにログインの為のリクエストを出して、サーバがレスポンスを返してログインする
- ユーザが再度リクエスト投げる
- サーバは『このユーザは5秒前にログインしたユーザですよ』と識別できない
(ので、もう一度ログイン処理が必要になってしまう)
でもそれだと不便なので、ユーザのデータをハッシュ化して、キー(ID)とセットでサーバに保存する。このキーと値のセットをセッションという。
もうひとつの意味としては、ユーザがログインしてからログアウトするまでの一連の操作のこと。
セッションIDとは?
セッションのキーと値のセットの内のキーのこと。保存先はDBまたはインメモリ、またはサーバ内のファイル。
ユーザ情報をサーバに保存するだけだと、どうやってユーザとセッションを紐づけたらいいかわからない!😖
なので、このセッションIDをサーバとクライアント(いわゆるブラウザ。Cookieとして保存します)に保存して、リクエストを送信する時にセッションIDを送信し、サーバ側に保管されているセッションIDを引いて値を取り出す、ということをしています。
よく聞く「セッションハイジャック」「セッション固定攻撃」はこのセッションIDを盗みとったり、ユーザに強制したりしてなりすましを行う攻撃です。
セッション変数とは?
セッションのキーと値のセットの内の値のこと。
ユーザ情報を保管する他、突合のためのCSRFtokenを保管したりもします。
セッションCookieとは?
セッションIDを保管するためのCookieのこと。
ブラウザを閉じると破棄されるCookieのことを「セッションCookie」ともいうらしい…?(この辺はまだよくわかっていないです)
なんとなくの理解で使っていた「セッション」「セッションID」など、理解するとRailsのコードも何をしているのかが考えやすくなりました!
※ 調べた上で記載していますが、間違っているところがあったらご指摘頂けると大変幸いです!!