weak comparison

実体タグ (HTTP)

[1] 実体タグ (entity-tag) は、表現の区別のための識別子です。

仕様書

意味

[13] 実体タグ (entity-tag) は、 同じ資源の複数の表現が異なるかどうか、 資源の状態が時を経て変化したり、 内容折衝によって同時に妥当表現が複数存在していたり、 その両方が起こったりしても区別できるような不透明な検証子です >>11

[23] 実体タグは、修正日時のの精度では不十分だったり、 修正日時を一貫して維持できなかったりして修正日時では不便な状況で、 修正日時より信頼できる検証子として使うことができます >>11

[33] 実体タグ強い検証子としても弱い検証子としても用いることができ、 次に示す通り構文で区別します。

[24] 実体タグ資源本体に関するもので、特性には適用されません >>19

構文

[17] 実体タグは、 " で括られた文字列か、 W/ の後に " で括られた文字列を続けたものです。 " の間には、 "SPACE 以外のASCII文字を使うことができます。 >>11

[18] " の間には 0x80-0xFFobs-text として認められています >>11。明記されていませんが、これらは生成は禁止しつつ、 受信者は対応しなければならないという意図と推察されます。
  1. ?
    1. W/
  2. "
  3. *
    1. |
      1. U+0021
      2. U+0023-U+007E
  4. "

[21] RFC 2616 までは " の部分は引用文字列だったので、 受信者によっては \ の unescape を行います。 \ を避けるべき (ought to) です。 >>11

[22] RFC 2616 までは W小文字でも構文上構わないことになっていましたが、 RFC 7232 で特に説明もなく禁止されました。 " で括られた部分での空白制御文字の使用も同じく禁止されています。

[28] 元々 (不透明な識別子のはずなのに) なぜ正規化の問題が生じてしまう引用文字列を採用したのか、 また他に例を見ない W/ のような奇妙な構文を採用したのか謎です。

[32] 現実には、 " で括られていない文字列が使われることもあります。

[29] W/ から始まるものは弱い検証子で、そうでないものは強い検証子です。 残りの部分は不透明な識別子で、起源鯖が任意の方法で決定できます。

[49] 実体タグを使って表現が同じか否かを判断するのは起源鯖だけです。 クライアント実体タグを不透明な識別子としてそのまま送受信するだけです。 従って起源鯖はどんな方法で実体タグを構成しても構いませんし、 その方法を明記する必要も手段もありません。

[50] 例えば、版管理システムの版番号と内容折衝の版の識別子の組み合わせを使ったり、 表現ハッシュ関数を適用した結果を使ったり、 秒以下の値も含んだ修正日時を使ったりできます。 >>11

[9] 透過内容折衝を使った応答では、実体タグ構造化実体タグでなければなりません >>10

[45] RFC 2295透過内容折衝を実装する場合にが用いるべき構造化実体タグ (structured entity tag) 構文を定義していましたが、 透過内容折衝は普及しませんでした。

[30] 起源鯖実体タグ強い検証子の性質を満たさない時は、 W/ を指定しなければなりません >>11

[41] Metalink/HTTP では、一連のの間で実体タグのポリシーを共通化することが求められています >>34

文脈

[35] 実体タグETag: ヘッダーの他、 If-Match: ヘッダーIf-None-Match: ヘッダーIf-Range: ヘッダーDelta-Base: ヘッダーIf: ヘッダーでも使われます。

[20] WebDAV (や編集目的) の場合にはとりわけ Last-Modified:タイムスタンプよりも実体タグが、また弱い実体タグより強い実体タグが好ましいと考えられています >>19

値の変更

[46] 起源鯖は、以前の表現が現在の表現のかわりに使われてしまってはいけない時には弱い実体タグを変更するべきです>>47

[25] PUT 応答における実体タグ要求で指定された payload body と完全に一致するものに対するものなのか、 側での軽微な変更も認められるのかは定かではありません >>19

[26] WebDAV 本体URL が変わっていない資源実体タグを変えるべきではありません >>19

[40] WebDAV は、 (COPYMOVE などの URL を操作するメソッドの結果であろうと、) GET が返すであろう表現が異なる場合には実体タグを再利用してはなりません>>27

比較

[38] 実体タグ比較には、強い比較 (strong comparison) 弱い比較 (weak comparison) があります。 強い比較は両者とも弱くなく、文字の列として一致する時等価とします。 弱い比較W/ の有無に関わらず、残りの部分が文字の列として一致する時等価とします。 >>11

プライバシー

[15] 実体タグクッキーの代用として濫用されることがあり、 fingerprinting vector とみなされています >>2624

歴史

[31] RFC 2068・2616 (HTTP/1.1) 3.11 Entity Tags

Entity tags are used for comparing two or more entities from the same requested resource. HTTP/1.1 uses entity tags in the ETag (section 14.20 14.19), If-Match (section 14.25 14.24), If-None-Match (section 14.26), and If-Range (section 14.27) header fields. The definition of how they are used and compared as cache validators is in section 13.3.3. An entity tag consists of an opaque quoted string, possibly prefixed by a weakness indicator.

実体札は、要求された同じ資源からの2つ以上の実体群を比較するのに使います。 HTTP/1.1 は実体札を ETag, If-Match, If-None-Match, If-Range頭欄で使います。 これらの頭欄をキャッシュ検証子としてどう使用・比較するかの定義は13.3.3節にあります。 一つの実体札は、一つの不透明引用文字列で構成されます。 頭に弱性指示子がつくこともあります。

  • entity-tag = [ weak ] opaque-tag
  • weak = "W/"
  • opaque-tag = quoted-string

