adtech周辺に興味がある人の四方山話

adtech, marketing, data analysis, etc...

CookieSyncを試してみる

ここまでDMPに関して、特にデータの収集面に関しての概要をまとめてきました。

ここまで来るとだんだん自分でも実装したくなってきます。実装方法は色々あるとは思いますが、CookieSyncを実際に試してみたいと思ったので、ものすごくシンプルな構成でCookieSyncを実装してみました。

構成とシナリオ

構成というほど大したものでは無いですが、以下の構成及びユーザーの動きを想定しました。

構成

  • siteA:DMPとCookieSyncを行いたいWebサイト
  • ユーザー
  • DMP:siteAのCookieSync相手

シナリオ

  1. siteAにはCookieSync用の1x1pixelの画像を仕込む
  2. ユーザーがsiteAに来訪
  3. ユーザーにはsiteAのCookieがセットされる
  4. siteAからDMPに画像のリクエスト
  5. DMP側ではリクエストからsiteAのCookieIDを取得してユーザーにDMP側のCookieを発行しつつ、1x1の画像を返す

siteA側

  • cidというCookieでユーザーにIDを振る(1000までの乱数)
  • DMP.comに対して、/DMP/${cid}.gifという画像をリクエスト
  • echoしてる部分はCookieの状態を見るためだけなので適宜無視してください
siteAのページ (index.php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
if(!isset($_COOKIE["cid"])) {
        echo "このサイトのCookieを保有していない<br /><br />";
        echo "Cookieの生成<br />";
        $cid = mt_rand(1,1000);
        setcookie("cid", $cid);
        echo "保有しているCookie : cid = " . $cid . "<br /><br />";

        echo "DMP用のクエリストリング生成<br />";
        $query_string = $cid;
        echo "生成されたクエリストリング : " . $query_string;
} else {
        echo "このサイトのCookieを保有している<br />";
        echo "保有しているCookie : cid = " . $_COOKIE["cid"] . "<br /><br />";

        echo "DMP用のクエリストリング生成<br />";
        $query_string = $_COOKIE["cid"];
        echo "生成されたクエリストリング : " . $query_string;
}

?>

<!DOCTYPE html>
<html>

<head>
<meta charset="UTF-8">
<title>Cookie Syncのテスト</title>
</head>

<body>
        <h1>Cookie Syncのテスト</h1>

        <p>1x1ピクセルのダミー画像を呼ぶ例
     <img src="http://DMP.com/DMP/<?php echo htmlspecialchars($query_string, ENT_NOQUOTES, 'utf-8') ?>.gif" alt="" width="1" heigth="1"></p>
</body>

</html>

DMP側

単純にphpに対してクエリストリング付与して呼び出したり、画像にクエリストリング付与して呼び出すのでもいいのですが、それっぽい感じにするために.htaccessを使います。

  • /DMP/にて展開しています
  • 画像の置いているディレクトリに.htaccess設置
  • 同じ階層に1x1.phpという画像を返すphpを設置
  • ${cid}.gifへのリクエストを1x1.php?cid=${cid}にRewrite
  • 1x1.phpでは、DMPのCookieの発行(dmpid:1000までの乱数)と、クエリストリングを受け取りマッチング処理
.htaccess
1
2
3
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)\.gif$ /DMP/1x1.php?cid=$1
${cid}.gifによって実行されるphpプログラム(1x1.php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
// まだDMP側のIDが振られていないユーザーにCookieを発行
if (!isset($_COOKIE["dmpid"])) {
        $dmpid = mt_rand(1, 1000);
        setcookie("dmpid", $dmpid);
}

// ここでcidとdmpidをマッチングする処理
// if (isset($_COOKIE["cid"])) {
//      hogehoge;
// }
// DBに格納するとか

// 1x1pixelの画像としてのレスポンスを返す
header('Content-Type: image/gif');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Pragma: no-cache');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
echo base64_decode('R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==');
?>

実際に動かしてみる

VM2台立ち上げて実験してみました。

  • 192.168.80.140 : siteA
  • 192.168.80.142 : DMP

に対応しています。

CookieSync前

  • 前の処理のCookieIDが画面には残っていますが、ブラウザはCookieを所有していません。

CookieSync後

  • siteA(192.168.80.140, cid)とDMP(192.168.80.142, dmpid)の双方のCookie情報がブラウザに存在していることが確認できます。
  • DMP側にはcidとdmpidの双方が渡っています。dmpidを持ってCookieSyncを行なってきたユーザーは特定済みなので、その他の提携サイトからdmpidが振られているユーザーが訪れることで、データのカバー率がどんどん向上していきます。

まとめ

非常にシンプルな形ですが、CookieSyncが実現できることを確認しました。実際は大量のリクエストを捌くためのサーバーチューニングや、データの保持に関するアーキテクチャの検討が必要だと思いますが、とりあえず1x1ピクセルの画像を利用すればいいということの確認ができました。

実利用にはJavascriptのタグを置く形で実現することが多いと思いますが、こちらもまた別の機会に試してみたいと思います。

というわけで、しばらく重めの話が続いたので、少し軽めのお話でした。

参考

以下のサイトを参考にしました。