컴퓨터 공학 & 통신

HTTP ETag 응답 헤더 (+ If-Match, If-None-Match 요청 헤더)

왈왈디 2025. 8. 31. 23:11
728x90

ETag란?

Etag는 http 응답 헤더의 일종으로,

특정 버전의 리소스를 식별하는 식별자이다.

 

ETag는 리소스의 지문과 같은 역할로,

만약 특정 URL 의 리소스가 변경된다면, 새로운 ETag 가 생성된다.

ETag를 비교하면 리소스가 동일한지 빠르게 판단할 수 있다.

 

리소스가 변동 없고 ETag가 동일하다면 서버는 새로운 응답을 보낼 필요가 없기 때문에

캐쉬를 더 효율적으로 사용할 수 있고, 대역폭 사용량을 줄일 수 있다.

 

만약 리소스가 변경되었다면,

"mid-air collisions"라는 리소스 간의 동시 다발적 수정 및 덮어쓰기 현상을 막는데 유용하다.

문법

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

 

Weak ETag(W/) 는 리소스가 실질적으로 같은 의미를 가진다면 동일하다고 간주하는 방식이다.

비트 단위로는 달라도 “같은 콘텐츠”라고 볼 수 있는 경우에 사용한다.

W/가 붙은 ETag는 “이 리소스는 대충 같은 거야”라는 서버의 힌트이고,
W/가 없는 건 trong validator가 사용되었다는 의미로 “비트까지 완전히 같아”라는 약속이다.

 

아래는 사용 예시이다.

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

 

ETag는 응답 값을 ASCII 코드와 같이 고유한 형태로 나타낸다.

ETag 의 값을 생성하는 방법(Method)은 단순히 한가지로 정해져있진 않다.

콘텐츠의 해시, 마지막으로 수정된 타임스탬프의 해시, 혹은 그냥 개정번호를 이용한다.

예를들어, MDN은 wiki(콘텐츠)의 16진수 해시를 사용한다.

 

사용법1 - 충돌 피하기 (mid-air collisions)

ETag와 http 요청 헤더인 If-Match 헤더를 사용하여

리소스의 충돌을 예측할 수 있다.

 

예를 들어, 웹 페이지에서 사용자가 다른 사용자도 수정할 수 있는 문서를 수정하고 있는 상황이다.

이때 이 사용자가 수정한 문서를 저장하기 위해 POST 요청을 보냈다.

이 POST 요청은 If-Match 헤더로 사용자가 수정을 시작한 시점의 리소스의 Etag 값을 담아 보낸다.

서버는 요청의 If-Match 헤더에 담긴 ETag 값이 현재의 ETag값과 동일한지 확인하고,

동일하지 않다면 그 사이에 이미 리소스가 수정되었기 때문에 요청을 성공 시키지 않고,

412 Precondition Failed (전제조건 실패) 에러를 반환한다.

 

사용법2 - 변경되지 않은 리소스의 캐싱

또 다른 Etag의 사용 목적은 변경되지 않은 리소스를 캐시하는 것이다.

클라이언트는 ETag를 가지고 있다면 ETag를 If-None-Match 헤더 필드에 담아 요청을 전송한다.

If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

서버는 클라이언트가 요청 헤더에 담아 보낸 ETag를 현재 버전 리소스의 Etag와 비교하고,

두 값이 일치하는 경우에는 304 Not Modified 상태 코드를 반환한다.

이 때 응답 body는 비어있다.

 

304 응답 코드를 받으면 클라이언트는 캐시된 버전이 여전히 유효하다는 것을 알 수 있다.

 

참고 자료

728x90