**ETag(Entity Tag)**는 HTTP 응답 헤더 중 하나로, 특정 버전의 리소스를 식별하기 위한 **"데이터의 지문(Fingerprint)"**과 같은 역할을 합니다. 웹 서버가 리소스의 내용이 변경되었는지 확인하여 불필요한 데이터 전송을 줄이는 데 핵심적인 도구입니다.
1. 작동 원리 (캐시 검증 과정)
브라우저가 서버에 데이터를 요청할 때 ETag는 다음과 같은 흐름으로 작동합니다.
- 첫 번째 요청: 클라이언트가 index.html을 요청합니다.
- 서버 응답: 서버는 파일을 보내면서 헤더에 **ETag: "v1.2-abcde"**와 같은 고유한 값을 실어 보냅니다.
- 클라이언트 저장: 브라우저는 받은 파일과 함께 이 ETag 값을 캐시에 저장합니다.
- 두 번째 요청 (재검증): 나중에 다시 같은 파일을 요청할 때, 브라우저는 저장해둔 ETag를 If-None-Match: "v1.2-abcde" 헤더에 담아 서버에 물어봅니다.
- 서버 판단:
- 내용이 같다면: 서버는 304 Not Modified 응답을 보냅니다. 이때 메시지 본문(Body)은 비어 있어 매우 빠릅니다.
- 내용이 바뀌었다면: 서버는 새로운 데이터와 함께 200 OK 및 새 ETag를 보냅니다.
2. 강한 검증(Strong) vs 약한 검증(Weak)
ETag는 검증의 엄격함에 따라 두 가지 형태로 나뉩니다.
- 강한 ETag (Strong ETag):
- 형태: "abcde123"
- 특징: 리소스가 바이트 단위로 완벽하게 일치해야 합니다. 조금이라도 다르면 다른 값으로 취급합니다.
- 약한 ETag (Weak ETag):
- 형태: W/"abcde123"
- 특징: 리소스가 의미적으로 동일하면 같다고 간주합니다. (예: 광고 문구만 바뀌거나 성능상 큰 차이가 없는 사소한 변경)
3. ETag vs Last-Modified
데이터의 수정 여부를 확인하는 방법에는 Last-Modified(최종 수정 시각)도 있습니다. 왜 ETag를 더 선호할까요?
| 비교 항목 | Last-Modified | ETag (Entity Tag) |
| 판단 기준 | 파일의 마지막 수정 시간 | 파일 내용의 해시(Hash) 값 |
| 정밀도 | 초 단위까지만 측정 가능 (1초 이내 변경 감지 불가) | 내용이 바뀌면 무조건 감지 (매우 정밀) |
| 단점 | 내용이 그대로인데 시간만 바뀌어도 재다운로드함 | 해시 계산을 위한 서버 CPU 자원 소모 |
| 권장 사항 | 보조적인 수단 | 현대 웹의 표준적인 캐시 검증 수단 |
4. 실무 활용 팁
- 성능 최적화: ETag를 사용하면 서버는 데이터 전체를 다시 보낼 필요 없이 "바뀐 거 없으니 네 캐시 그대로 써!"라고 짧게 대답할 수 있습니다. 이는 네트워크 대역폭을 크게 아껴줍니다.
- 로드 밸런싱 주의: 서버가 여러 대일 때, 같은 파일이라도 서버마다 해시를 만드는 방식이 다르면 ETag 값이 달라질 수 있습니다. 이 경우 클라이언트는 내용이 같은데도 계속 새로 다운로드하는 문제가 생기므로, 클러스터 환경에서는 서버 간 ETag 생성 알고리즘을 통일해야 합니다.
5. 요약
ETag는 서버가 리소스에 붙여주는 '버전 태그'입니다.
클라이언트가 "내가 가진 이 태그(If-None-Match)랑 네가 지금 가진 거랑 같아?"라고 물어봤을 때, 서버가 "응 같아(304)"라고 하면 통신 비용을 획기적으로 줄일 수 있습니다.
'Coding Study > FrontEnd Study Note' 카테고리의 다른 글
| 관계형 데이터베이스와 비관계형 데이터베이스 (0) | 2026.03.17 |
|---|---|
| 클라이언트 사이드 라우팅 (0) | 2026.03.17 |
| OSI 7계층 (0) | 2026.03.11 |
| Next.js가 제공하는 캐싱 (0) | 2026.03.04 |
| package.json 의존성 삼형제 (0) | 2026.03.04 |