ETag 強弱比較ツール | strong/weak match を RFC 7232 で判定
HTTP レスポンスヘッダーの ETag を 2 つ並べ、RFC 7232 §2.3 の比較規則で strong match と weak match を同時に判定する開発者向けツール。W/ 接頭辞の有無と引用符内の値を解析し、キャッシュや Range 要求が成立するかを目で確認できる。
💡 このツールについて
ETag は「このリソースのこのバージョン」を表す識別子で、If-None-Match や If-Match、Range 要求の検証に使われる。やっかいなのが strong と weak の 2 種類があることで、W/"abc" と "abc" は値が同じでも扱いが違う。RFC 7232 は「strong comparison では両方が strong かつ値が完全一致のときだけ true」「weak comparison では W/ を無視して値が一致すれば true」と定めている。
この差は実害につながる。Range 要求(部分ダウンロード)は strong validator しか受け付けないため、weak な ETag を If-Range に使うとサーバーは部分応答を返さず全体を返す。逆に If-None-Match の 304 判定には weak で十分。手元で「この組み合わせはどちらの match になるか」を確かめておけば、CDN やリバースプロキシのキャッシュ挙動を読み違えずに済む。
このツールは 2 つの ETag を貼るだけで、それぞれの強弱・値・両 match の真偽・推奨用途までを一度に表示する。サーバー実装やキャッシュ設定をデバッグするときの突き合わせに使える。
🧐 よくある質問
Q. W/"abc" と "abc" は一致しますか?
weak match では一致(true)、strong match では不一致(false)。W/ が付いた時点で strong comparison からは除外されるため。
Q. 引用符は省略できますか?
できない。RFC 7232 の ETag は必ずダブルクォートで値を囲む。abc123(裸の値)は不正な書式として「形式エラー」になる。
Q. 大文字小文字や前後の空白は無視されますか?
ETag の値(opaque-tag)は大文字小文字を区別する。"ABC" と "abc" は別物。値内部の空白も意味を持つので無視されない。
Q. Range 要求にはどちらを使えばいいですか?
strong validator のみ。weak な ETag を If-Range に渡すと、サーバーは安全側に倒して 200(全体)を返す。Strong match が YES になる組み合わせを使う。
Q. ハイフンやコロンを含む ETag も比較できますか?
できる。引用符の中身は不透明な文字列として扱うので、"686897696a7c876b7e" のような 16 進ハッシュも "v2-2024-01" のような構造的な値もそのまま比較する。
📚 豆知識
ETag の語源は entity tag(実体タグ)で、HTTP/1.1 の RFC 2616 時代から存在する。当時は strong/weak の区別の定義が曖昧で、後の RFC 7232(2014 年)で比較アルゴリズムが整理された。weak validator が生まれた背景には「内容は意味的に同じだが、生成のたびに圧縮レベルやタイムスタンプで byte 単位がわずかにブレるレスポンス」がある。そうしたコンテンツに strong ETag を付けると 304 が返らずキャッシュが効かないため、W/ で「意味的に等価」とマークする逃げ道が用意された。Apache や nginx が inode やファイルサイズから自動生成する ETag は環境依存で罠になりやすく、複数サーバー構成では明示的に weak ETag を設定する運用も多い。