/
985.txt
115 lines (86 loc) · 6.23 KB
/
985.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
[9] [[条件付き要求]]の事前条件として使われる資源メタデータの値のことを、
[DFN[[RUBYB[検証子]@en[validator]]]]といいます [SRC[>>8]]。
[10] そのような資源メタデータとして、 [[RFC 7232]] では修正日時
([CODE(HTTP)@en[[[Last-Modified]]]]) と[[実体タグ]]が規定されている他、
[[WebDAV]] その他の拡張でも定義されることがあります [SRC[>>8]]。
* 仕様書
[REFS[
- [8] '''[CITE@en[RFC 7232 - Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests]] ([TIME[2014-09-11 10:02:44 +09:00]] 版) <https://tools.ietf.org/html/rfc7232#section-2>'''
- [2] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-08-07 05:54:02 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-7.2>
- [507] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-06-07 01:55:45 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-4.3.4>
]REFS]
* 検証子ヘッダー
[3] [DFN[[RUBYB[検証子ヘッダー]@en[validator header fields]]]]は、
[[選択された表現]]についての[[メタデータ]]を伝達するものです。 [SRC[>>2]]
[4] [[安全]]な[[要求]]に対する[[応答]]の[[検証子ヘッダー]]は、
[[応答]]を処理するに当たり[[起源鯖]]が選んだ[[選択された表現]]について説明したものです。 [SRC[>>2]]
;; [5] [[状態符号]]の意味次第では、ある[[応答]]の[[選択された表現]]は必ずしもその[[応答]]に含まれる
[[payload]] の[[表現]]と同じではないかもしれません。 [SRC[>>2]]
[6] 状態を変更しようとする[[要求]]の成功した[[応答]]の[[検証子ヘッダー]]は、
処理の結果以前の[[選択された表現]]を置き換えた新しい[[表現]]について説明するものです。 [SRC[>>2]]
[EG[
[7] 例えば [CODE(HTTP)[[[201]]]] [[応答]]の [CODE(HTTP)@en[[[ETag:]]]]
[[ヘッダー]]は、新しく作られた[[資源]]の[[実体タグ]]を表しています。 [SRC[>>2]]
]EG]
[515] [[起源鯖]]は、 [CODE(HTTP)@en[[[PUT]]]] [[要求]]の[[表現]]が[[変形]]なしに保存され、
[[検証子ヘッダー]]の値が新しい[[表現]]にそのまま適用される場合を除き、
[CODE(HTTP)@en[[[PUT]]]] への[[応答]]で[[検証子ヘッダー]]を送信しては[['''なりません''']]
[SRC[>>507]]。
[202] 次の[[ヘッダー]]が[[検証子ヘッダー]]とされています [SRC[>>2]]。
[FIG(short list)[
- [CODE(HTTP)@en[[[ETag:]]]]
- [CODE(HTTP)@en[[[Last-Modified:]]]]
]FIG]
;; [16] [[検証子]]を値とする[[ヘッダー]]であっても、 [CODE(HTTP)@en[[[If-Match:]]]]
など[[検証子]]を条件として利用する[[ヘッダー]]は、[[検証子ヘッダー]]ではありません。
* 検証子の強さ
[11] [[検証子]]には、[DFN[[RUBYB[[[強い検証子]]]@en[strong validator]]]]と[DFN[[RUBYB[[[弱い検証子]]]@en[weak validator]]]]があります
[SRC[>>8]]。
[12] [[強い検証子]]は、 [CODE(HTTP)@en[[[GET]]] [[要求]]に対する [CODE(HTTP)[[[200]]]]
[[応答]]の [[payload body]] に含まれるであろう[[表現]]データが変化する時に常に変化する[[表現メタデータ]]です。
[[強い検証子]]は、その他の理由、例えば[[表現メタデータ]]の意味的に重要な部分
(例えば [CODE(HTTP)@en[[[Content-Type:]]]]) が変わった場合にも変化するかもしれませんが、
遠隔の[[キャッシュ]]や [[authoring tool]] が蓄積された[[応答]]を[[非妥当]]にする必要がある時に限って変化させるのが[[起源鯖]]にとって最も重視するところです。
[[強い検証子]]は、ある[[資源]]のすべての[[表現]]のすべての版にわたって固有の値です。
[WEAK[(別の[[資源]]の[[表現]]についても[[固有]]な値とは限りません。)]]
[SRC[>>8]]
[EG[
[13] 例えば版管理システムの版識別子だったり、
[[表現データ]]についての[[ハッシュ関数]]の値だったりします。 [SRC[>>8]]
]EG]
;; [14] 同じ[[表現データ]]で[[メタデータ]]だけ異なり、その違いが重要な場合には、
[[メタデータ]]の部分も[[強い検証子]]に反映させるよう注意が必要です。
[15] [[弱い検証子]]は、[[表現]]のデータが変わっても毎回変わらないかもしれない[[表現メタデータ]]です。
[SRC[>>8]]
[EG[
[17] 例えば毎秒変化する気象情報の[[表現]]は、適当な時間
([[鯖]]の負荷や天気の品質によって調整しつつ) [[キャッシュ]]できるよう、
同じ[[弱い検証子]]を使ってまとめることができます。 [SRC[>>8]]
]EG]
[EG[
[18] [[表現]]の修正時刻が[[秒]]単位の場合、1秒間に複数回変更されることがあるなら、
[[弱い検証子]]となります。 [SRC[>>8]]
]EG]
[EG[
[19] 同じ[[資源]]の複数の[[表現]]、例えば通常版と [[gzip]] [[内容符号化]]版で同等のデータを表すものが同じ[[検証子]]を共有しているなら、
それは[[弱い検証子]]です。 [SRC[>>8]]
]EG]
[21] [[強い検証子]]はすべての[[条件付き要求]]で使えます。
[[弱い検証子]]は、以前得た[[表現]]データと完全に等しいか分からなくても良い、
[[キャッシュ]]項目の[[検証]]や [[Web]] 探索を最近の変更のみに限定するような場合などにしか使えません。
[SRC[>>8]]
* 検証子の利用
[20] [[検証子]]は、[[条件付き要求]]の事前条件の記述に用いられます。
[22] [[検証子]]は、[[範囲要求]]に対する[[部分応答]]の適用可能性の決定に用いられます。
* 歴史
[FIG(quote)[
[FIGCAPTION[
[1] [[HTTP]] ([[RFC 2068]] 1.3, [[RFC 2616]] 1.3)
]FIGCAPTION]
>
:validator: A protocol element (e.g., an entity tag or a Last-Modified time)
that is used to find out whether a cache entry is an equivalent
copy of an entity.
:検証子: [[キャッシュ項目]]が[[実体]]の同等の複製であるかを調べるのに使うプロトコル要素
(例えば[[実体札]]や [CODE(HTTP)[[[Last-Modified]]]] 時刻)。
]FIG]