CDNのキャッシュ事故:他人の個人情報を全ユーザーへ配信したキャッシュキー設計の悲劇

Tech & Logic
スポンサーリンク

「CDN(Contents Delivery Network)を入れれば、サイトの表示速度が劇的に上がりますよ」

インフラの基礎もキャッシュの力学も理解していない人間が、マネジメント層やクライアントにこう囁く瞬間ほど恐ろしいものはない。

CDNは、世界中に分散配置されたエッジサーバから静的コンテンツを高速配信するための強力な武器だ。だが、それは「正しく設定できれば」の話である。

配信が速くなるという耳ざわりの良い理由だけで、AWS CloudFrontやCloudflareのコンソール画面をポチポチいじり、デフォルト設定のまま本番稼働させる。その愚行の先に待っているのは、サイトの高速化ではない。「ログインしたAさんの個人情報が、赤の他人であるBさん、Cさん、果ては全アクセス者にキャッシュとして配信され続ける」という、悪夢のような即死事故だ。

実際に目撃した惨劇:マイページが全世界へキャッシュされた日

私が現場で実際に目撃した、ある企業のやらかしは今でも背筋が凍る。

そのWebサービスは、セール開始時のアクセス集中に耐えかね、急遽CDNを導入した。知識の浅いエンジニアが「とにかく全体をキャッシュしてオリジンサーバの負荷を下げよう」と、パスの除外設定もCookieの扱いも精査せず、雑なキャッシュルールを適用してしまったのだ。

結果、何が起きたか。

ログイン後の「マイページ」や「カート画面」のHTMLまでが、エッジサーバにガッツリとキャッシュされた。あるユーザーがログインしてマイページを開いた瞬間、そのレスポンス(氏名、住所、電話番号、注文履歴が記載された画面)がCDNのキャッシュに保持され、その後にアクセスしてきた無関係な別ユーザー全員の画面に「見知らぬ他人のマイページ」として表示され続けたのだ。

問い合わせ窓口には「他人の名前と住所が表示されている」という悲鳴が殺到し、SNSは炎上。現場は阿鼻叫喚の地獄絵図と化した。

キャッシュキーの設計を怠り、Set-Cookie や Authorization ヘッダーを考慮せず、パーソナライズされた動的レスポンスを静的ファイルと同じノリでキャッシュさせた。ただそれだけの初歩的なミスで、企業としての社会的信用が一瞬で吹き飛んだのだ。

前任者のやらかしの後任となり、DNSから説明させられた後始末の地獄

この手の阿呆なやらかしをする輩がいると、その現場には「CDN=触れてはならない呪いの技術」という強烈なトラウマが植え付けられる。

実際、私が別のプロジェクトでサイト高速化を担当することになった際、まさにそのやらかしをかました「前任者の後任」として現場に放り込まれ、この悪夢のとばっちりを真正面から食らうことになった。

ボトルネックを調査し、「静的アセット(画像、CSS、JS)をCDNにオフロードすれば確実に劇的なパフォーマンス改善ができる」と論理的に提案した。しかし、クライアントの役員陣は顔を青ざめさせ、頑として首を縦に振らない。

「前任者がCDNを入れて他人の個人情報が漏洩した大事故があった。うちは絶対にCDNなんて危険なものは二度と使わない」

彼らにとってCDNは高速化ツールではなく、「個人情報を全世界へばら撒く時限爆弾」に見えていたのだ。

そこからが死ぬほど大変だった。

そもそもトラフィックのログを解析してみれば、ユーザーの大半がスマートフォンからのアクセスであるにもかかわらず、IPv6すら導入されていない化石のようなネットワーク構成だった。CDN云々を議論する以前の段階で、DNSの仕組みすら誰も理解していない。

「なぜIPv4だけでは遅いのか」「AレコードとAAAAレコードの違い」「CNAMEとエイリアスレコードの役割」といった、インフラの基礎講義をDNSの設定レベルから手取り足取り説明させられるハメになった。

  • なぜ前任者の事故が起きたのか(動的コンテンツと静的コンテンツの振り分けミス、キャッシュキーの設計不備)
  • 静的アセットの拡張子(.jpg, .png, .css, .js)に限定したパスベースのキャッシュ設計
  • Cache-Control: private, no-store の厳密なヘッダー制御
  • オリジン側でのセッション管理とCDNの完全な分離

小学生でも分かるレベルまで仕組みを解体し、安全性を保証するアーキテクチャ図を書き、ステージング環境で徹底的な検証を見せて、何週間もかけて説得を重ねた。最終的には無事にCDNを導入し、サーバ負荷を激減させながらサイト表示速度の大幅な改善に成功したが、無知な前任者がばら撒いた恐怖と技術負債の後始末ほど無駄で骨の折れる仕事はない。

キャッシュ事故の恐怖:消えるまでに「最低10分」、昔なら「半日」

CDNによる事故が他のバグと決定的に違うのは、「ミスに気づいても、すぐには元に戻せない」という点だ。

通常のアプリアプリのバグであれば、コードをロールバックしてデプロイし直せば、その瞬間に修正が全ユーザーに反映される。しかし、世界中のエッジサーバにばら撒かれたキャッシュはそうはいかない。

一度エッジに保存されたキャッシュは、設定されたTTL(Time To Live)が切れるまで居座り続ける。慌ててインバリデーション(キャッシュクリア)を実行しても、世界中のエッジサーバに行き渡って完全に消去されるまでにはタイムラグが発生する。

今でこそ数分〜10分程度でクリアできるようになったが、昔のCDNであればキャッシュパージに半日以上かかることもザラだった。その間、他人の個人情報や不具合画面が全世界へ配信され続けるのを、指をくわえて見ているしかないのだ。

「間違えたら消せばいい」というアプリエンジニアの甘えた感覚は、CDNの前では一切通用しない。

AWSの画面が簡単だからと手を出すな:インフラを舐めるな、勉強しろ

昨今のクラウドサービスはあまりに便利になりすぎた。

AWS CloudFrontであれCloudflareであれ、管理画面(マネジメントコンソール)を開けば、マウスを数回クリックするだけで誰でも数分でCDNが組めてしまう。

だが、設定画面が簡単であることと、その背後にある技術が簡単であることは全くの別物だ。

  • HTTPヘッダー(Cache-Control, Vary, Pragma)の挙動を完全に理解しているか?
  • キャッシュキーに何を含めるべきか(クエリパラメータ、ヘッダー、Cookie)を精査したか?
  • オリジンが返すステータスコード(4xxや5xx)が予期せずキャッシュされるリスクを考慮したか?

「アプリのコードしか書けません」「インフラはよく分かりませんが、画面が分かりやすかったのでポチポチ設定しました」という人間がCDNに手を出すのは、目隠しをして時速100キロで高速道路を逆走するのと同じだ。

CDNは、正しく扱えばトラフィックを捌く最強の防壁になるが、無知な人間が扱えば自爆用の起爆装置になる。


画面のお手軽さに騙されるな。インフラと通信プロトコルを舐めるな。DNSのレコード設定から裏側のキャッシュ力学まで徹底的に勉強してから触れ。それができないなら、最初からCDNに指一本触れるべきではない。

タイトルとURLをコピーしました