10週間ウェブ開発講座

第八週

セッションについて扱います。

HTTP

HTTPは、ブラウザとウェブサーバがテキストデータを交換するときに使用されるプロトコルです。
プロトコルは「通信規約」と訳されることもありますが、より平易に表現すると「手順」のことです。

HTTPによるテキストデータの交換は、ブラウザの「リクエスト」とウェブサーバの「レスポンス」から成ります。
ブラウザがウェブサーバに「xxxのデータをください」と要求することを「リクエストを送信する(リクエストを発行する)」と表現します。
それに対して、ウェブサーバがブラウザにデータを送信することを「レスポンスを送信する(レスポンスを返す)」と表現します。

FirefoxでHTTPリクエストを確認する

FirefoxでHTTPリクエストを確認できるアドオンとして「Live HTTP headers」があります。
このアドオンをインストールし、「表示=>サイドバー」でLiveHTTPHeadersにチェックを入れてください。
Firefoxの左側にLiveHTTPHeaders用の領域が表示されます。

この状態で http://y-mahata.s-tanno.com/ を開いてください。
サイドバーのLiveHTTPHeadersに、Firefoxからのリクエストと、ウェブサーバからのレスポンスのヘッダが表示されます。

livehttpheaders1.png

ユーザエージェントや接続先のパス、コンテンツの種類などがテキスト形式で交換されていることを確認してください。

コマンドラインからHTTPリクエストを発行する

PuTTyでs-tanno.comにログインし、次のようなコマンドを打ってみましょう。

$ telnet s-tanno.com 80
GET / HTTP/1.1
Host: s-tanno.com

[下記はレスポンス]
HTTP/1.1 200 OK
Date: Wed, 06 May 2009 00:07:09 GMT
Server: Apache/2.2.3 (CentOS)
...(略)...

この例では、次のようなリクエストをs-tanno.comに発行しています。

ホスト(接続先)s-tanno.com
プロトコルHTTP1.1
メソッドGET
パス/

LiveHTTPHeadersで確認したものよりもリクエストの項目が著しく少ないことに注意してください。 HTTPリクエストの「必須項目」はとても少ないので、このようなデータ量の少ないリクエストでもきちんと通信を行うことができます。

Internet ExplorerやFirefoxのようなウェブブラウザでインターネット上のウェブページを閲覧する時には、
内部的にこのようなリクエストが発行されていることを意識してください。

セッション

セッションとは、HTTPで継続した通信を行うために必要な仕組みのことであり、通常はクッキーを用いて実現されます。
ただし、ブラウザがクッキーを受け付けない場合はこの限りではありません。

セッションのサンプル

セッションを理解するために、次のページを開いてみてください。

http://y-mahata.s-tanno.com/sample/session.php

開いた後に、何度かページをリロードしてください。
アクセスする度に、ページに表示される数字が増加することを確認してください。
これを実現するためには、次の機能が必要になります。

  • ユーザ毎(ブラウザ毎)に個別の変数を割り当てる
  • HTTP通信時にブラウザ毎の変数を操作(取得/変更)する

PHPでは「セッション」という機能を使うことで、これらの要件を満たすことができます。

先ほど例として挙げたURL(http://y-mahata.s-tanno.com/sample/session.php)の中身は次のようになっています。

  1. <?php
  2.  
  3. if (isset($_SESSION['count'])) {
  4.     $_SESSION['count']++;
  5. } else {
  6.     $_SESSION['count'] = 1;
  7. }
  8. echo $_SESSION['count'];
  9.  
  10. ?>

「session_start()」という関数の役割は「ブラウザを特定し、そのブラウザ専用のセッション変数($_SESSION)を復元」することです。
ブラウザを一意に特定するために、ブラウザが持つクッキーというデータを使用します。

一旦、ブラウザのクッキーを削除しましょう。
Firefoxの場合は「ツール=>プライバシー情報の消去」からCookieをチェックして「今すぐ消去」ボタンをクリックします。
LiveHTTPHeadersを有功にして http://y-mahata.s-tanno.com/sample/session.php を開いてください。
LiveHTTPHeadersで次のような情報が得られます。

GET /sample/session.php HTTP/1.1
Host: y-mahata.s-tanno.com
User-Agent: Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.9.0.10) Gecko/2009042523 Ubuntu/9.04 (jaunty) Firefox/3.0.10 GTB5
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cache-Control: max-age=0

ブラウザの設定によって、細部のパラメータが異なるかもしれません。
では、開いたページをリロードしてみてください。
今度は次のようなリクエストに変わるはずです。

GET /sample/session.php HTTP/1.1
Host: y-mahata.s-tanno.com
User-Agent: Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.9.0.10) Gecko/2009042523 Ubuntu/9.04 (jaunty) Firefox/3.0.10 GTB5
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: PHPSESSID=94ce0af42ee7457653a5f428badc2886
Cache-Control: max-age=0

注目すべきポイントはリロードした方のリクエストに「Cookie: PHPSESSID=94ce0af42ee7457653a5f428badc2886」という行が追加されているところです。
リクエストに含まれるこのCookieのデータを元に、ウェブサーバはブラウザを一意に特定し、
「$_SESSION」という変数名で過去のデータを復元します。

セッションの仕組みを使い、「ログイン機能」や「多重ポストの回避」などを実現することができます。

宿題

「簡易ログイン機能」を実装してください。簡易ログイン機能は次のページを含みます。

  • ログインIDとパスワードを入力させるフォームを表示するページ
  • 「こんにちは、(ログインID)さん」と表示するページ
    • 非ログイン時は「こんにちは、ゲストさん」
  • ログアウトするページ

各ページで機能が重複しても構いません*1
また、ログアウト機能を実装するためには、「セッションの破棄」を行う必要があります。
セッションの破棄は、PHPマニュアルに例があります。

  1. <?php
  2. // セッションの初期化
  3. // session_name("something")を使用している場合は特にこれを忘れないように!
  4.  
  5. // セッション変数を全て解除する
  6. $_SESSION = array();
  7.  
  8. // セッションを切断するにはセッションクッキーも削除する。
  9. // Note: セッション情報だけでなくセッションを破壊する。
  10. if (isset($_COOKIE[session_name()])) {
  11.     setcookie(session_name(), '', time()-42000, '/');
  12. }
  13.  
  14. // 最終的に、セッションを破壊する
  15. ?>

簡易ログイン機能のためのページは、http://y-mahata.s-tanno.com/8th_week_homework.html で参照できる場所に置いてください。
(y-mahata は各自のユーザIDで置き換えてください)

参考資料


*1 例えば、ログインページとログアウトページが同一のHTMLファイルでも可、という意味です。

添付ファイル: filelivehttpheaders1.png 149件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-06-11 (木) 09:53:40 (451d)