ETag

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

指定された URL のリソースが変更された場合は、新しい Etag 値を生成する必要があります。これらを比較することで、リソースの 2 つの表現が同じかどうかを素早く判断できます。

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

構文

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

ディレクティブ

W/ 省略可

'W/' (大文字) は弱いバリデーターを使用することを示します。弱い ETag は生成が簡単ですが、比較にはあまり役立ちません。強力なバリデーターは比較には理想的ですが、効率的に生成するのはとても困難です。同じリソースを表現する 2 つの弱い ETag の値があった場合、意味的には同等ですが、バイト単位では同じではない可能性があります。すなわち、弱い ETag はバイト範囲指定のリクエストが行われたときにキャッシュされませんが、強い ETag は範囲指定のリクエストもキャッシュします。

"<etag_value>"

リクエストされたリソースを一意に表すエンティティタグです。これは二重引用符で囲まれた ASCII 文字列であり、 "675af34563dc-tr34"のような形です。 ETag 値を生成する方法は指定されていません。コンテンツのハッシュ、最終更新タイムスタンプのハッシュ、単なるリビジョン番号などがよく使用されます。例えば、 Wiki エンジンは、文書内の記事コンテンツの 16 進ハッシュを使用することがあります。

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

空中衝突の回避

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

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

http
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"

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

http
If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

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

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

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

http
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

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

仕様書

Specification
HTTP Semantics
# field.etag

ブラウザーの互換性

BCD tables only load in the browser

関連情報