クッキー

クッキーとは

なぜクッキーが使われるの?

クッキーとはウェブページを利用したときに、ブラウザとサーバーとの間で送受信したアクセス回数、利用履歴や入力内容などを、ユーザーのパソコンに保存する仕組みです。ユーザーのパソコンに保存されるので、ユーザー自身でクッキーを削除することが可能です。

Webデータのやり取りには、※HTTPプロトコルが使用されていますが、HTTPプロトコルには、状態を保持する機能がありません。つまり、たった今ページにアクセスしたユーザと、次にアクセスしたユーザが同じであるか判断ができないのです。

それに対してクッキーは、ユーザ側のPCに保存され、各ユーザごとに固有の情報を持つので、連続してアクセスしているユーザや、頻繁にサイトを訪れているユーザの識別などに使うことができます。

※HTTPプロトコルとは・・・
プロトコルとは、ネットワークを介してコンピュータ同士が通信を行う上で、相互に決められた約束事の集合のことです。簡単に言えば、通信手順、通信規約のようなものです。英語しか使えない人と日本語しか使えない人では会話ができないように、対応しているプロトコルが異なると通信することができません。HTTPプロトコルとは、WebブラウザとWebサーバ間で交わされるインターネットプロトコルのことです。

クッキーにはどんな使い道があるの?

クッキーは、訪問者が複数のページを閲覧するときに、前のページで入力した情報などを引き継ぐために使用されます。

・訪問者のアクセスカウンター

ユーザごとの訪問回数を表示するカウンターなどを作りたい場合もクッキーを使うと便利です。

・Web掲示板

WEB上の掲示板などで一度書き込みを行うと、その情報がクッキーに保存され、次回から名前やURLなどを再入力する必要がなくなります。

・Webショッピングのショッピングカート

商品紹介ページと購入申し込みページが別々の場合に、どの品物をいくつ購入したのか、といった情報をクッキーに保存して受け渡します。クッキーを使って現在のカート内の商品などを保存し、多くの商品を一度に購入することができます。

クッキーをセットする

クライアントへクッキーを送る

PHPでは、setcookie()関数を使用して、クッキーを送信(クライアントのコンピュータに保存)します。クライアントにクッキーがセットされていなければ、新たに生成し、すでにクッキーがセットされていれば更新します。

    <?php

        if( isset( $_COOKIE[ "CountCookie" ] ) ) {

            $count = $_COOKIE[ "CountCookie" ] + 1;
            setcookie( "CountCookie", $count );

            echo "あなたは" . $count . "回目の訪問です。";

        } else {

            $count = 1;
            setcookie( "CountCookie", $count );

            echo "はじめましてゲストさん!";
        }
    ?>
    

上記のスクリプトでは、はじめにisset()関数で、クッキーの値が存在するか判別して、なければ変数$countに1を代入し、setcookie()関数を使用してクッキーをセットしています。

もし、クッキーの値が存在するなら、加算した値を変数$countに代入して、setcookie()関数を使用してクッキーをセットしています。その後アクセスする度に、クライアントから受け取った値を加算して更新します。

実行結果(1回目)

はじめましてゲストさん!

実行結果(更新)

あなたは2回目の訪問です。

実行結果(更新)

あなたは3回目の訪問です。

isset()関数

isset()関数は、引数に指定した変数が定義されているかどうか調べる関数のことです。

クッキーの有効時間

ただ値をセットしただけのクッキーは、ブラウザを閉じると消えてしまいます。そこで、セットしたクッキーの値を長期間保持させるために、クッキーの有効期限を指定します。

    <?php

        if( isset( $_COOKIE[ "CountCookie" ] ) ) {

            $count = $_COOKIE[ "CountCookie" ] + 1;

            // 5分(300秒)後まで有効
            setcookie( "CountCookie", $count, time() + 300 );

            echo "あなたは" . $count . "回目の訪問です。";

        } else {
            $count = 1;

            // 5分(300秒)後まで有効
            setcookie( "CountCookie", $count, time() + 300 );

            echo "はじめましてゲストさん!";

        }
    ?>
    

上記のスクリプトでは、time()関数で取得した現在の※タイムスタンプをもとに、有効期限を指定しています。

time()関数

time()関数は、現在時刻をUnixタイムスタンプとして取得します。Unixタイムスタンプとは1970年1月1日 00:00:00 GMTからの経過秒数です。PHP内部での日付や時刻の処理はUnixタイムスタンプで行われています。

※タイムスタンプとは・・・
PHPでは、どんな日付や時刻でもタイムスタンプという形式で認識します。タイムスタンプという値は「1970年1月1日 00:00:00 GMT」からの通算秒数、つまり「1970年になった瞬間から何秒経っているか」という秒数のことです。GMTというのはグリニッジ標準時のことです。

    <?php

        // クッキーの有効期限の記述式
        if( isset( $_COOKIE[ "CountCookie" ] ) ) {

            $count = $_COOKIE[ "CountCookie" ] + 1;

            // 2015年2月10日まで有効
            setcookie( "CountCookie", $count, mktime( 0, 0, 0, 2, 10, 2015 ) );

            echo "あなたは" . $count . "回目の訪問です。";

        } else {

            $count = 1;

            // 2015年2月10日まで有効
            setcookie( "CountCookie", $count, mktime( 0, 0, 0, 2, 10, 2015 ) );

            echo "はじめましてゲストさん!";

        }
    ?>
    

