ウェブサイトを閲覧する時、データの読み込み速度はUXに大きく影響します。ここで重要な役割を果たすのが「ブラウザキャッシュ」です。ブラウザキャッシュは、一度訪れたウェブページのデータをブラウザに保存し、次回同じページを訪れる際に高速に読み込むことを可能にする技術です。
僕は、初心者の時にブラウザキャッシュについて何もわかっていなかったので、修正した内容が反映されなくて、一生悩んでいました。。。
同じ悩みの人がこの記事を読んで、少しでもブラウザキャッシュのことを理解してくれたら幸いです!
ブラウザキャッシュとは?
ブラウザキャッシュは、ウェブページを構成するファイル(HTML、CSS、JavaScriptファイル、画像など)をユーザーのブラウザ上に一時的に保存することです。ユーザーがウェブサイトにアクセスすると、ブラウザはまずローカルのキャッシュをチェックします。もし要求されたファイルがキャッシュ内に既に存在し、かつ最新のものであれば、サーバーから再度ダウンロードすることなく、そのファイルを直接読み込みます。これにより高速にページを表示することを可能にしています。
キャッシュ制御の仕組み
Webサーバーは、HTTPヘッダーを通じて、どのファイルをどの程度の期間キャッシュするかをブラウザに指示できます。このHTTPヘッダーには、Cache-Control
、Expires
、Last-Modified
、ETag
などがあります。
Cache-Control
このヘッダーは、ファイルがキャッシュされるべき時間や、キャッシュの挙動(public、private、no-cache、no-storeなど)を指定します。
no-store
:これは、サーバーがレスポンスをキャッシュに保存しないようにブラウザに指示します。これは、機密情報を含むページや、毎回サーバーから最新の情報を取得する必要があるページに使用されます。no-cache
:これは、サーバーがキャッシュされたコピーを使用する前に、必ずサーバーに確認するようにブラウザに指示します。つまり、キャッシュは可能ですが、使用される前には常に検証が必要です。public
:これは、レスポンスが公共のキャッシュに保存されることを許可します。これは、ログインしていないユーザー向けの一般的なコンテンツに適しています。private
:これは、レスポンスが特定のユーザーのためのものであり、個人的なキャッシュ(例えば、ユーザーのブラウザ)にのみ保存されるべきであることを意味します。max-age=<seconds>
:これは、キャッシュされたレスポンスを使用できる最大時間(秒単位)を指定します。時間が経過すると、キャッシュは古くなったと見なされ、新しいコピーが必要になります。must-revalidate
:ウェブサーバーがブラウザに対して、キャッシュされたコピーが古くなった(つまり、max-age
で指定された時間が経過した)後は、次にそのコンテンツを表示する際に、必ずサーバーとの検証を行うよう要求します。通常、キャッシュされたコンテンツは、その有効期限が切れると自動的に無視され、新たなコンテンツがサーバーから取得されます。しかし、ネットワークの接続が悪い場合やオフラインの場合など、ブラウザはしばしば古いコンテンツを表示することがあります。しかし、must-revalidate
指示がある場合、ブラウザはこの古いコンテンツを有効期限が切れた後には表示せず、代わりにサーバーに対してコンテンツの検証を試みます。もしサーバーへのアクセスが不可能な場合、ブラウザは通常、エラーを表示します。must-revalidate
はキャッシュされたデータの検証を強制することで、ユーザーが古い情報を見てしまうリスクを減らし、ウェブサイトの信頼性を高めるために使われます。これにより、ユーザー体験が向上し、データの正確性が保証されます。
Expires
ウェブページや画像などのリソースがいつまで有効であるか、つまりそのリソースの「有効期限」を示すものです。
例えば、あるウェブページの画像に対して、ウェブサーバーがExpires
ヘッダーを使用して「2024年1月1日」を有効期限として設定した場合、その画像は2024年1月1日までブラウザにキャッシュされ、その期間中にそのページを再度訪れた際には、ブラウザはサーバーから再びその画像をダウンロードすることなく、キャッシュから画像を読み込みます。上の画像のように非常に古い日付が設定されている場合、これは通常、ウェブサーバーがそのリソースを「過去に失効した」と明示的に示していることを意味します。このような設定は、リソースがブラウザにキャッシュされないようにするために意図的に行われることがあります。
Last-Modified
特定のファイルが最後に変更された日時を示します。この情報は、ブラウザがキャッシュしたコンテンツが最新のものかどうかを判断する際に使用されます。キャッシュにファイルが存在し、かつ Last-Modified
の日時が現在のサーバー上のファイルの変更日時と一致するなら、ブラウザはそのキャッシュされたファイルを使用します。
ETag
リソースの特定のバージョンを識別するための識別子で、リソースが変更されたかどうかを検証する際に使用されます。
ETagの仕組み
- ブラウザが初めてリソースをリクエストすると、ウェブサーバーはそのリソースと一緒にETagをレスポンスとして送ります。このETagは、リソースの内容から生成された一意の文字列です。
- ブラウザはリソースとETagをキャッシュに保存します。
- 次回ブラウザが同じリソースをリクエストする際、キャッシュされたETagと一緒にリクエストを送ります。
- サーバーは受け取ったETagを現在のリソースのETagと比較します。もしETagが一致する(つまり、リソースが変更されていない)場合、サーバーはステータスコード304(Not Modified)を返し、ブラウザはキャッシュされたリソースを使用します。これにより、リソースのダウンロードを回避し、読み込み時間を節約できます。
- もしETagが一致しない(リソースが更新されている)場合、サーバーは新しいリソースと新しいETagをレスポンスとして送り、ブラウザはこれらをキャッシュに保存します。
キャッシュの利点と課題
ブラウザキャッシュの最大の利点は、ウェブページの読み込み時間を大幅に短縮できることです。これは、特に画像やスクリプトファイルなど、容量の大きいファイルを多用するサイトで顕著に現れます。また、サーバーの負荷を軽減し、帯域幅を節約する効果もあります。
しかし、キャッシュには課題も存在します。ウェブサイトの内容が更新された場合でも、古い情報がキャッシュに残っていると、ユーザーは最新の内容を見ることができません。この問題を解決するため、ウェブ開発者はキャッシュ制御の戦略を適切に設計し、適用する必要があります。
まとめ
ブラウザキャッシュは、ウェブサイトのパフォーマンスを向上させる強力なツールですが、正しく管理されなければ、UXを損ねる可能性もあります。Web開発者は、キャッシュの動作を正確に理解し、適切なキャッシュ制御方法を適用することが重要です。ユーザーとサーバーの両方にとって最適にコンテンツを提供するためには、キャッシュのバランスを考えることが必須です。