【基礎知識】sessionとcookie


sessionとcookieとは

あいまいだったので調べてみました。

sessionって何?

サーバー側で発行されるもの。
webサイトにログインしてからログアウトするまでの一連の操作や通信のこと。
sessionはsessionIDという名目でsession_start()で発行されます。

cookieって何?

cookieはset_cookie()を使用しサーバー側で発行されブラウザで保存されます。
ちなみにset_cookieを使わなくても、ブラウザ側でcookieのON,OFFを切り替えることができます。

ネットワークの通信は何が起きているのか

まずここからです。webサイトを閲覧するとき何が起きているのか。
ざっくり説明するとPCとwebサイトを保存しているサーバー間で通信が起きています。
やりとりはこんな感じ。

PC「このページを見たいからこれに関するデータ頂戴!」
サーバー「あいよー。これだよ!」

PC「次はこのページを見たいからこれに関するデータ頂戴!」
サーバー「あいよー。これだよ!」

PC「次はこのページを見たいからこれに関するデータ頂戴!」
サーバー「あいよー。これだよ!」

このPCが送ることをリクエストと言い、サーバーがデータを返すことをレスポンスと言います。

なぜcookieが必要なのか

実はHTTPプロトコルという通信方法は「リクエストを送ってレスポンスを返す」という一往復で通信が切れるようにできています。
これをステートレスと言います。(ステートフルもあります)

なので、2回目の通信からは誰から要求されているリクエストなのか分からないんですね。
これを防ぐのがcookieと呼ばれるシステムです。

set_cookie();でcookieを発行しレスポンスします。
するとこのcookieはブラウザで保存されます。

でも、ブラウザ側で保存するとcookieの値を改ざんできた場合他のユーザーになりすますことだってできます。
そこで出てくるのがsessionです。

なぜセッションが必要なのか

セッションがなぜ必要なのかを話します。

sessionはsession_start()関数を使ってサーバー側で発行します。これをsessionIDと言います。
このsessionIDはサーバー側で保存されcookieの中に入れられてレスポンスされます。

そして、ブラウザはsessionIDが入ったcookieを保存し、次の通信からcookieの情報をリクエストに付け加えて送ります。

リクエストを受け取ったサーバーはsessionIDを参考にするんですね。
もし仮に cookieだけのやり取りで、その中の情報がサイトにログインするためのパスワードを改ざんしたものだとしたらどうでしょう?

サーバーは改ざんされた人のデータをレスポンスします。
これでなりすましの完成です。

だけど、sessionIDを用いてたら。
仮にsessionIDを改ざんしても、サーバー側に正しいsessionIDが残っているので照合が合わず通信できません。
理屈はこんな感じです。

まとめ