上記のスクリプトでは、mktime()関数で、任意の有効期限を指定しています。

mktime()関数

mktime()関数は、引数で指定した日時のタイムスタンプを取得します。

それでは最後に、setcookie()関数と、クッキーの有効期限の記述例についてまとめます。

setcookie()関数

setcookie ( name [, value [, expire [, path [, domain [, secure]]]]]);
name クッキーの名前
value クッキーの値。
expire クッキーの有効期限。
設定しない場合、クッキーはブラウザを閉じるときが有効期限となります。
path サーバー上でのクッキーを有効としたいパス。
domain クッキーが有効なドメイン。
secure 1をセットすると セキュアなHTTPS接続の場合にのみ、クッキーが送信されるようになります。デフォルトは0です。

クッキーの有効期限の記述例

1時間 time() + 60 * 60
1日 time() + 60 * 60 * 24
30日 time() + 60 * 60 * 24 * 30
1年 time() + 60 * 60 * 24 * 365

クッキーの読み込みと削除

受け取ったクッキーへのアクセス

ユーザから送られてきたHTTP要求にクッキーが含まれていた場合、PHPはこのデータを自動的に変換して、スクリプトから使えるようにします。

    <?php
        $count = 1;
        setcookie( "TestCookie", $count );
    ?>
    

上記のスクリプトでは、TestCookieという名前でクッキーをセットしているので、送られてくるクッキーの名前もTestCookieになります。クライアントから受け取ったクッキー情報は、常に$_COOKIEというグローバルな配列に格納されます。


変数の種類には、プログラム全体に対して定義されるグローバル変数というものがあり、このグローバル変数はプログラムのどこからでも参照・更新することができる変数です。PHPでは、変数に「global」をつけることでグローバル変数を宣言できますが、grobalで宣言しなくても、標準でスーパーグローバル変数という変数が搭載されています。

スーパーグローバル変数

変数名 説明
$_SERVER[" "] サーバ実行環境情報
$_ENV[" "] 環境変数
$_POST[" "] POST送信された情報
$_GET[" "] GET送信された情報
$_FILES[" "] POSTで送信されたファイル情報
$_SESSION[" "] セッションに登録されている情報

クッキーの削除

クッキーは、setcookie()関数を使用して削除することができます。

    <?php
        $count = 1;
        setcookie( "deleteCookie" );
    ?>
    

上記のスクリプトのように、setcookie()関数にクッキー名だけを指定すれば、クライアント上のクッキーdeleteCookieは削除されます。

Cookieがどこに保存されるかは、OSやブラウザに依存し、PHPスクリプト側で決定する事はできません。

大抵WindowsXPでは、C:¥Documents and Setting¥ユーザ名¥Cookies以下に、WindowsVistaでは、C:¥Users¥ユーザ名¥AppData¥Roaming¥Microsoft¥Windows¥Cookiesか、その下の¥low以下に、それぞれクッキーが保存されています。

そこから直接削除することも可能ですし、ブラウザ上からは、IEならば「ツール」→「インターネットオプション」→「Cookieの削除」で、Firefoxならば「ツール」→「オプション」→「プライバシー」→「Cookieを表示」から、それぞれ削除できます。

クッキーのテクニック

保持できるクッキーの期限

クッキーには、セキュリティ上の配慮から、利用制限が設けられています。

  • ・ ブラウザはサーバごとに20個、計300個までしかクッキーを保存できない
  • ・ 1つのクッキーに保存できるのは、最大で4096バイト
  • ・ クッキーは受け取り許可をされたサーバにしか送信されない

1つのクッキーに複数の値を割り当てる

1サーバあたり20個までしかクッキーを送れませんが、クッキーを配列として扱い、配列の各要素にそれぞれの値をセットすれば、1つのクッキーで複数の値を保持できます。

1つのクッキーに3つの値を割り当てる

    <?php

        setcookie ( "ArrayCookie[1]", "I" );
        setcookie ( "ArrayCookie[2]", "II" );
        setcookie ( "ArrayCookie[3]", "III" );

        if( isset( $_COOKIE[ "ArrayCookie" ] ) ) {

            while( list( $name, $value ) = each( $_COOKIE[ "ArrayCookie" ] ) ) {

                echo "$name : $value <br />¥n";
            }
        }
    ?>
    

上記のスクリプトでは、配列ArrayCookieにそれぞれの値を格納し、whileループで繰り返し値を取得して表示しています。

実行結果

1 : I
2 : II
3 : III