ETagETag(Entity Tag)는 특정 리소스 표현의 버전을 식별하는 불투명(opaque) 문자열입니다. 리소스 내용이 바뀌면 ETag도 바뀌므로, 클라이언트와 서버는 이 값을 비교해 캐시가 여전히 유효한지 판단하거나 낙관적 동시성 제어를 수행합니다.
값은 큰따옴표로 감싸며, 약한 검증자를 뜻하는 W/ 접두사를 붙일 수 있습니다.
캐시 재검증: 클라이언트가 리소스를 캐시할 때 ETag를 함께 저장하고, 다음 요청에 If-None-Match: "<etag>"로 되돌려 보냅니다. 서버는 현재 ETag가 같으면 304 Not Modified(본문 없음)를 응답해 대역폭을 절약하고, 다르면 200과 새 본문을 보냅니다.
낙관적 동시성(Optimistic Locking): 수정 요청에 If-Match: "<etag>"를 실으면, 서버는 그 사이 리소스가 바뀌지 않았을 때만 수정을 적용하고, 바뀌었으면 412 Precondition Failed로 거부합니다. 이는 여러 사용자가 동시에 편집할 때 덮어쓰기 충돌(lost update)을 막습니다.
강한 ETag는 바이트 단위로 완전히 동일할 때만 같고, 약한 ETag(W/)는 의미상 동등하면 같다고 봅니다. 압축 방식이나 사소한 차이를 무시하고 싶을 때 약한 ETag를 씁니다. Range 요청의 If-Range에는 강한 검증자만 안전하게 쓸 수 있습니다.
ETag: [W/]"<opaque-validator>"e.g. ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"