[4] [DFN[[RUBYB[[[キャッシュ]]]@en[cache]]]]は、
[[ネットワーク]]経由で取得したデータを一時的に保持しておき、
以後のアクセスで[[ネットワーク]]アクセスを省略するものです。
[[Web]] においては[[利用者エージェント]]や[[串]]で用いられています。

* 仕様書

[REFS[
- [5] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-2.4>
- [11] [CITE@en[RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching]] ([TIME[2014-09-11 10:19:59 +09:00]] 版) <https://tools.ietf.org/html/rfc7234>
]REFS]

* HTTP キャッシュ

[6] [[キャッシュ]]とは、以前の[[応答メッセージ]]を[RUBYB[局所的に[[蓄積]]するもの]@en[local store]]、
およびその[[メッセージ]]蓄積域と取得や削除を制御する[[部分システム]]のことをいいます。
[[キャッシュ]]は、[[キャッシュ可能]]な[[応答]]を蓄積して、
以後の等価な[[要求]]の応答時間やネットワーク帯域の消費を節減するものです。 [SRC[>>5]]

[7] [[クライアント]]や[[鯖]]は、[[キャッシュ]]を用いて構いません [SRC[>>5, >>11]]。
[[キャッシュ]]の実装は必須ではありませんが、特に要件や設定がない限り、
[[キャッシュ]]した[[応答]]を使うのは好ましいことと考えられています [SRC[>>11]]。

[8] [[鯖]]は[[トンネル]]として動作しているときは、[[キャッシュ]]を使うことはできません。 [SRC[>>5, >>11]]

[21] [[キャッシュ]]を実装する場合でも、[[キャッシュ]]に[[応答]]を[[蓄積]]することや、
[[蓄積]]された[[応答]]を使って返答することは必ずしも求められていません。
[[HTTP]] の仕様では[[キャッシュ]]を使ってはいけない場面は規定されていますが、
使わなければならない状況はありません。

;; [22] [[著者]]が[[キャッシュ]]の有無や実装方法に依存した[[スクリプト]]などを書くことは不可能ではありませんが、
一般的には、キャッシュされるべきでない場面で意図せずキャッシュされて問題が起こることはあっても、
キャッシュするべきなのにされなくて問題が起こることはあまりありません。
[[キャッシュ]]する場合にどう動作するかは標準化する必要があっても、
いつ[[キャッシュ]]しなければならないかは[[相互運用性]]に然程影響するとは思えませんし、
そもそも[[キャッシュ]]が実装されないこともありますから、意味が無いのでしょう。

[20] [[キャッシュ]]に蓄積するデータの単位を[[キャッシュ項目]]と呼んでいます。
[[キャシュ項目]]はおおよそ [[URL]] と[[要求メソッド]]に対応するものです。

[23] [[HTTP応答]]には[[キャッシュ可能]]なものとそうでないものがあり、
[[キャッシュ可能]]なものは、[[キャッシュ]]に[[蓄積]]することができます。
[[キャッシュ]]に[[蓄積]]したものを[[応答]]に使う ([[再利用]]する) かどうかは、
更にいくつかの条件があります。

;; [[キャッシュ可能性]]を参照。

[15] [[キャッシュ]]には、[[共有キャッシュ]]と[[私的キャッシュ]]があります。
[[私的キャッシュ]]には[[キャッシュ可能]]な[[応答]]でも、
[[共有キャッシュ]]には[[キャッシュ可能]]でないことがあります。

[24] 詳しくは次の各項目を参照してください。

[FIG(short list)[
- [[キャッシュ可能性]]
- [[満期時刻]]
- [[齢]]
- [[キャッシュ再利用]]
- [[検証]]
- [[条件付き要求]]
- [[範囲要求]]
- [CODE(HTTP)@en[[[HEAD]]]]
- [[非安全要求メソッド]]
- [CODE(HTTP)@en[[[Cache-Control:]]]]
- [CODE(HTTP)@en[[[Warning:]]]]
- [CODE(HTTP)@en[[[Meter:]]]]
]FIG]

* 履歴

[17] [[Webブラウザー]]は普通[[キャッシュ]]を持っています。

[18] [[navigate]] などで使われるのは [[HTTPキャッシュ]] ([[私的キャッシュ]])
と思われます。

[19] [[履歴]]の[[探索]]では、 [[HTTPキャッシュ]]なら有効期限切れとなっているような[[応答]]が再利用されることがあります。また[[履歴]]の[[探索]]の場合には[[応答]]だけでなく、
[CODE(DOMm)@en[[[pushState]]]] によって関連付けられたデータや [[bfcache]]
により保存された実行環境などが使われることがあります。

[52] 
[[Netscape Navigator]] の頃から[[ディスクキャッシュ]]と[[メモリーキャッシュ]]がありました。

* その他のキャッシュ

[HISTORY[

[12] [[Webブラウザー]]は [[AppCache]] も実装していることがありました。

]HISTORY]

