ETag

ETag は HTTP のレスポンスヘッダーで、リソースの特定バージョンの識別子です。ウェブサーバーは、コンテンツが変更されていない場合はレスポンス全体を再送する必要がないので、キャッシュがより効率的になり通信帯域を節約することができます。加えて、 ETag はリソースが同時に更新されて互いを上書きすること (「空中衝突」) を防ぐのに役立ちます。

指定された URL のリソースが変更された場合は、新しい Etag 値を生成する必要があります。したがって Etags はフィンガープリントに似ており、一部のサーバーでの追跡目的でも使用される可能性があります。これらを比較することで、リソースの2つの表現が同じかどうかを素早く判断できますが、トラッキングサーバーによって無限に保持されるように設定することもできます。

ヘッダー種別 レスポンスヘッダー
禁止ヘッダー名 いいえ

構文

ETag: W/"<etag_value>"
ETag: "<etag_value>"

ディレクティブ

W/ 省略可
'W/' (大文字) は弱いバリデーターを使用することを示します。弱い ETag は生成が簡単ですが、比較にはあまり役立ちません。強力なバリデーターは比較には理想的ですが、効率的に生成するのはとても困難です。同じリソースを表現する2つの弱い Etag の値があった場合、意味的には同等ですが、バイト単位では同じではない可能性があります。すなわち、弱い ETag はバイト範囲指定のリクエストが行われたときにキャッシュされませんが、強い ETag は範囲指定のリクエストもキャッシュします。
"<etag_value>"
要求されたリソースを一意に表すエンティティタグです。これは二重引用符で囲まれた ASCII 文字列であり、 "675af34563dc-tr34"のような形です。 ETag 値が生成される方法は指定されていません。コンテンツのハッシュ、最終更新タイムスタンプのハッシュ、単なるリビジョン番号などがよく使用されます。たとえば、 MDN は Wiki 記事コンテンツのハッシュを使用しています。

ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
ETag: W/"0815"

空中衝突の回避

ETagIf-Match ヘッダの助けを借りて、編集の空中衝突を検出することができます。

たとえば、 MDN を編集する場合、現在の Wiki コンテンツのハッシュが算出され、そのレスポンスで Etag に入れられます。

ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"

Wiki ページに変更を保存 (データの投稿) するとき、 POST リクエストには、 If-Match ヘッダーに ETag 値を入れて、新しいかどうかをチェックします。

If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

ハッシュが一致しない場合は、文書が途中で編集されたことを意味し、 412 Precondition Failed エラーが発生します。

変更されていないリソースのキャッシュ

もう一つの ETag ヘッダーの典型的な使用例として、変更されていないリソースをキャッシュすることがあります。ユーザーが (ETag が設定されている) 指定された URL を再度訪問した時、それが古くなったもの (古すぎて使用できない) であった場合、クライアントは If-None-Match ヘッダー欄で ETag の値を送ります。

If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

サーバーは、クライアントの ETag (If-None-Match で送信されたもの) を現在のバージョンの ETag と比較し、両方の値が一致する (つまりリソースは変更されていない) 場合、サーバーは 304 Not Modified ステータスを本文なしで返送し、キャッシュされたレスポンスのバージョンがまだ使用可能 (新しい) であることをクライアントに通知します。

仕様書

仕様書 題名
RFC 7232, セクション 2.3: ETag Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests

ブラウザーの互換性

BCD tables only load in the browser

関連情報