ETag(Entity Tag)는 리소스의 특정 버전을 식별하는 불투명한 식별자(주로 콘텐츠 해시)로, 서버가 응답 헤더에 실어 보냅니다.
클라이언트가 재요청 시 이 값을 조건부 헤더로 되돌려 보내면, 서버는 내용이 그대로면 본문 없이 `304 Not Modified`만 응답해 대역폭을 절약합니다.
동작은 이렇습니다. 첫 응답에 `ETag: "abc123"`이 실리면, 이후 브라우저는 `If-None-Match: "abc123"`로 재검증 요청을 보냅니다. 리소스가 안 바뀌었으면 서버는 `304`(본문 없음)를, 바뀌었으면 `200`과 새 본문·새 ETag를 줍니다. 시간 기반의 `Last-Modified`/`If-Modified-Since`보다 정밀한데, 초 단위 미만 변경이나 내용은 같은데 타임스탬프만 다른 경우도 정확히 판별하기 때문입니다.
강한(strong) ETag와 약한(weak, `W/` 접두) ETag의 구분이 중요합니다. 강한 ETag는 바이트 단위로 완전히 동일함을 보장하고, 약한 ETag는 '의미상 동등'(예: 압축 방식만 다름)을 의미해 범위 요청(Range) 같은 곳에선 쓸 수 없습니다. 주의할 점은 `Cache-Control: max-age`가 '신선한 동안 아예 요청을 안 보내는' 것이라면, ETag는 '만료된 뒤 재검증'하는 것이라 둘은 상호보완적입니다. 또 로드 밸런싱된 여러 서버가 서로 다른 ETag를 생성하면 캐시 효율이 떨어지므로 생성 방식을 일관되게 맞춰야 합니다.