ETag
ETag(Entity Tag)는 HTTP 프로토콜에서 사용되는 헤더로, 웹 리소스의 특정 버전을 식별하는 고유한 식별자입니다.
동작 원리
서버가 클라이언트에게 리소스를 전송할 때 ETag 헤더를 포함시키고, 클라이언트는 이후 요청 시 If-None-Match 헤더에 이 값을 담아 조건부 요청을 보냅니다. 서버는 현재 리소스의 ETag와 비교해 값이 같으면 304 Not Modified 응답을 반환해 전체 콘텐츠를 다시 전송하지 않습니다. 이를 통해 네트워크 트래픽과 서버 부하를 줄일 수 있습니다.
Strong ETag와 Weak ETag
ETag 값은 보통 리소스 내용에 기반한 해시값이나 버전 번호로 생성되며, 두 종류로 나뉩니다.
- Strong ETag: 바이트 단위까지 정확히 일치해야 같은 리소스로 판단합니다.
- Weak ETag(
W/접두사 사용): 의미적으로 동등하면 일치하는 것으로 간주합니다.
Last-Modified와의 차이
Last-Modified 헤더와 비슷한 역할을 하지만, 타임스탬프가 아닌 콘텐츠 기반으로 동작합니다. 1초 내에 여러 번 변경되거나 시간 기반 비교가 적합하지 않은 상황에서 ETag가 더 정확한 캐싱을 제공합니다.
Cache-Control과 함께 사용하기
ETag와 Cache-Control은 서로 보완적인 관계입니다. Cache-Control이 캐시 가능 여부·유효 기간 등 캐싱 정책을 직접 지정한다면, ETag는 리소스의 변경 여부를 확인하는 재검증 메커니즘을 제공합니다. 정적 리소스는 max-age로 장기간 캐싱하되 배포 시 ETag가 바뀌어 새 버전을 받아가도록 하고, 자주 변경되는 API 응답은 no-cache로 매번 재검증을 요청하되 ETag로 불필요한 데이터 전송을 줄일 수 있습니다.
핵심 정리
ETag는 리소스 버전을 식별해 변경 여부를 판단하는 캐시 재검증 수단이며, Cache-Control과 함께 사용하면 캐시 유효성 검증과 트래픽 절감을 동시에 달성할 수 있습니다.