サンゴラボ

4年目ソシャゲエンジニア

PHPのクッキーとセッション

このブログではPHPフレームワーク(CodeigniterとかFuelPHP)について書いていこうかと思ってたけど、僕のPHP経験がなさすぎてちゃんとしたことが書けないことに気づいた(そもそもエンジニアとしての経験がゼロに等しい)。そこで、わからないことについては素直に基礎からまとめていこうと思います。

とりあえず今回はWeb業界にいてもPHPを勉強していても必ず出てくるクッキーとセッションについてまとめておきます。あくまで自分用のメモです。

この2つのワードは働いていてもよく出てくるのですが、なんとなくわかってる状態だったので、ちゃんと理解しないとヤバいなと感じていました。

クッキーとセッションを理解するための大前提は、HTTPはステートレスなプロトコルであるということです。つまり、HTTPリクエストは毎回独立したものであるということです。

そのため、Webではページ間で情報を共有することができないということになります。それを解決するために、クッキーやセッションが使われています。

以下PHPに絡めた話

■クッキー

  • クッキーはクライアントに保存可能な小さなテキストのこと
  • サーバはクライアント上のクッキーを勝手に読み書きできる
クライアント・サーバ間のクッキー情報の授受はHTTPヘッダで行われる。
  • レスポンスヘッダのSet-Cookie
  • リクエストヘッダのCookie
PHPでは
  • setcookie関数:レスポンスヘッダにSet-Cookieヘッダを追加
Set-Cookie: url=http%3A%2F%2F35lab.hateblo.jp%2F; expires=Sun, 02-Dec-2012 18:26:17 GMT
  • $_COOKIE変数:リクエストヘッダのCookieヘッダの参照
Cookie: url=http%3A%2F%2F35lab.hateblo.jp%2F
クッキーの問題点
  • name(クッキー名)=value(値)の形でデータそのものがクライアントに保存されている
  • 実データがネットワーク上を流れるので簡単に見ることができる

■セッション

  • セッションはデータをサーバ側で管理する
  • クライアント側にはセッションIDだけを保存
PHPでは

session_start関数でセッションを開始する。セッションを開始した後のレスポンスにはSet-CookieヘッダとしてPHPSESSIDという名前のクッキーが送信される。

Set-Cookie: PHPSESSID=lrg9amcqb7646tgtih5fd0uap3; path=/

クライアントからのリクエスト時はCookieヘッダでPHPSESSIDが送信される。ここで、クライアントー・サーバ間でやりとりされるのはセッションIDだけであることがポイントである。サーバで管理されるセッション情報の読み書きはは$_SESSIONを介して行われる。

セッションIDを入手できれば、なりすましは可能。しかし、セッションIDはセッションが切れたら無効になるので、リアルタイムに盗聴しないかぎり、なりすましは難しい。セッションはブラウザを閉じれば切れる。また、session_regenerate_id関数を使えば、セッションの途中でセッションIDはを再作成することができる。


最近HTTPと仲良くなってきた気がする。あとは自動ログインの仕組みとか、各フレームワークにおけるセッションの実装とか知りたいところ。