If-Modified-Since(イフ・モディファイド・ビフォー)とは | 意味や読み方など丁寧でわかりやすい用語解説
If-Modified-Since(イフ・モディファイド・ビフォー)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。
読み方
日本語表記
もし変更されていれば (モシヘンコウサレテイバレバ)
英語表記
If-Modified-Since (イフ・モディファイド・シンズ)
用語解説
If-Modified-Sinceは、HTTPリクエストヘッダーの一つであり、Webクライアントが持つキャッシュの有効性をサーバーに問い合わせるために使用される。Webブラウザなどのクライアントは、一度取得したWebページや画像などのリソースを、再表示を高速化するためにローカルに一時保存する。これをキャッシュと呼ぶ。しかし、キャッシュされたデータはサーバー上で更新されている可能性があるため、次に同じリソースが必要になった際に、手元のキャッシュが最新のものかを確認する必要がある。If-Modified-Sinceは、この確認プロセスにおいて中心的な役割を担う。クライアントは、キャッシュしているリソースの最終更新日時をこのヘッダーに含めてサーバーに送信することで、「もしこの日時以降にリソースが変更されていたら、新しいものをください」という条件付きのリクエストを行う。これにより、リソースが更新されていない場合は不要なデータの再ダウンロードを避け、通信の効率化と表示速度の向上を実現する。
この仕組みを詳細に解説する。まず、クライアントが初めて特定のリソース(例えば、example.com/logo.pngという画像)をリクエストすると、サーバーはリクエストされた画像データ本体とともに、HTTPレスポンスヘッダーを返す。このヘッダー群の中に「Last-Modified」というヘッダーが含まれている。Last-Modifiedヘッダーには、そのリソースがサーバー上で最後に変更された日時が記録されている。クライアントは、受け取った画像データと、このLast-Modifiedヘッダーの値をセットでキャッシュに保存する。次に、ユーザーが同じページを訪れるなどして、再度logo.pngが必要になった場合、クライアントは単にリクエストを送るのではなく、キャッシュの有効性を検証するためのリクエストを送信する。このとき、リクエストヘッダーに「If-Modified-Since」を追加し、その値としてキャッシュに保存しておいたLast-Modifiedの日時を設定する。
この条件付きリクエストを受け取ったサーバーは、If-Modified-Sinceヘッダーで指定された日時と、サーバー上にある実際のlogo.pngの最終更新日時を比較する。この比較結果によって、サーバーの応答は二通りに分岐する。もし、サーバー上のファイルの最終更新日時が、If-Modified-Sinceで指定された日時以前、つまり変更がない場合、サーバーはリソース本体をレスポンスに含めない。代わりに、HTTPステータスコード「304 Not Modified」という特別な応答を返す。この応答は、ヘッダー情報のみで構成されるためデータ量が非常に小さく、通信負荷が低い。この304応答を受け取ったクライアントは、手元にあるキャッシュが最新であると判断し、保存しておいた画像データをそのまま使用する。
一方、もしサーバー上のファイルの最終更新日時が、If-Modified-Sinceで指定された日時より後、つまりリソースが更新されていた場合、サーバーは通常のリクエストと同様の応答を返す。具体的には、HTTPステータスコード「200 OK」とともに、更新された新しいリソース本体をレスポンスのボディに含めて送信する。同時に、レスポンスヘッダーには新しい最終更新日時を記録したLast-Modifiedヘッダーも含まれる。この応答を受け取ったクライアントは、新しいリソースを取得し、手元のキャッシュをこの新しいデータと新しいLast-Modifiedの日時で上書き更新する。
このように、If-Modified-Sinceを利用したキャッシュ制御は、Webのパフォーマンスを向上させる上で非常に重要である。不要なデータ転送をなくすことで、ネットワーク帯域を節約し、ユーザーにとってはページの読み込み時間が短縮されるという利点がある。また、サーバー側にとっても、リソースを毎回送信する必要がなくなるため、処理負荷やネットワーク負荷が軽減されるというメリットがある。ただし、この仕組みはリソースの最終更新日時に依存するため、日時の精度が秒単位であることに起因する問題や、分散サーバー環境における日時の同期問題など、いくつかの課題も存在する。これらの課題を補完するため、リソースの内容自体から生成した識別子を用いる「ETag」および「If-None-Match」ヘッダーという別の仕組みも存在するが、If-Modified-SinceはHTTPの基本的なキャッシュ制御技術として広く利用され続けている。