2. Overview of Cache Operation
適切なキャッシュ操作は、キャッシュにすでに保持されている情報の送信を削減しながら、HTTP転送のセマンティクスを保持する。キャッシュがどのレスポンスをキャッシュ可能と判断できるかの詳細については第3節を、キャッシュエントリからレスポンスを構築する詳細については第4節を参照。本節は、キャッシュが保存されたレスポンスを選択および更新する方法の概要を提供する。
キャッシュはHTTPの完全にオプション (OPTIONAL) な機能であるが、キャッシュされたレスポンスの再利用が望ましいこと、および要件またはローカル設定がそれを妨げない場合、そのような再利用がデフォルトの動作であることを前提とすることができる。したがって、HTTPキャッシュ要件は、キャッシュが特定のレスポンスを常に保存および再利用することを義務付けるのではなく、キャッシュが再利用不可能なレスポンスを保存すること、または保存されたレスポンスを不適切に再利用することを防ぐことに焦点を当てている。
リクエストターゲットのクエリコンポーネント (Query Component)([RFC7230] のセクション5.3)には、1人のユーザー、ユーザーのコホート、またはユーザーの現在の状態に固有のリクエストに関する情報を含めることができる。一般に、パス部分が同じであっても、ユーザーのリクエストに異なるクエリ値がある可能性があるため、キャッシュがクエリコンポーネントを含むリクエストへのレスポンスを別のユーザーからの同じリクエストを満たすために再利用することは安全ではない。リクエストターゲットにクエリコンポーネントを含む成功したレスポンスを受信するキャッシュ受信者は、レスポンスがCache-Controlディレクティブ(セクション5.2)で明示的に許可しない限り、異なるクエリコンポーネントを持つリクエストに対してそのレスポンスを再利用すべきではない (SHOULD NOT)。
キャッシュは、レスポンスがCache-Controlディレクティブによって明示的に許可されている場合、またはレスポンスがバリデータ (Validator)([RFC7232] のセクション2.3)を含み、キャッシュが検証要件に従う場合、クエリコンポーネントを含むリクエストへのレスポンスを保存および再利用できる。これが発生した場合、キャッシュキーが一致し(セクション4.1)、すべての適用可能な鮮度要件が満たされ(セクション4.2)、リクエストおよび保存されたレスポンスによって課されるすべての適用可能なキャッシュ要件が満たされるという制約の下で、キャッシュはそのレスポンスを使用して別のリクエストを満たすことができる (MAY)。
キャッシュされたレスポンスの現在の有効性について、キャッシュが学習できるさまざまなメカニズムが存在する。キャッシュされたレスポンスは、その経過時間 (Age) がまだ鮮度有効期間 (Freshness Lifetime) を超えていない場合、「新鮮」(Fresh) である。逆に、キャッシュされたレスポンスは、鮮度有効期間を満たすか超えるのに十分な時間キャッシュに存在していた場合、「古い」(Stale) である。
新鮮なレスポンスは、オリジンサーバーに接触することなく後続のリクエストを満たすために使用でき、効率を向上させる。プロトコルには、オリジンサーバーが明示的な鮮度有効期間を割り当てるメカニズム、明示的な鮮度有効期間が設定されていない場合にヒューリスティック鮮度有効期間を計算するメカニズム、およびキャッシュされたレスポンスが古くなった後に検証してその鮮度有効期間を延長するメカニズムが含まれている。
鮮度を割り当てる主要なメカニズムは、オリジンサーバーがExpiresヘッダーフィールド(セクション5.3)またはmax-ageレスポンスディレクティブ(セクション5.2.2.8)を介して明示的な有効期限を送信することである。一般に、オリジンサーバーは、レスポンスのすべての予想される使用を満たすのに十分な明示的な有効期限を割り当てる。キャッシュによる頻繁な再利用を許可するために寛大な有効期間を与えることができる; コンテンツが定期的に変化することがわかっている場合は、保守的な有効期間を与えることができる。
明示的な有効期限が存在しない場合、キャッシュはヒューリスティック有効期限を計算してもよい (MAY)。キャッシュは、本仕様でキャッシュ可能性が定義されていないステータスコードのレスポンスに対して、300、301、または308以外のリダイレクト([RFC7231] のセクション6を参照)など、またはステータスコードがエラーを示す場合(つまり、ステータスコードが400以上である場合)、ヒューリスティック有効期限を使用してはならない (MUST NOT)。
保存されたレスポンスが古い場合、キャッシュは通常、検証([RFC7232] で定義されている条件付きリクエスト)を使用して保存されたレスポンスを更新し、表現データの不必要な転送を回避する。古いレスポンスは、キャッシュの設定によって切断された操作が許可されている場合、またはCache-Controlのリクエストディレクティブがそれを許可している場合(セクション5.2)、検証なしでも使用できる。