ETag 【entity tag】 エンティティタグ
概要
ETag(entity tag)とは、Webコンテンツの伝送に用いられるHTTPの制御情報の一つで、サーバ上の資源の特定の版に一対一に対応する識別子。クライアントは受信したコンテンツをキャッシュする際にETagを控えておき、次回のアクセス時に問い合わせることで更新されたか知ることができる。Webサーバはクライアントに資源を送信する際、HTTPレスポンスヘッダの「ETag:」フィールドにETag値を記載する。ETag値は資源(ファイルなど)の特定のバージョンごとに一意であり、同じ資源であっても更新・修正が行われ内容が変化すると新しい値に更新される。HTTPヘッダ上でのETagの値は「ETag: "0123abcd"」のようにダブルクォーテーション(")で括る。
通常のETag値は資源の内容がわずかでも変化すると更新される「強いETag値」だが、「W/"6789wxyz"」のように先頭に「W/」を付与した場合は、実質的な内容が同じである限り更新されない「弱いETag値」となる。例えば、あるWikiページのコンテンツ部分は更新されていないが、ページ全体で見ると「最近更新されたページ」欄が変化しているといった場合にいちいち再送信しないようにできる。
ETagは資源ごと、版ごとに一意であるという条件を満たせばどのようなルールで生成してもよく(規格では生成方法を定めていない)、Webサーバやアプリケーションごとに生成手法は異なっている。よく用いられるのはファイルの内容や最終更新日時から算出したハッシュ値で、ETag値そのものには意味や順序などはなく、同一か否か判定する以外の機能は持たない。
キャッシュの制御
Webブラウザなどのクライアントには、受信した資源をストレージ上のファイルとして保存しておき、表示のたびに受信し直さなくてよいようにする「キャッシュ」の仕組みがあるが、キャッシュを作成する際にサーバから添付されたETagも一緒に保存しておく。
次に資源が呼び出された際、クライアントはサーバに同じ資源を再度要求するが、HTTPリクエストヘッダに「If-None-Match:」フィールドなどを用いて前回取得したETagを記載する。サーバ側は送られてきたETagを現在のものと比較し、更新されていれば資源を再送信、されていなければ「304 Not Modified」応答のみを送信してキャッシュの内容を利用するよう指示する。
更新の衝突回避
WikiやWebDAVなどサーバ上の資源の内容をクライアントが更新できるWebアプリケーションの場合には、複数の利用者による更新タイミングがかち合ってしまい、後から行われた更新で内容が上書きされてしまう衝突現象の回避にもETagが用いられる。
クライアントは編集のために取り寄せた資源のETagを記録しておく。更新時にはPUTメソッドなどで資源を送信してサーバ上の資源の上書きを要求するが、このとき取得時のETagをHTTPリクエストヘッダの「If-Match:」フィールドなどに記載する。
サーバは送られてきたETagを現在のものと比較し、一致すれば資源の更新を受け付ける。一致しない場合はクライアントの資源取得から現在までに誰かが内容を更新していることになるため、更新を拒否して「412 Precondition Failed」エラーなどでクライアントに衝突発生を知らせる。