ブログに戻る

402 Payment Required の再来:HTTP ステータスコードが語るボットトラフィックの正体

HTTP ステータスコードには、ほとんどのアナリティクスツールが活用しきれていないシグナルが含まれています。サーバーサイドでのステータス解析が、誰も追跡することなく人間とボットをどう見分けるかを解説します。

ウェブアナリティクスの判断の多くは、ページが読み込まれ JavaScript が実行された後、クライアント側で行われます。このモデルは、サーバーに届くすべてのリクエストがカウントに値するという前提を暗黙のうちに置いています。しかしそれは間違いです。生のトラフィックの大部分は何もレンダリングせず、人間に属することもなく、そもそもダッシュボードに届くべきではありません。それをフィルタリングするための最も明確で、しかも最も早い段階で得られるシグナルは、すでにすべてのリクエストで生成しているものです。HTTP ステータスコードです。

ステータスコードは第一級のアナリティクスシグナルである

HTTP セマンティクス仕様(RFC 9110)は、ステータスコードをリクエストの結果を表す 3 桁の整数として定義し、5 つのクラスにグループ化しています。1xx 情報、2xx 成功、3xx リダイレクト、4xx クライアントエラー、5xx サーバーエラーです。Monoid は Cloudflare のエッジ上で動作しているため、クライアント側のスクリプトが実行される前に、オリジン(あるいはエッジ自体)が返すステータスコードを目にします。この順序が重要です。ブラウザーのビーコンによって記録されるページビューは、そもそもドキュメントが実際に 2xx で配信されパースされた場合にしか存在しえません。しかしリクエストストリームには、成功したドキュメントよりはるかに多くのものが含まれています。

典型的なオリジンが 1 日を通じて返すものを考えてみましょう。成功した HTML ドキュメント、条件付きリクエストに対する 304 Not Modified 応答、正規化による 301/308 リダイレクト、探索してくるスキャナーによる 404、そしてインシデント時の 5xx のバーストです。成功裏にレンダリングされたドキュメントだけをカウントし、それ以外を無視することは、トラフィック曲線の異常を説明する文脈を捨ててしまうことになります。

ボットはステータス分布のどこに隠れているか

自動化されたクライアントはブラウザーとは異なる振る舞いをし、ステータスコードはその違いを安価に露呈させます。脆弱性スキャナーは、管理パネルや既知の CMS パスを探るなかで、404 と 403 の密なクラスターを生み出します。攻撃的なクローラーは、RFC 6585 でレート制限に対する応答として定義されている 429 Too Many Requests を無視して叩き続け、人間のセッションでは決して生まれないシグネチャを作り出します。ナイーブなスクレイパーは、本物のブラウザーであれば bfcache や履歴によって短絡するはずのリダイレクトチェーンを、律儀に辿ってしまうことがよくあります。

ここで示唆に富むのが 402 Payment Required コードです。RFC 9110 はこれを将来の利用のために予約されており標準化された意味論を持たないと明記していますが、最近では従量制の API やエージェントアクセスをめぐって改めて注目を集めています。もしあなたのオリジンが 402 を返し始めたら、そのトラフィックはほぼ確実にプログラムによるものであり、人間が閲覧しているわけではありません。ステータスを意識したパイプラインであれば、指標を静かに水増しするのではなく、それに応じたタグ付けができます。

クライアントサイドのみのアナリティクスがここで見誤る理由

JavaScript のみに依存するツールは、こうしたことの大半を文字通り観測できません。リクエストが 403 を返せば、アナリティクススクリプトは一切実行されず、イベントは見えなくなります——しかしインフラへの負荷は実在するものであり、その背後にある意図(偵察、クレデンシャルスタッフィング、スクレイピング)こそ、本来知りたいことである場合が多いのです。逆に、ステータスで区別せずサーバーログの行数を数えるツールは過大report となり、あらゆる 301 のホップやあらゆる 404 の探索を「ヒット」として扱ってしまいます。

有用な折衷案は、エッジレベルでのステータス分類を、プライバシー・ファーストなカウントモデルに供給することです。

  • 実際のナビゲーションを伴う 2xx text/html はページビューの候補である。
  • 3xx は遷移先に帰属させるべきであり、二重にカウントしてはならない。
  • 4xx は診断情報であってオーディエンスではない——別枠で可視化する。
  • 5xx は信頼性パネルに属し、成功したビューの落ち込みと相関させる。

誰も追跡せずにこれを行う

これらはいずれも訪問者を識別する必要がありません。ステータスコード、メソッド、レスポンスクラス、そして粗い時刻は、リクエストとレスポンスのやり取りの性質であって、人物の性質ではありません。Monoid は Cookie を設定せず、localStorage を読み取らず、デバイスのフィンガープリンティングも行いません。UTC 03:00 に発生した 429 のバーストが、オーディエンスではなく自動化によるものだと知るのに、安定した識別子は必要ありません——ステータス分布そのものがそれを物語っています。これはデータ最小化が私たちに有利に働いている例です。最も個人的でないシグナルが、トラフィック品質にとって最も正直なシグナルの一つでもあるのです。

コンプライアンス上のメリットもあります。エッジで非人間トラフィックをフィルタリングすることは、そもそもアナリティクスストアに入る不正な イベントが減ることを意味し、記録されるデータをその明示された目的により厳密に沿ったものに保ちます。GDPR の保存制限および目的制限の原則(第 5 条 1 項 (c) および (e))のもとでは、ゴミデータを収集してから後で捨てるよりも、そもそも収集しないほうが厳密に優れています。

実務上の要点

アナリティクスを構築または評価する際には、3 つの問いを立ててみてください。ステータスコードを見ているか、それともレンダリングされたドキュメントしか見ていないか。信頼性のシグナル(5xx)とオーディエンスのシグナル(2xx)を分離しているか。そして識別子なしでボットフィルタリングを実現できているか。この 3 つすべてに「はい」と答えられるパイプラインは、よりクリーンな数値と、より小さなプライバシー・サーフェスを同時にもたらします——今回ばかりは、それが同じ一つの決定なのです。

出典

Comments

Loading comments…