PHPでクッキーとセッション処理

HTTPを使ったWebサービスを構築する場合、クッキー(Cookie)というモノを使う必要があるらしく、少し調べてみました。(Cookieの基本的な仕組みに関してはココがわかりやすかったです)
クッキーを使わないと、異なるURLにジャンプした時に以前の情報を保持できなかったりします。保持できないと「ログイン処理を行った」という情報も忘れてしまうので、Webサービスの画面遷移の度に、ユーザ認証させるような最低な操作感になったりします。


しかし、Cookieというのは基本的にクライアント(ブラウザ)側に変数を記憶してもらうという仕組みなので、クライアント側だけの変数管理ではログイン管理は難しく、結局サーバ側にセッションID(一時的なログイン成功した証明、DB内部のUIDなんか外に出すわけにはいかないので)用のDBテーブルが必要になったりするので、セッションID管理用のロジックを考えたりDB操作が必要になったりで色々面倒です。
それらを踏まえて思いつく管理方法例は↓みたいな感じになると思います。

クッキーを使ったログイン管理の処理例

  1. Webサービスにアクセスする、有効なセッションIDクッキー(有効期間内でDB内に存在する)を持ってればWebサービスを提供、無ければログインを促す(2へ)
  2. ログイン処理をさせる、ユーザとパスワード値があればセッション値(有効期間付き)を生成し、DBに登録する(3へ、既にユーザに関連付けられた期限切れのセッション値がある場合は更新する)
  3. セッション値をクライアント(ブラウザ)に保存してもらい、次回アクセス以降はその値を使ってもらう(1へ戻る)

流れ的にはこんな感じなんですが、この一連処理を実装するのって結構面倒です。
しかしPHPにはセッション管理用の関数が提供されているので、それを使う事で簡単にセッション管理する事ができます。(セキュリティ的に「PHPのセッション管理が実用に耐えうるか」って話もありますが、そこら辺まで調べられてません。セッションIDの長さをあげて有効期間を短くすれば、セキュリティはより高くなると思います)
ちなみに上の管理例でUID(ユーザID)とセッションIDの関連付けを1:1にすれば、ニコニコ動画のような1クライアントのみログインを許可するという挙動に(多分)なります。

簡単なPHPセッション機能の利用例(ログイン判定、ログアウト)

ログイン判定処理的なもの

ログアウト処理的なもの
// 以下にログイン画面に自動遷移するHTMLを記述

これだけでセッション管理ができます。
PHP関数で隠蔽化してるので、実際にはPHPSESSIDというクッキー変数で管理してたりしてます(ブラウザの設定の「クッキー一覧」で確認できます)
それ以外の変数(上記例ではuserid変数)はCookieを使わずに、サーバ側のメモリで管理するという仕組みになってます。

番外編(PHPでのCookieの扱い)

PHPでも基本的なCookie処理をさせる事ができます。
クッキーはHTMLのヘッダフィールドで情報をやり取りするため、(確か)PHPで1行もprint出力していない時点でしか使えません。

Cookie値を設定しクライアントに保存してもらう、
//この例だと「hoge」という変数名に「aiueo」っていう文字列値を入れて、
//1時間ほど有効化されます
setcookie("hoge", "aiueo", time()+3600);
クライアントから送られたCookie値を取得する、
//この例だと「hoge」というCookei変数の中身を取得し$hogeというPHP変数に代入する
//is_null()で取得できているか確認できます
$hoge = $_COOKIE["hoge"];