/
945.txt
179 lines (135 loc) · 9.73 KB
/
945.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
[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]]
により保存された実行環境などが使われることがあります。
* その他のキャッシュ
[12] [[Webブラウザー]]は [[AppCache]] も実装していることがあります。
[13] [[鯖]]は、[[アプリケーション]]依存の様々なキャッシュを利用していることがあります。
[[HTTP]] に従っている[[キャッシュ串]]の他、特定アプリケーション向けの [[HTTP]]
に厳密には適合しない[[キャッシュ串]]や、 [[memcached]] などの[[キャッシュ]]用[[鯖]]、
[[プログラミング言語]]や[[ライブラリー]]の機能を利用した[[キャッシュ]]など、
様々な仕組みが用いられています。
;; [14] これら[[鯖]]内部の[[キャッシュ]]は [[HTTP]] を通じて[[クライアント]]側からは直接的には観測できないのが普通なので、
[[アプリケーション]]の性質に応じて自由な仕組みと構成を採用できます。
* 歴史
[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/>