ひとことで言うと
ETag(Entity Tag)はサーバーがHTTPレスポンスヘッダーで返すファイルの識別子で、通常はファイルのハッシュ値や更新日時から生成されます。ブラウザは前回受け取ったETagをキャッシュに記憶し、次のリクエスト時に`If-None-Match`ヘッダーで送ります。サーバーがETagを比較して一致していれば304(更新なし)を返し、不一致なら新しいコンテンツを200で返します。
この仕組みにより、内容が変わっていないファイルは転送量0でキャッシュから表示でき、変更があった場合は確実に新しいコンテンツを取得できます。AI生成HTMLを差し替えた場合、サーバーが新しいETagを返すことでブラウザは自動的に最新版を取得するため、確認者が手動でキャッシュクリアしなくて済みます。
- 相手がログインなしで開ける状態か確認する
- PCとスマホで最低1回ずつ表示を確認する
- 内部情報・個人情報・不要な外部送信が残っていないか見る
- レビュー期限と修正時の差し替え方を決めておく
HTML共有で関係する場面
ギガサイト便のようなCloudflare静的配信サービスはETagを自動生成し、ファイルが更新されると新しいETagを発行します。これにより確認者が同じURLをリロードした際、コンテンツが変わっていれば自動的に最新版が取得されます。ただしCDNのエッジにキャッシュが残っている場合は、オリジンからの新しいETagがエッジに伝わるまでタイムラグが生じることがあります。
共有HTMLを複数回差し替える場合、各バージョンのETagが正しく更新されているかを開発者ツールのNetworkタブで確認できます。「Response Headers」欄にある`ETag`の値が差し替え前後で変化していれば、サーバーが更新を認識していることを確認できます。「ETagが変わっていないのに内容が違う」という場合はキャッシュの不整合が起きているサインです。
よくある誤解
「ETagが同じなら内容も同じ」とは必ずしも言えません。ETagの生成方式はサーバー実装に依存し、一部のサーバーでは更新日時だけからETagを生成するため、内容が同じでも時刻が変わるとETagが変わることがあります。逆に、コンテンツが変わってもETagの更新が遅延するケースもあります。
「ETagをオフにすれば常に最新版が届く」という考え方も誤りです。ETagを使わない場合はmax-ageが切れるまでブラウザがサーバーに問い合わせないため、更新を検知できません。ETagは積極的に活用した方がキャッシュ効率と鮮度のバランスを保てます。
安全に使うための注意点
ETag自体にセキュリティリスクはほぼありませんが、複数台構成のサーバーでiノード番号を使ったETagを生成していると、サーバーごとに異なる値が返されてキャッシュが機能しないことがあります。Nginxなどではiノード番号を含まないETag設定(`etag off; expires 0;`等)に変更するのが一般的です。静的HTML共有の場合はホスティングサービスが処理するため意識する機会は少ないですが、自前サーバーで共有している場合は確認しておきましょう。
機密HTMLをプレビュー共有するとき、ETagがサーバーログやプロキシログに記録される場合があります。ETag自体は安全ですが、ハッシュ値からコンテンツを推測される可能性がゼロではありません(ハッシュの衝突)。高機密の文書をURLで共有する場合は、ETagの漏洩よりもアクセス認証の有無を優先して検討してください。
よくある質問
ETagとLast-Modifiedはどちらを優先すべきですか?
ETagの方が精度が高いとされています。Last-Modifiedは秒単位の精度のため、1秒以内に更新が発生した場合に検知できません。ETagはコンテンツのハッシュを使うため、同秒内の変更でも検出できます。
ブラウザが送るIf-None-Matchヘッダーはどこで確認できますか?
開発者ツール(F12)→「Network」タブでリクエストを選択し、「Request Headers」を見るとIf-None-Matchが確認できます。前回のETag値が自動的に付与されているはずです。
静的HTMLをギガサイト便で配信するとき、ETagは自動で設定されますか?
はい、Cloudflare Pages・Workers等を経由する静的配信ではETagが自動付与されます。ファイルを差し替えてアップロードし直すと新しいETagが発行され、ブラウザは次のリロード時に更新を検知します。