ETag

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

ETag HTTP 응답 헤더는 특정 버전의 리소스를 식별하는 식별자입니다. 웹 서버가 내용을 확인하고 변하지 않았으면, 웹 서버로 full 요청을 보내지 않기 때문에, 캐쉬가 더 효율적이게 되고, 대역폭도 아낄 수 있습니다. 허나, 만약 내용이 변경되었다면, "mid-air collisions" 이라는 리소스 간의 동시 다발적 수정 및 덮어쓰기 현상을 막는데 유용하게 사용됩니다.

만약 특정 URL 의 리소스가 변경된다면, 새로운 ETag 가 생성됩니다. ETag 는 지문과 같은 역할을 하면서 다른 서버들이 추적하는 용도에 이용되기도 합니다. ETag 를 비교하여 리소스가 서로 같은지의 여부를 빠르게 판단할 수 있지만, 서버에서 무기한으로 지속될 수 있도록 설정할 수도 있습니다.

Header type Response header
Forbidden header name no

문법

ETag: W/"<etag_value>"
ETag: "<etag_value>"

지시자

W/ Optional

'W/' (대/소문자를 구분합니다.) weak validator 가 사용되었음을 나타냅니다. Weak validators 는 만들기는 쉽지만 비교하기에는 효율성이 떨어집니다. Strong validators 는 비교하기에는 이상적이지만 효율적으로 만들기가 어렵습니다. 동일한 자원의 두 가지 Weak Etag 값은 동일할 수 있지만, 바이트 단위까지 동일하진 않습니다.

"<etag_value>"

Entity tags 는 요청된 값을 ASCII 코드와 같이 고유한 형태로 나타냅니다. (예 : "675af34563dc-tr34") ETag 의 값을 생성하는 방법(Method)은 단순히 한가지로 정해져있진 않습니다. 때때로, 콘텐츠의 해시, 마지막으로 수정된 타임스탬프의 해시, 혹은 그냥 개정번호를 이용합니다. 예를들어, MDN 는 wiki(콘텐츠)의 16진수 해시를 사용합니다.

예시

ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
ETag: W/"0815"

충돌 피하기 (mid-air collisions)

ETag와 HTTP헤더의 If-Match를 이용하여 충돌을 예측할 수 있습니다.

예를 들어 MDN을 편집할 때, 현재 위키 콘텐츠는 해시되어 Etag 안에 들어갑니다.

ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"

위키 페이지에 변경사항을 저장할 때, POST의 요청은 If-Match헤더에 새로운 변경사항이 발생했는지 판별하기 위해, 기존의 ETag값을 포함하여 요청을 진행합니다.

If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

해시가 일치하지 않으면, 문서가 변경되었다는 의미이며 412 Precondition Failed (전제조건 실패) 에러를 던져주게 됩니다.

변경되지 않은 리소스의 캐싱

ETag의 다른 용례는 변경되지 않은 리소스를 캐시하는 것 입니다. 사용자가 URL을 재방문 했을 때(ETag를 가지고 있는 상태에서), 보유한 ETag가 너무 오래되어 사용될 수 없다고 판단되면, 클라이언트는 If-None-Match 헤더 필드에 ETag를 전송합니다.

If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

서버는 클라이언트의 ETag를 현재 버전 리소스의 ETag와 비교하고, 두 값이 일치하는 경우(리소스에 변경이 없는 경우) 304 Not Modified 상태를 반환합니다. 이 상태는 캐시된 버전이 여전히 유효하다는 것을 클라이언트에게 알려줍니다.

사양

사양 제목
RFC 7232, 섹션 2.3: ETag Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests

브라우저 호환성

BCD tables only load in the browser

참고