1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

安全に開発をするための「キャッシュ」と「Cookie」戦略入門

Posted at

Webアプリを作るとき、画面の表示を速くしたり、ログイン状態を保ったりするために
「キャッシュ」や「Cookie」を使うことが多いと思います。

しかし、この2つを間違った設定で使うと、
「他の人に自分の情報が見えてしまう」「勝手にログインされた」
といった重大なセキュリティ事故につながります。

1. キャッシュとCookieの役割の違い

まずはキャッシュとCookieの違いを確認しておきます。

主な役割 保存場所 危険になるケース
キャッシュ 一度取得したデータを再利用して、表示を速くする ブラウザ、アプリ、CDNなど 機密情報をキャッシュしてしまう
Cookie ユーザーを識別するための小さなデータ(ログイン情報など) ブラウザ 他人にCookieを盗まれる、意図しない送信

端的に言うと、

  • キャッシュは「速さ」のための仕組み
  • Cookieは「あなたが誰か」を示す仕組み

この2つは混同されがちですが、同じ感覚で使うとセキュリティ上の問題が起こりやすくなります。

2. キャッシュの安全な使い方

キャッシュはとても便利ですが、どの情報をキャッシュしていいかが明確でないと危険です。

(1)キャッシュしていい情報・してはいけない情報

キャッシュしてもよい?
公開情報 ⭕️ トップページ、商品一覧、画像など
個人情報 マイページ、購入履歴、会員情報など
認証が必要なページ ログイン後のダッシュボードなど

(2)キャッシュを制御するヘッダ

サーバーはレスポンスに「Cache-Control」というヘッダをつけて、
「このデータをキャッシュしていいか」「どれくらい保存していいか」を指定します。

設定例 意味 使う場面
Cache-Control: no-store, private 一切キャッシュしてはいけない ログイン後ページ、個人情報ページ
Cache-Control: public, max-age=300 5分間キャッシュしてよい 公開データやニュース一覧など
Cache-Control: public, max-age=31536000, immutable 1年間キャッシュしてよい(変更されない) 画像、CSS、JavaScriptなど

ちなみに...

no-cache という設定は「保存禁止」ではなく、「保存してもいいが、使う前に必ず確認する」という場合に使用します。
保存自体を禁止したい場合は no-store を使います。


(3)ログアウト時のキャッシュ削除

ログアウトした後に、ブラウザの戻るボタンを押したら
「まだマイページが見えてしまう」という経験はありませんか?

これは、ブラウザが古いページをキャッシュから表示している影響です。
これを防ぐために、以下のようなヘッダを返すことで
キャッシュやCookieを強制的に削除できます。

Clear-Site-Data: "cache","cookies","storage"

3. Cookieの安全な使い方

Cookieは「ログインしている人を区別する」「設定を保存する」ための仕組みです。
しかし、Cookieは悪意のあるサイトやスクリプトに悪用されることもあります。

(1)Cookieを安全にするための設定

設定項目 推奨設定 説明
Secure 付ける HTTPS通信のときだけCookieを送信
HttpOnly 付ける JavaScriptからアクセスできない(XSS対策)
SameSite Lax または Strict 他サイトからの送信を制限(CSRF対策)
Max-Age / Expires 短めに設定 有効期限が長すぎるとリスクが高まる

(2)SameSite の違い

他サイトから送信される? 主な用途
Strict されない セキュリティ重視のアプリ(銀行など)
Lax 通常のリンクでは送信されるが、フォーム送信では送られない 一般的なWebアプリ
None; Secure 他サイトからも送信される(ただしHTTPSのみ) シングルサインオン(SSO)など特殊用途

2025年現在、主要ブラウザではSameSiteを指定しないと自動的にLax扱いになります。
つまり、以前よりもセキュリティは強化されていますが、
外部サービスとの連携が動かなくなるケースもあります。

(3)Cookieの範囲を広げすぎない

DomainPath の設定を広げすぎると、
本来アクセスしてほしくないページからもCookieが送られることがあります。

安全のためには、以下が重要だと思います。

  • できるだけドメインやパスを限定する
  • 不要なCookieは使わない

4. キャッシュとCookieの「組み合わせ」によるトラブル

  1. ログアウト後もページが残って見える
     → キャッシュを禁止 (no-store) にしていない。
     → 対策:Cache-Control: no-store, privateClear-Site-Data

  2. 他人のセッションが見えてしまう
     → Cookieを含むレスポンスをキャッシュしてしまった。
     → 対策:Cookieを返すレスポンスは必ず private または no-store

  3. 外部サービスの連携が動かない
     → SameSite=Lax でCookieが送られない。
     → 対策:安全なHTTPS通信で SameSite=None; Secure を指定。

5. 安全な設定の組み合わせ例

ログインがあるWebアプリ

設定
Cookie Secure; HttpOnly; SameSite=Lax; Path=/; Max-Age=3600
ページのキャッシュ Cache-Control: no-store, private
静的ファイル Cache-Control: public, max-age=31536000, immutable
ログアウト時 Clear-Site-Data: "cache","cookies","storage"

一般的な公開サイト(ログインなし)

設定
Cookie 基本的に不要
ページのキャッシュ Cache-Control: public, max-age=60
画像・JS Cache-Control: public, max-age=31536000, immutable

6. チェックリスト

  • 認証が必要なページには Cache-Control: no-store を設定しているか

  • Cookie に SecureHttpOnly がついているか

  • SameSite の設定を意識して選んでいるか

  • ログアウト時にキャッシュやCookieが残っていないか

  • CDN(キャッシュサーバー)が Cookie を含むレスポンスを保存していないか

7. まとめ

キャッシュとCookieは、アプリの使いやすさや速度を高めるために欠かせません。
「速いけれど安全ではない」ではなく「速くて安全なアプリ」を開発するためには、
次の3つを意識する必要があります。

  1. キャッシュしていい情報と、してはいけない情報を分ける

  2. Cookieには常に安全属性(Secure, HttpOnly, SameSite)をつける

  3. ログアウトや権限変更時にはキャッシュを消す

採用情報

アシストエンジニアリングでは一緒に働くフロントエンド、バックエンドエンジニアを募集しています!
少しでも興味のある方は、カジュアル面談からでもお気軽にお話ししましょう!

お問い合わせはこちらから↓
https://official.assisteng.co.jp/contact/

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?