Cloudflareに個人情報はキャッシュされる?安全性を解説

Cloudflareを導入しようと考えたとき、こんな不安をよく聞きます。

「個人情報がCloudflareにキャッシュされて、他の人に見られたりしないだろうか?」 「Cloudflareを通すと、ログイン情報やクレジットカード番号が保存されてしまうのでは?」

この記事では、こうした不安について、Cloudflareのキャッシュの仕組みをもとに、解説します。

結論:基本的にキャッシュされない

結論から言うと、個人情報は基本的にはキャッシュされません。安心してください!

Cloudflareはデフォルトで、静的ファイル(画像やCSSなど)だけをキャッシュする設定になっています。
HTMLページは、デフォルトではキャッシュ対象外です。

ただし、設定次第では事故になる可能性があるので、最後まで読んでください。

なぜ個人情報は基本的にキャッシュされないのか

Cloudflareのデフォルト動作

Cloudflareは「拡張子ベース」でキャッシュするかどうかを判断しています。

キャッシュされる拡張子(デフォルト):

  • 画像: .jpg, .png, .gif, .webp, .svg など
  • スタイル: .css
  • スクリプト: .js
  • フォント: .woff, .woff2, .ttf など
  • その他の静的ファイル

キャッシュされない:

  • HTMLページ(.htmlや拡張子なしのURL)
  • APIレスポンス(.jsonなど、デフォルトでは対象外)

つまり、通常のHTMLページはもちろん、ログインページやマイページのような「ユーザーごとに内容が変わるHTMLページ」も、特別な設定をしなければキャッシュされないのです。

オリジンサーバーの設定が最優先

さらに重要なのが、オリジンサーバー(あなたのWebサーバー)の指示が尊重されるという点です。

Webサーバーは、レスポンスにCache-Controlヘッダーをつけることで、「このページはキャッシュしないでほしい」という指示を出すことができます。

Cloudflareは基本的にこのCache-Controlヘッダーを尊重するので、オリジンサーバーが「キャッシュしないで」と言っていれば、キャッシュしません。
元々のウェブサーバのポリシーがあって設計されているサイトを、後から入ったCloudflareが無視してしまう、こんなことをすれば事故が起きてもおかしくないわけですから、 Cloudflareはそういう事故がないようにオリジンを尊重にしているのです。

実際にキャッシュされるもの・されないもの

具体例で見てみましょう。

キャッシュされないもの

  • https://example.com/ (トップページのHTML)
  • https://example.com/login (ログインページ)
  • https://example.com/mypage (マイページ)
  • https://example.com/products (商品一覧ページのHTML)
  • https://example.com/api/user/profile (APIレスポンス)

これらはHTMLや動的コンテンツなので、デフォルトではキャッシュされません。

キャッシュされるもの

  • https://example.com/images/logo.png (画像)
  • https://example.com/css/style.css (スタイルシート)
  • https://example.com/js/app.js (JavaScript)

これらは静的ファイルなので、キャッシュされます。ただし、これらのファイルに個人情報が含まれることは通常ありません。

注意:設定ミスで重大事故になるケース

ここまで読んで「じゃあ安心だね!」と思われたかもしれませんが、油断は禁物です。

設定を間違えると、個人情報が他のユーザーに見えてしまうという重大なセキュリティ事故につながります。

実際に起きた事例:メルカリの個人情報流出事故

2017年、メルカリでCDN(Cloudflareではありませんが)の切り替え作業中に個人情報流出事故が発生しました。

何が起きたのか:

  • 本来キャッシュすべきでない動的なHTMLページがキャッシュされてしまった
  • Aさんがアクセスしたマイページの内容が、Bさんにも表示されてしまった
  • 約5,000件の個人情報が流出

原因:

  • 切り替え前のCDNでは、CDNの設定で「全くキャッシュしない」ようにしていた
  • 切り替え後のCDNでは、Cache-Controlヘッダーでキャッシュを制御する方式だった
  • しかし、Webサーバー側に適切なCache-Controlヘッダーが設定されていなかった
  • 結果、動的ページがキャッシュされてしまった

参考: CDN切り替え作業における、Web版メルカリの個人情報流出の原因につきまして

同じURLで違う内容を返すページの危険性

以下のようなページは、絶対にキャッシュしてはいけません:

①プロフィールページ(HTML)

https://example.com/profile

→ ユーザーAとユーザーBでは内容が全く異なる

②APIレスポンス(JSON)

https://example.com/api/user/me

→ ログインユーザーによって返すデータが異なる

③ユーザーごとに異なる画像

https://example.com/profile/avatar.jpg

→ 同じURLでも、ユーザーによって異なる画像が返される場合

これらをキャッシュしてしまうと、「Aさんの個人情報がキャッシュされて、Bさんに表示される」という事故が起きます。

開発者・サイト運営者が気をつけること

では、こうした事故を防ぐために、何に気をつければいいのでしょうか?

1. HTMLを無理にキャッシュしようとしない

「サイトを高速化したい!」という気持ちはわかりますが、動的なHTMLページを無理にキャッシュするのは危険です。

どうしてもHTMLをキャッシュしたい場合は:

  • 完全に静的なページ(問い合わせページ、会社概要など)だけに限定する
  • ログイン状態によって内容が変わらないページだけに限定する

2. “Cache Everything"を安易に使わない

Cloudflareには「Cache Everything」というページルールがあります。これは文字通り「すべてキャッシュする」という設定です。

この設定は便利ですが、動的なページにも適用してしまうと危険です。使う場合は、対象URLを慎重に設定しましょう。

3. 動的コンテンツには必ずCache-Controlヘッダーを設定

Webサーバー側で、個人情報を含むページには必ず以下のようなヘッダーを設定しましょう:

Cache-Control: no-store, no-cache, must-revalidate, private

これで「絶対にキャッシュしないで」という明確な指示になります。

4. テスト時は複数ユーザーでの動作確認が必須

CDNの設定を変更したら、必ず以下のテストを行いましょう:

  • ユーザーAでログインしてマイページを表示
  • 別のブラウザ(またはシークレットモード)でユーザーBとしてログイン
  • ユーザーBのマイページにユーザーAの情報が表示されないか確認

「自分のアカウントだけで動作確認」では、この種のバグは見つかりません。

まとめ

  • Cloudflareのデフォルト設定では、個人情報を含むHTMLページはキャッシュされない
  • 静的な拡張子(画像、CSS、JSなど)のみがキャッシュ対象
  • キャッシュ動作はオリジンサーバーのCache-Controlヘッダーが尊重される
  • ただし、設定ミスで重大なセキュリティ事故につながる可能性がある
  • 動的ページを無理にキャッシュしない

基本を理解して適切に設定すれば、Cloudflareは安全に使えますが安易にキャッシュ設定を変更するのは危険です。
特に、個人情報を扱うサイトでは、慎重すぎるくらい慎重に設定を行いましょう。