[13] [[鯖]]は、[[アプリケーション]]依存の様々なキャッシュを利用していることがあります。
[[HTTP]] に従っている[[キャッシュ串]]の他、特定アプリケーション向けの [[HTTP]]
に厳密には適合しない[[キャッシュ串]]や、 [[memcached]] などの[[キャッシュ]]用[[鯖]]、
[[プログラミング言語]]や[[ライブラリー]]の機能を利用した[[キャッシュ]]など、
様々な仕組みが用いられています。

;; [14] これら[[鯖]]内部の[[キャッシュ]]は [[HTTP]] を通じて[[クライアント]]側からは直接的には観測できないのが普通なので、
[[アプリケーション]]の性質に応じて自由な仕組みと構成を採用できます。

[35] [[HSTS]] の [[RFC]] では、何箇所かだけ[[既知HSTSホスト]]情報のことを
「キャッシュ」と言っています。

[36] [[PKP]] の [[RFC]] では、[[既知ピン付きホスト]]の情報のことを
「キャッシュ」と言っています。

[37] その他、実装によっては [[favicon]] など機能独自のキャッシュ機構があるかもしれません。

* 歴史

[FIG(quote)[
[FIGCAPTION[
[1] [[HTTP]] ([[RFC1945]] 1.2, [[RFC2068]] 1.3, [[RFC2616]] 1.3)
]FIGCAPTION]

>
:cache: A program's local store of response messages and the subsystem
that controls its message storage, retrieval, and deletion. A
cache stores cach[INS[e]]able [INS[{2616}]] responses in order to reduce the response
time and network bandwidth consumption on future, equivalent
requests. Any client or server may include a cache, though a cache cannot be used by a server [DEL[while it]] [INS[[INS[{2068,2616}]] that]] is acting as a tunnel.

:キャッシュ: プログラムの、[[応答メッセージ]]の局所蓄積及びこのメッセージ蓄積, 
取り出し, 削除を制御する[[部分システム]]。
キャッシュは、以後の同等の[[要求]]の[[応答]]時間とネットワーク帯域消費を削減するために[[キャッシュ可能]]応答を蓄積します。
任意の[[クライアント]]又は[[サーバー]]はキャッシュを含んでも構いません。
但し[[トンネル]]として動作しているサーバーはキャッシュを使うことはできません。
]FIG]

[2] [CITE[Early findings: Mobile browser cache persistence and behaviour]]
( ([TIME[2013-01-07 02:23:57 +09:00]] 版))
<http://www.webperformancetoday.com/2012/07/12/early-findings-mobile-browser-cache-persistence-and-behaviour/>

[3] [CITE@en[RFC 3143 - Known HTTP Proxy/Caching Problems]]
( ([TIME[2012-02-26 08:00:21 +09:00]] 版))
<http://tools.ietf.org/html/rfc3143>

