최신 인기가요 정보를 저장하고 있는 current_top_music.json이라는 파일이 서버에 있고, Client는 해당 파일을 다운로드해서 사용한 뒤 로컬에 캐싱한다.

current_top_music.json이라는 파일은 서버에서 빈번하게 업데이트되기 때문에 Client는 로컬에 캐싱된 파일과 서버에 있는 파일이 일치하는지 다운로드전에 확인할 수 있어야 한다.

위와 비슷한 상황은 사실 너무 자주 마주하게된다. 해결 방법이 필요하다.

W3C Spec을 참고해보니 Content-MD5 또는 ETag를 이용해서 해결할 수 있을 것 같다.

둘중에 어떤게 가장 적합한가? 고민하다보니 2개가 너무 비슷한 것 같다. 쌍둥이가 아닌가 하는 생각이 들 정도다.

그래서 Content-MD5와 ETag는 뭐가 다른가? 찾아보니 가장 뚜렷한 차이점은 사용 목적이다.

 

1. Purpose of Contrent-MD5

Content-MD5의 사용 목적은 Client 혹은 서버에서 보낸 데이터가 유실없이 정상적으로 상대방에게 도착했는가? 여부를 확인하기 위한 목적으로 만들어진 Filed다.

Network는 기본적으로 데이터의 유실 가능성이 있기 때문에 파일의 MD5 Digest를 함께 보내서 유실 여부를 확인하도록 되어있다.

 

2. Purpose of ETag

Web cache validation을 구현하기 위한 목적으로 만들어진 Field로써, ETag만을 비교해서 resource의 변경 여부를 빠르게 확인할 수 있도록 서버가 resource에 opaque identifier를 부여하고, Client를 이를 비교해서 resource의 변경 여부를 검사할 수 있다.

ETag를 생성하는 알고리즘에 대해서는 HTTP Specification에 명시되지 않았으나, MD5 Digest와 같은 Checksum을 많이 사용하는 것 같다.

(* AWS S3도 5G 미만의 파일에 대해서는 단순히 MD5 Digest를 ETag로 사용한다.)

 

 

결론 : end-to-end message integrity check (MIC)를 위해서는 Content-MD5를 사용하는게 바람직하고, 파일의 변경 여부를 확인하기 위해서는 ETag를 사용하는게 바람직하다.