- SPAとSSRではキャッシュ戦略が根本から変わる
- まずHTTPキャッシュの基本
- SPAでキャッシュするもの
- SSRでキャッシュするもの
- なぜ同じ設定が使えないのか
- APIキャッシュの扱いも変わる
- よくあるトラブル
- キャッシュ設計の考え方
- 実務での注意点
- 最後に
SPAとSSRではキャッシュ戦略が根本から変わる
SPAとSSRの違いは描画方法やSEOだけではありません。実務で最も影響が大きいのはHTTPキャッシュ戦略です。ここを理解せずにCDNを導入すると、「キャッシュしているのに速くならない」「ログインが壊れる」「古いデータが表示される」といった問題が発生します。
結論から言うと、SPAとSSRは「何を成果物として配布しているか」が違います。SPAはアプリケーションコードを配布し、SSRはページそのものを配布します。この違いがキャッシュ設計を完全に変えます。
まずHTTPキャッシュの基本
HTTPキャッシュはレスポンス単位で保存されます。ブラウザやCDNは、次のヘッダに従って再利用します。
Cache-Control: max-age=3600 ETag: "abc123"
つまり、キャッシュの単位は「ファイル」です。問題は、SPAとSSRではキャッシュすべきファイルが異なる点です。
SPAでキャッシュするもの
SPAの最も重要な配布物はJavaScriptです。
- bundle.js
- vendor.js
- style.css
これらはユーザごとに内容が変わりません。そのため長期間キャッシュが可能です。
Cache-Control: public, max-age=31536000, immutable
ここで重要なのは、SPAのHTMLはキャッシュ対象ではない点です。index.htmlはアプリケーションの起動スクリプトに過ぎず、内容が更新される可能性があります。長期キャッシュすると新バージョンが反映されません。
そのためSPAでは次のような設定になります。
| ファイル | キャッシュ |
| index.html | 短時間またはno-cache |
| JS/CSS | 長期キャッシュ |
| APIレスポンス | ケース依存 |
つまりSPAのキャッシュ戦略はアプリ配布最適化です。
SSRでキャッシュするもの
SSRではHTML自体が成果物です。
<h1>商品ページ</h1> <p>価格: 3000円</p>
このHTMLはページごとに異なります。しかし内容が頻繁に変わらない場合、CDNにキャッシュできます。ここがSPAとの最大の違いです。
Cache-Control: public, s-maxage=600
CDNはこのHTMLを保存し、次回リクエストに即返します。サーバ処理をスキップできるため、TTFBが大幅に改善します。
つまりSSRのキャッシュ戦略はページ配信最適化です。
なぜ同じ設定が使えないのか
SPAの設定をSSRに適用すると、ログイン状態が混ざる事故が起きます。
例:
ユーザAのマイページHTMLがCDNに保存 → ユーザBへ配信
これはキャッシュ境界を誤ったためです。SSRでは「ユーザごとに変わるページ」をキャッシュしてはいけません。
逆にSSRの設定をSPAに適用すると、毎回JSが再ダウンロードされます。結果として初回表示が極端に遅くなります。
APIキャッシュの扱いも変わる
SPAではAPIが主役です。画面表示はAPIレスポンスに依存します。そのためAPIキャッシュが重要になります。
Cache-Control: private, max-age=60
ブラウザキャッシュを活用し、再取得を減らします。
一方SSRでは、API結果はサーバ内処理の一部です。ユーザはAPIを直接取得しません。したがって、APIキャッシュよりHTMLキャッシュの方が効果的になります。
よくあるトラブル
- CDN導入したのにSPAが速くならない
- SSRでログインが壊れる
- 更新した記事が表示されない
これらの原因はほぼキャッシュ戦略の不一致です。
キャッシュ設計の考え方
SPA:
「同じアプリを多人数に配布」
SSR:
「異なるページを高速配信」
この前提を混同すると設計が破綻します。
実務での注意点
SSRではキャッシュキーが重要になります。
- Cookie有無
- 認証状態
- 言語
- デバイス
これらを考慮しないと、別ユーザの内容が表示される可能性があります。
またSPAでは、バージョン管理(ハッシュ付きファイル名)が必須です。
app.3f2a9c.js
これにより長期キャッシュしても安全に更新できます。
最後に
SPAとSSRの違いはUI技術ではなく配布戦略です。SPAは「アプリケーションの配布」、SSRは「ページの配信」です。HTTPキャッシュは配布物に合わせて設計しなければなりません。
高速化のためにCDNを入れる前に、何をキャッシュしたいのかを決める必要があります。キャッシュは設定項目ではなく、アーキテクチャの一部です。ここを最初に設計すると、パフォーマンス問題の多くは未然に防げます。