A "strong entity tag" may MAY be shared by two entities of a resource only if they are equivalent by octet equality.

強い実体札」は、一つの資源の二つの実体がオクテット比較で同等である場合に限って両実体で共有しても構いません

A "weak entity tag," indicated by the "W/" prefix, may MAY be shared by two entities of a resource only if the entities are equivalent and could be substituted for each other with no significant change in semantics. A weak entity tag can only be used for weak comparison.

弱い実体札」は、 W/ という接頭辞で示します。 一つの資源の二つの実体が同等であり、意味上重大な変更を加えてしまうことなしに互いに代替することができるのであれば、 両実体で共有しても構いません。弱い実体札は弱い比較の時だけ使うことができます。

An entity tag MUST be unique across all versions of all entities associated with a particular resource. A given entity tag value may MAY be used for entities obtained by requests on different URIs without implying anything about the equivalence of those entities. The use of the same entity tag value in conjunction with entities obtained by requests on different URIs does not imply the equivalence of those entities.

実体札は、特定の資源に関連付けられているすべての実体のすべての版に渡って固有なものでなければなりません。 ある実体札値は、それらの実体の同等性について何ら暗示することなしに、 異なる URI についての要求群で得られる実体群について使用しても構いません異なる URI についての要求群で得られる実体に同じ実体札値が使われていても、それらの実体が同等であることを暗示するわけではありません。

[16] RFC 3229HTTP RFC の用語は複雑であるとして新たに「実現値」 なる概念を導入し、実体タグ実体ではなく実現値に対して割り当てられた識別子であるとしました >>12, >>14

[7] RFC 723x 世代ではHTTP実体という概念が消失していますが、 実体タグという用語はそのまま残っています。「実体」とは何なのかの説明はありません。

実装

[36] Apache では実体札の算出に、当該ファイルの inode 番号, 大きさ, mtime を使っています。 Etag: "19ebd-86f-a5f83ea5" のような値が得られます。この計算方法は 1.x と 2.x で微妙に違うようです。

[37] >>36 参考 [Apache-Users 2282], [Apache-Users 2287]

[39] [modperl:0415] Re: 実体ファイルのないリクエストに対する ETag ヘッダ値について, Hiroyuki OYAMA, 2003年4月 <mid:200304021116.h32BGS2V051267@iris.glay.ne.jp>

ETagの文字列はmod_perlのset_etagメソッド内部で呼び出される Apacheのap_make_etag()関数で生成されています。この関数はファ イルに対するリクエストの場合

  • ファイルのinode番号
  • ファイルのファイルサイズ
  • ファイルの更新時刻

の情報を"-"で連結した文字列を生成し、ファイルに対するリクエ ストではない場合は

  • ap_set_last_modified()などでセットした更新時刻

の文字列を生成します。

なのでファイルへのアクセスを処理するコンテンツハンドラであ れば、「他のスタティックなコンテンツ」と同じ形式のETagが生 成されますが、ファイルの実体を持たないコンテンツハンドラの 場合は最終更新日だけをつかったETagが生成されます。 と、これはset_etagメソッドでETagを設定する場合で、 set_etagメソッドを使わずに自分でETagを生成・セットすること もできます。

  % perl -e 'printf q{"%x-%x-%x"}, (stat("/docs/charset.html"))[1,7,9]'
>
;; 詳しくは$APACHE_SRC/main/http_protocol.cのap_set_etag()と
ap_make_etag()を見てください。

関連

[57] If-Match:If-None-Match: では * という値が使われることがありますが、これは実体タグではありません。

[58] If-Range: ではHTTPの日時形式が使われることがありますが、 これは実体タグではありません。

[8] 異体リスト検証子実体タグ異体リストに適用したものといえます。

メモ

[2] 実体タグ内容折衝によって同じ URL で複数の表現が提供されている場合や、 の時計が正しくない場合などでも Last-Modified: の値に頼らずキャッシュを更新できる仕組みとして HTTP/1.1 で導入されました。

[3] 内容折衝など必要以上に複雑な仕組みが HTTP に導入されたことで、 実体タグのような本来必要なかった複雑な仕組みを更に導入する必要が生じたと見ることもできます。

[4] ETag: が現在使われるのは、ほとんどの場合、静的ファイルを提供する形のだけですが、 そのような形態なら普通 Last-Modified:If-Modified-Since: で十分実用的に動作するので、 実体タグプロトコルを複雑化する以外に役に立っていないとすら言えます。

[5] ETag: (>>17) のように、実体タグの設定の誤りによりキャッシュ効率がむしろ悪化する事例もあります。

[6] また >>15 のように実体タグを悪用する例もあります。

[2625] ETagをどう生成するか - 岩本隆史の日記帳 ( ( 版)) <http://d.hatena.ne.jp/IwamotoTakashi/20080826/p2>

[2626] ETagを使ってSpringとHibernateの転送量と負荷を削減する ( ( 版)) <http://www.infoq.com/jp/articles/etags>

[2627] ricollab Web Tech Blog » Blog Archive » ETagについて ( ( 版)) <http://blogs.ricollab.jp/webtech/2008/02/etag/>

[2628] 2.2.5.4 ETag ( ( 版)) <http://msdn.microsoft.com/en-us/library/dd541486.aspx>

[2629] ビューの条件付き処理 — Django 1.4 documentation ( ( 版)) <http://docs.djangoproject.jp/en/latest/topics/conditional-view-processing.html>