[9] [CITE[''''''[''''''whatwg'''''']'''''' Image cache behaviour]]
( ([TIME[2012-06-12 06:55:52 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2012-June/036351.html>

[10] [CITE@en[Web Applications 1.0 r7128     Try to define img synchronous loading.]]
( ([TIME[2012-06-12 05:53:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7127&to=7128>

[16] [CITE@en[Add cache mode concept and elaborate a bit on caching. · 99377cd · whatwg/fetch]]
( ([TIME[2014-09-23 05:09:51 +09:00]] 版))
<https://github.com/whatwg/fetch/commit/99377cd334e7e4e7737c2b2fd521c74a6cf7e01a>


[25] [CITE@en[Turn request's cache mode into six modes per https://github.com/slightly... · 606ef84 · whatwg/fetch]]
( ([TIME[2014-10-11 03:08:14 +09:00]] 版))
<https://github.com/whatwg/fetch/commit/606ef84364515f932570068e9026d2d535846a74>

[26] [CITE@en[Deal with partial cache entries https://github.com/slightlyoff/ServiceWo... · 10cceb6 · whatwg/fetch]]
( ([TIME[2014-10-11 03:09:58 +09:00]] 版))
<https://github.com/whatwg/fetch/commit/10cceb6ec1cf04456ac6ff66917ebc509ca5181b>

[27] [CITE@en[Add cache mode API for https://github.com/slightlyoff/ServiceWorker/issu... · a2bd3aa · whatwg/fetch]]
( ([TIME[2014-10-18 14:16:00 +09:00]] 版))
<https://github.com/whatwg/fetch/commit/a2bd3aaadaf507c8ea7b3992d488a84d14b43470>

[28] [CITE@en[Draft for cache state for https://github.com/slightlyoff/ServiceWorker/i... · fef58a7 · whatwg/fetch]]
( ([TIME[2014-10-18 14:18:17 +09:00]] 版))
<https://github.com/whatwg/fetch/commit/fef58a71c053533460a5ef81683acaf7006e9f80>

[29] [CITE@en-US[Frecency algorithm - Mozilla | MDN]]
([TIME[2014-08-11 01:12:18 +09:00]] 版)
<https://developer.mozilla.org/en-US/docs/Mozilla/Tech/Places/Frecency_algorithm>

[30] [CITE@en[Necko/Cache - MozillaWiki]]
([TIME[2015-03-21 17:30:49 +09:00]] 版)
<https://wiki.mozilla.org/Necko/Cache>

[FIG(quote)[
[FIGCAPTION[
[31] [CITE@en[Necko/Differences - MozillaWiki]]
([TIME[2015-03-21 17:34:27 +09:00]] 版)
<https://wiki.mozilla.org/Necko/Differences>
]FIGCAPTION]

> 
> Chrome does heuristic cache validation for resources with query strings in their URI; we do not.
> MSIE requires that a successful connection to the server be made before it will use an HTTPS cache entry; we do not. I don't know what Chrome does here.

]FIG]


[32] [CITE[Part2 - browsersec - Browser Security Handbook, part 2 - Browser Security Handbook - Google Project Hosting]]
([TIME[2015-03-31 16:47:22 +09:00]] 版)
<https://code.google.com/p/browsersec/wiki/Part2#Document_caching>

[33] [CITE[Caching Tutorial for Web Authors and Webmasters]]
([TIME[2015-02-24 14:11:08 +09:00]] 版)
<https://www.mnot.net/cache_docs/>

[FIG(quote)[
[FIGCAPTION[
[34] [CITE[IRC logs: freenode / #whatwg / 20150529]]
([TIME[2015-05-30 11:25:07 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20150529>
]FIGCAPTION]

>  I read about one-time possible privacy attack allowing to discover, what sites user visited. The idea is to measure time of loading favucon.ico from various sites. If it is in a cache, it will load sifnificantly faster. What you think?
> # '''['''14:23''']''' <IZh> And the time could be compared with favicon.ico?someRandomValue

]FIG]


[38] [CITE@en[RFC 3040 - Internet Web Replication and Caching Taxonomy]]
([TIME[2015-05-31 16:54:34 +09:00]] 版)
<https://tools.ietf.org/html/rfc3040>

[39] [CITE@en[HttpCacheReadBehavior enumeration - Windows app development]]
([TIME[2015-08-08 11:43:29 +09:00]] 版)
<https://msdn.microsoft.com/en-us/library/windows/apps/windows.web.http.filters.httpcachereadbehavior.aspx>

[40] [CITE[Disk Cache - The Chromium Projects]]
([TIME[2015-08-28 12:41:44 +09:00]] 版)
<https://www.chromium.org/developers/design-documents/network-stack/disk-cache>

[FIG(quote)[
[FIGCAPTION[
[41] [CITE[W3M FAQ]]
( ([TIME[2001-02-01 18:02:39 +09:00]]))
<http://homepage2.nifty.com/aito/w3m/FAQ.html>
]FIGCAPTION]

> 他の多くのブラウザと違い,w3mはキャッシュを持っていません. そのため,文書を読むたびにWWWサーバから文書を転送します.もし可能なら, キャッシュサーバを利用すると快適です.設定はプロキシの設定と同じです.

]FIG]


[42] [CITE@en[660749 – (CVE-2011-0082) Firefox doesn't (re)validate certificates when loading a HTTPS page from the cache]]
( ([TIME[2016-06-12 00:04:56 +09:00]]))
<https://bugzilla.mozilla.org/show_bug.cgi?id=660749>

[43] [CITE@en[Matching hint responses with requests · Issue #5 · igrigorik/resource-hints]]
( ([TIME[2016-06-16 18:13:02 +09:00]]))
<https://github.com/igrigorik/resource-hints/issues/5>

[44] [CITE@en[Matching hint responses with requests · Issue #2 · w3c/resource-hints]]
( ([TIME[2016-06-16 18:13:42 +09:00]]))
<https://github.com/w3c/resource-hints/issues/2>

[45] [CITE@en[Rewrite HTTP cache integration]]
([[mnot]]著, [TIME[2017-03-23 22:51:00 +09:00]])
<https://github.com/whatwg/fetch/commit/cbca2c2f3a37084e336e14348de683f8ffa0fed9>

[46] [CITE@en[For users on very slow connections, block document.written scripts · Issue #17 · WICG/interventions]]
([TIME[2017-07-15 23:50:02 +09:00]])
<https://github.com/WICG/interventions/issues/17>

[47] [CITE@en[Added a cache performance warning. (#44)]]
([[msramek]]著, [TIME[2017-11-30 19:18:41 +09:00]])
<https://github.com/w3c/webappsec-clear-site-data/commit/681f03fe52725a40992d59831f492822c152e66b>

[48] [CITE@en[Added a cache performance warning. by msramek · Pull Request #44 · w3c/webappsec-clear-site-data]]
([TIME[2017-12-01 23:58:12 +09:00]])
<https://github.com/w3c/webappsec-clear-site-data/pull/44>

[49] [CITE@en[Add response's cache state back]]
([[annevk]]著, [TIME[2018-04-24 02:03:45 +09:00]])
<https://github.com/whatwg/fetch/commit/6702eefda313e06bca0525745b72b0870e6fd2b9>

[50] [[HTCP]]

[51] [CITE@en[RFC 3040 - Internet Web Replication and Caching Taxonomy]], [TIME[2021-04-11T09:20:08.000Z]], [TIME[2021-04-21T09:20:10.507Z]] <https://tools.ietf.org/html/rfc3040>