perlでCookieのあれこれ試してみました
サイト内のトラッキングや会員ログイン情報などCookie(クッキー)を利用してユーザーを識別するperlプログラムを書く際に1回の処理で(そのページへの1回のロードで)
・何回書き込めるの?
・書き込みと読み込みの両方は、出来るの?
・書き込みと読み込みは、どちらが優先されるの?
1回のロードで読み書き
perlで下のようなスクリプトを書いて実行してみました。
$TEST="ABCDEFG";
$cookie_name="test";
$cpath="/";
$gmt=任意日数print "Set-Cookie: $cookie_name=$TEST\; path=$cpath\; expires=$gmt\n";
print $ENV{'HTTP_COOKIE'};
1回目の結果:何も表示されず
2回目の結果:ABCDEFGが表示される
書き込みと読み込みを1回のロード(処理)で行なった場合は「書き込みは出来るけど、書いた最新の値を読み込むことは出来ない」
となりました。
1回のロードで複数回書き込み
1回のロードでCookieが何回書き込みできるのかテスト
for (1..100){
print "Set-Cookie: $cookie_name=$loop\; path=$cpath\; expires=$gmt\n";
$loop++;
}
結果は、何回でも書き込みできました。ブラウザの規定値まで書き込めるようです。
ブラウザによってまちまちですがサーバごとに保持できるクッキーの数は、大よそ20個程度です。 クッキー名を同一のした場合は、単純に上書き処理を実行します。
javascriptによる力技
1回のロードで書き込み→その値を参照したい場合の力技です。
print "Set-Cookie: $cookie_name=$TEST\; path=$cpath\; expires=$gmt\n";perlのSet-Cookieで書き込んでjavascriptのdocument.cookieで読み込んでいます。
↓
<script type="text/javascript">
document.write("javascript<>"+document.cookie);
</script>
この場合は、書き込んだ最新のクッキーをjavascriptより参照できます。
利用用途は、あまり無いと思いますが^^
イメージタグからクッキーを書き込む方法
Cookieを書き込みたいページに以下のタグを記述
渡したい引数を##の部分に記載
○○○.jp/cookie.cgiの中身
$TEST=パラメータidを任意手段で取得
$cookie_name="test";
$cpath="/";
$gmt=任意日数
print "Set-Cookie: $cookie_name=$TEST\; path=$cpath\; expires=$gmt\n";print "Content-type: image/gif\n\n";
open(IMAGE, 'sample.gif') or die;
binmode(IMAGE);
binmode(STDOUT);
print <IMAGE>;exit;
この方法を使うとクロスドメインでCookieが書き込めますが、iPhoneのブラウザ等では、デフォルトのCookie設定が厳し目なので処理が無視されたり、エラー表示されます。
また殆どのブラウザーでhttpとhttpsが混在するクロスドメインCookieは、書き込みできません、またはセキリティー関係の警告が表示されてしまいます。
Cookieテンコ盛り
ブラウザによって異なりますが、Cookieを保存できる最大数は大よそ300個程度です。
最近は、1時間ネットサーフィンをしただけで100個以上のクッキーが書き込まれることも珍しくありません。
その殆どが広告関連のクッキーです。
ユーザーがどのようなサイトを見ていてどのようなキーワードで検索しているか?などを解析してよりクリックされやすい広告を表示する、いわゆるパーソナライズド広告です。
また品の悪いサイトでは、クッキーファイルその物に「ユーザー情報」を平文で書き込んでいたりします。
ユーザーが分からない(気付かない)部分なので何でもアリの様相です。
個人的には、検索ランキングへのシグナルとして導入して欲しいと思う訳です。
googleも検索やGmailなど各所でクッキーを使っていますが、googleではきちんとCookieの取り扱いについてのポリシーを明示しているんですよね。
さすが、と思います。