ETag는 HTTP 응답이 나타내는 자원의 특정 버전을 식별하는 헤더다. 클라이언트가 가진 내용과 서버의 현재 내용이 같은지 비교할 수 있어 캐시 재검증과 동시 수정 충돌 감지에 사용된다. 값의 생성 방법은 서버가 정한다. MDN ETag
변경되지 않은 문서의 재사용
브라우저가 문서와 함께 ETag: "article-v7"을 받았다고 가정하자. 나중에 다시 조회할 때 If-None-Match에 이 값을 보내면 서버는 현재 표현과 비교한다. 변경되지 않았다면 304 응답으로 본문을 다시 보내지 않고 저장된 내용을 쓰게 할 수 있다. 이는 HTTP 캐싱의 재검증 과정이다.
두 사람이 동시에 편집하는 경우
위키 편집자는 읽었던 버전의 ETag를 If-Match 조건으로 함께 보낼 수 있다. 그사이 다른 사람이 먼저 저장해 버전이 달라졌다면 서버는 조건 불일치를 응답해 오래된 초안이 새 내용을 덮어쓰는 일을 막을 수 있다.
| 요청 조건 | 질문하는 내용 |
|---|---|
| If-None-Match | 이 버전과 다를 때 내용을 받을 수 있는가 |
| If-Match | 내가 알고 있는 버전일 때만 수정할 수 있는가 |
조건 검사를 서버에서 실제로 수행해야 한다. ETag를 응답에 붙이기만 했다고 모든 쓰기 충돌이 방지되는 것은 아니다. MDN If-Match
강한 검증자와 약한 검증자
앞에 W/가 붙은 값은 약한 ETag다. 표현이 의미상 같다는 비교에 사용할 수 있지만 바이트가 완전히 일치함을 뜻하지 않는다. 정확한 일치가 필요한 용도에서는 강한 검증자와 해당 조건부 요청의 비교 규칙을 확인해야 한다. 편집 버전 번호와 콘텐츠 해시 중 무엇을 사용할지도 목적에 따라 달라진다.
캐시 수명과 구분하기
ETag 자체가 응답을 몇 초 동안 신선하게 취급할지 정하지는 않는다. 수명 정책은 별도의 캐시 헤더로 다룬다. REST API에서 수정 요청에 조건을 붙이더라도 사용자 인증과 편집 권한 확인은 계속 필요하다. 버전 일치와 권한 보유는 서로 다른 검사다.