Webサイトの提供者が、Webブラウザを通じて訪問者のコンピュータに一時的にデータを書き込んで保存させるしくみです。1つのCookieには4096バイトのデータを記録でき、最大で300のCookieを保存できます。Cookieの訪問者に対する考慮
1台のサーバが同じコンピュータに対して発行できるCookieの数は20個に制限されています。Cookieにはそれぞれ有効期限を設定することができ、有効期限を過ぎたCookieは消滅します。
使い方によっては、非常に便利な Cookie ですが、この機能自体「嫌」という方もいます。それは、サーバー側から クライアントに「知らないうち」に情報ファイルを作成してしまうからです。ブラウザには、「Cookieを有効にする」チェックがあり、 チェックされていない場合、当然 Cookie は使用できません。Cookieの呼び出し
Cookieを使用するページを作成するのであれば、ホームページ内に「Cookieを使用しています」表示をつける、 「Cookieを使用する」チェックボックスを作成するなど、訪問者への配慮を考えなければならないと思います。
Cookieの呼び出し方法は、JavaScriptとPerlで多少違いがあります。エンコードとデコード
- JavaScriptではCookieデータは document.cookie で扱われます。
- Perlでは環境変数 HTTP_COOKIE よりデータを取得し、Set-Cookie:〜をHTMLの先頭("Content-type: text/html\n\n"よりも前)に記述してデータのセットを行います。
- ■ JavaScriptからCookieデータを取得する
- JavaScriptでのCookieデータの取得は、document.cookie を変数に代入する等で利用できます。
// document.cookieを変数に代入 var cookie_data = document.cookie;- ■ JavaScriptからCookieデータをセットする
- document.cookie に決められたフォーマットで値をセットします。
// フォーマットに従い、データを変数にセット var cookie_data = "count=150; expires=Wed, 31-Dec-2003 23:59:59;"; document.cookie = cookie_data;- ■ PerlからCookieデータを取得する
- Perlでは環境変数 HTTP_COOKIEよりデータを取得します。下記の例では、;(セミコロン)で区切られているcookieデータを分解し、さらにデコードを行ってから連想配列にセットしています。
for $buf (split(/; */, $ENV{'HTTP_COOKIE'})) { ($name, $value) = split(/=/, $buf); $value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; $COOKIE{$name} = $value; }- ■ PerlからCookieデータをセットする
- cookieのデータセットは出力の際、Content-typeの直前にSet-Cookie:〜を記述します。データはエンコードしておきます。
$val = "こんにちは"; $val =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $set_cookie = "Set-Cookie: "; $set_cookie .= "msg=$val; "; $set_cookie .= "expires=Fri, 31-Dec-1999 00:00:00;\n"; print $set_cookie; print "Content-type: text/html\n\n"; ・・・
Cookieで情報を記録するとき、日本語などはそのまま書きこむことができません。このような情報を記録するための変換を、エンコードといいます。また、エンコードした情報を読み出して、もとの形式にするための変換をデコードといいます。
エンコード、デコードの方法は、JavaScriptとPerlスクリプトで異なります。
- ■ JavaScriptでのエンコード
- JavaScriptでは escape 関数でエンコードを行います。
var cookie_str = "key=" + escape("こんにちは") + "; ";
- ■ JavaScriptでのデコード
- JavaScriptでは unescape 関数でデコードを行います。
var cookie_str = unescape(cookie_data.substring(0, 20));
- ■ Perlスクリプトでのエンコード
- Perlでは置換演算子を使用して、英数字以外すべてを unpack 関数でエンコードします。
$str =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;(\W) は英数字以外の一つの要素
%%%02X は%% と %02Xに分かれ、%XXに書式化
- ■ Perlスクリプトでのデコード
- 同じく、デコードは pack 関数を使用します。
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg;[0-9A-Fa-f] は英数字
NAME=VALUE Cookieの名前。名前のあとに、実際のデータを付加します
省略不可expires=DATE 有効期限。形式は [Fri, 31-Dec-1999 00:00:00] という型です
省略可domain=DOMAIN_NAME Cookie発行元のドメイン名(たとえば、www1.freeweb.ne.jpなど)
省略可path=PATH ここで指定したパスに対して、cookieが送信されます
省略可secure データを暗号化します
省略可上記のデータを ;(セミコロン)で組み合わせて作成することになります。
var cookie_data; cookie_data = "count=150; expires=Wed, 31-Dec-2003 23:59:59; domain=www1.freeweb.ne.jp; path=/; secure"; document.cookie = cookie_data;