クッキー(Cookie)とは?
一般的にクッキーといえば、サクサクとおいしい焼き菓子のことですが、インターネットの世界では別のものを指します。それは、Webサイトにアクセスしてきたユーザが使用しているWebブラウザに送信され、保存されるデータのことです。
はじめは「Netscape Navigator」というWebブラウザの独自な機能だったのですが、やがてRFC2965「HTTP State Management Mechanism」 などの仕様が定められたことで、インターネット上の標準としての地位を確立し、ほぼすべてのWebブラウザでクッキーをサポートするようになりました。
PHPプログラムでは、Webブラウザとの間でこうしたクッキーのデータをやりとりすることができるようになっています。今回紹介するのは、その方法です。
クッキーの主な用途
クッキーが広く普及した理由は、初回のアクセス時にそれぞれのユーザに対して異なるデータを送信しておくと、次回からはクッキーの値を読み取ることで各ユーザに合わせた内容のWebページを表示させることができるためです。主なクッキーの用途を2つ紹介します。
(1)ログイン/ログアウト
典型的な例はログイン/ログアウトの制御です。Webサイトで会員登録をすると各ユーザごとに異なるIDが提供され、そのIDでログインすると、専用のWebページが表示されます。このようなしくみが実現できるのは、実はクッキーのおかげなのです。
ログイン時にWebブラウザへクッキーが送信するようにします。そうしておくと、次に同じユーザからアクセスされたときに保存されたクッキーをPHPプログラムで受信できますので、そのユーザがログイン中かどうかがを判断できます。ログアウトするときにはクッキーを削除します。これがログイン/ログアウトを実現するしくみです。
ところで、あなたがあるWebサイトにログインした後、しばらく席を外したとします。そして席に戻った後に再びアクセスしようとすると、「 自動的にログアウトされました」と表示されることがあります。このような経験はないでしょうか。
実は、クッキーには有効期限があります。これを過ぎたものは、仮にデータを受信できても有効なものとはみなされません。そのため、席を外している間に有効期限が過ぎてしまうと、再びアクセスしてもクッキーが存在しないのと同じになります。ユーザがログアウト操作をしたわけではありませんので、「 自動的にログアウトした」と判断するのです。
(2)アクセス追跡
ログイン/ログアウトをしなくても、クッキーがWebブラウザに送信されることがあります。それは、同じユーザがどのWebページを閲覧したのかを記録するためです。
名前や住所などが記録されるわけではありませんが、「 あるユーザ」はどの時刻にアクセスを開始し、どの分野のコンテンツを閲覧したかという情報は、Webサイトをユーザに役立つものにするために重要な情報です。
このような情報を、たとえば通販サイトが利用すると、どのような商品を売り物として揃えれば良いかを知る手がかりをつかむことができるでしょう。最近では、アクセス追跡の情報を、ユーザがより強く関心を持ちそうな広告を表示させるために利用する例も増えています。
クッキーのデータをどのように利用しているかは、Webサイトの「プライバシーポリシー」などのページに掲載されていることがありますので、興味がある方は検索してみてください。
クッキーを送信する
前置きが長くなりましたが、PHPプログラムでクッキーをWebブラウザに送信する方法を紹介します。
PHPプログラムでクッキーを送信するにはsetcookie()関数 を用います。
setcookie( 名前, 値, ... );
PHPマニュアル にもあるとおり、名前以外は省略可能ですが、Webブラウザにデータを保存したいときは、最低でも名前と値は記述することになります。名前は、後述するように受信の際に必要になります。値が日本語のときは、%xx%xx...
という形式に変換して送信されます。
setcookie()をソースコードに記述するときは、リスト1 に示すように、<?php ... ?>
の前に空白などを設けず、かつHTMLタグよりも前の位置でなくてはなりません。なぜなら、HTMLタグなどの文字列の送信が始まってしまうと、クッキーの送信ができないからです。
リスト1 setcookie()はHTMLタグよりも前に記述する
<?php
// ..........
setcookie( 'CookieByPHP', 'クッキーの値' );
// ..........
?>
<html>
<!-- ..... コンテンツ ..... -->
</html>
送信されたクッキーがきちんと保存されているかどうかを確かめたいときは、Firefox のようにクッキーの内容を表示できるWebブラウザを利用すると良いでしょう(図1 ) 。また、Webブラウザでクッキーを受け付ける設定になっていないと、クッキーを送信してもデータが保存されませんので、あらかじめ設定を確認しておいてください。
図1 Webブラウザに保存されたクッキー
クッキーに有効期限を設ける
前述のログインのように、クッキーに有効期限を設けるときは、値の次にそれを記述します。現在時刻からの時間で期限を設けるときはtime() を、特定の時刻を期限としたいときはmktime() を用いると良いでしょう。
リスト2 有効期限の設定
// 現在時刻から30分後まで有効(秒数単位で計算)
setcookie( 名前, 値, time() + 60 * 30 );
// 2008/01/16 18:00:00まで有効
setcookie( 名前, 値, mktime( 18, 0, 0, 1, 16, 2008 ) );
クッキーを受信する
クッキーが保存されているユーザからアクセスがあると、WebブラウザはクッキーをPHPプログラムに送信してきます。受信されたクッキーの内容を調べるには、$_COOKIE
を用います。これは配列という形式の変数です。
特定の名前のクッキーの値を知るには、$_COOKIE[名前]
と記述します。値を調べる前に、クッキーを受信しているかを調べるときは、isset( $_COOKIE[名前] )
と記述します。どちらの場合でも、有効期限を過ぎてしまったクッキーは受信されません。
リスト3 クッキーの中身を調べる
// 特定のクッキーの値を知る
$_COOKIE['CookieByPHP'];
// 特定のクッキーが受信しているかを調べる
isset( $_COOKIE['CookieByPHP'] );
// どんな名前のクッキーが受信できたかを調べる
foreach( $_COOKIE as $name => $value ) {
// ..... $nameと$valueを用いた処理 .....
// ..... $nameには名前、$valueには対応する値が代入済み .....
}
セキュリティへの配慮
クッキーとして送信する値は、セキュリティに配慮して決めるべきです。なぜなら、前回 述べた「クロスサイトスクリプティング」 は、クッキーの情報を盗み取ることが目的であることも少なくないからです。また、図1 のようにクッキーの値を確認する方法が用意されていることもありますので、ユーザIDなどの情報をそのまま送信すべきではありません。
では、どうすればよいかということになりますが、基本的な対策としては、以下が挙げられるでしょう。もちろん、このほかにもさまざまな対策が必要です。
クッキー自体の対策
ユーザIDなどとは関連しない、新しく作成したデータを用いる
有効期限を短くする
クッキーが有効なドメインやパスを細かく設定する
Webサイト側の対策
クッキーの悪用がないかを監視する
セキュリティに関する情報を常に収集し、それに基づいて新たな対策を施す
ユーザへの啓蒙
プライバシーポリシーを明らかにする
セキュリティに関する注意を喚起するなど...
クッキーは、前述の通りWebサイトにとって便利なものである一方で、利用に当たってはセキュリティ対策が求められます。この両面を知った上でPHPプログラムを開発するようにしてください。