「送っていない」と言い切るために、同意まで読み込まないことにした
クッキーの同意を取る仕組みを入れました。作りながら一番考えたのは、見た目や文言ではなく、「同意していない状態」をどう表すかでした。
止める対象の数え方、旗を立てる方式と読み込まない方式の違い、JavaScriptが無い環境の扱い、そして同意の記録に版を持たせた理由です。法律の解釈ではなく、作りの話です。
止める対象を、先に数えた
最初にやったのは、ページを開いたときに外部へ通信するものを数えることでした。
| 送り先 | いつ通信するか | 同意の対象か |
|---|---|---|
| タグマネージャー(解析) | ページを開いた瞬間 | 対象 |
| アフィリエイトのリンク先 | 押して移動したときだけ | 対象外 |
| 問い合わせの送信先 | 送信ボタンを押したときだけ | 対象外 |
| 書体 | 自前で配信しているので通信しない | 対象外 |
結果、止める必要があるのは1つだけでした。読了状態と画面の明暗もブラウザに保存していますが、こちらはサイトの中で完結していて外部へは出ません。
同意の画面に細かい分類を並べたくなりますが、実際には止まらないものを並べても、選ぶ手間が増えるだけです。
読んでいる途中で急に出てくる画面なので、そこに置いた選択肢の数がそのまま負担になります。数えた結果が1つなら、1つだけ出すのが正しい。
旗を立てるか、読み込まないか
同意していない状態の表し方には、大きく2通りあります。
ひとつは、タグを先に読み込んでおいて「送ってよいか」の旗だけを切り替えるやり方。もうひとつは、同意までそもそも読み込まないやり方です。
| 旗を切り替える | 読み込まない | |
|---|---|---|
| 同意前のブラウザ | タグ本体は届いている | 何も届いていない |
| 送る・送らないの判断 | 相手側の設定にもある | こちらのコードだけで決まる |
| 確かめ方 | 設定を含めて追う必要がある | 通信が0件かを見れば済む |
| 同意しなかった人の数字 | 推定として残ることがある | 残らない |
後者を選びました。
確かめたいのは「同意前は何も送っていない」ことです。
旗を切り替える方式では、タグ本体は相手のブラウザに届いています。何を送るかの判断が相手側の設定に移るので、こちらのコードを最後まで読んでも、送っていないと言い切れません。設定画面まで含めて追う必要が出ます。
読み込まなければ、通信が起きる余地そのものがありません。開発者ツールで通信の一覧を見て0件なら、それが答えになります。実際に本番で測って、同意前は0件、「同意する」を押した瞬間に読み込まれることを確認しました。
代償として、同意しなかった人の分は数字に出ません。これは正しく「同意しなかった人がいる」という事実なので、受け入れています。
JavaScriptが無い環境をどうするか
タグマネージャーには、JavaScriptが無効な環境向けにnoscriptで画像枠を置く決まりがあります。これを外しました。
同意はブラウザに保存した記録を読んで判断しています。JavaScriptが動かない環境では、その記録を読むことも、同意をたずねることもできません。それでもnoscriptの中身だけは動きます。
置いたままにすると、同意を確かめられない人にだけ、確かめずに送ることになります。分からないときに送らない側へ倒すのがこの仕組みの前提なので、ここでも送らないほうを選びました。
バナーは操作を止めていない
画面の中央に出して、選ぶまで先へ進めなくする作り方もあります。採らなかったのは、止める必要が無いからです。
先に読み込みを止めてあるので、答えないまま読み進めても何も送られません。止めなければ計測が始められない作りなら、選ばせるまで通さない意味があります。先に止めてあるなら、たずねるほうは静かでよいはずです。
ボタンは2つとも同じ大きさにしました。片方を小さくしたりリンクのように見せたりすると、選べるように見せかけて実際には選びにくい形になります。
同意の記録に版を持たせた
保存している記録には、選択と日時のほかに版の番号を入れています。何に同意を求めるかが変わったら、この数字を上げます。版が違う記録は「まだ答えていない」として扱い、もう一度たずねます。
同意は「そのとき説明されたものに対して」もらっています。あとから送信先を足したときに古い同意を流用すると、その人が知らない相手へ黙って送り始めることになります。聞き直す手間より、そちらのほうが問題が大きいと考えました。
今回の学び
まず、選択肢の数は、数えてから決めること。分類を先に用意すると、実際には止まらないものまで並びます。外部へ通信するものを数えたら1つだったので、聞くことも1つになりました。
次に、「していない」を証明できる形にしておくこと。旗を切り替える方式でも、実際には送られません。ただし、送っていないことをこちらのコードだけで示せません。同じ結果でも、確かめられるかどうかは別の性質です。
そして、分からないときにどちらへ倒すかを、先に決めておくこと。JavaScriptが無い環境では同意を確かめられません。そのときに送るのか送らないのかは、個別に迷うと毎回違う結論になります。「分からないなら送らない」と決めておけば、判断が要らなくなります。
関連記事

ソース解説(3) 旗を折るのではなく、読み込まない
クッキー同意のバナーは、置くこと自体は難しくありません。難しいのは、「同意していない人には何も送っていない」と自分で言い切れる形にすることでした。 今回はその部分のコードを読んでいきます。保存する形、版番号を持たせた理由 […]

GTMの設定は誰でも読める
コンテナIDをURLに打ち込むと、どんなタグがどんな条件で発火するかが誰でも読める。これは不具合ではなく、そうでなければ動かない仕組み。ブラウザで動くものに秘密は持てないという前提と、そこから導かれる「書いてはいけないもの」の話。

「読み終えた」をどう数えるか
GA4にはスクロール距離の計測が最初からある。それでも使わなかった。スクロール率が測っているのは「画面が下まで移動したか」であって、「読み終えたか」ではないから。サイトにすでにある読了状態を使って、未読から読了に変わった瞬間だけを送るまでの記録。