검증 헤더와 조건부 요청 - ETag

조 은길·2022년 3월 21일
0

HTTP 웹 기본 지식

목록 보기
30/32
post-thumbnail

이번 TIL은 인프런의 "모든 개발자를 위한 HTTP 웹 기본 지식"을 학습하고, 정리한 내용입니다.
만약, 제 글의 내용을 퍼갈 시에는 " 모든 개발자를 위한 HTTP 웹 기본 지식 "도 출처에 첨부하시기 바랍니다.


검증 헤더에는 크게 2가지가 있다. Last-ModifiedETag

그리고 Last-ModifiedETag를 활용해서, 클라이언트해서 요청을 할 때, 조건부 요청 헤더를 만들어서 보내면 된다.

If-Modified-Since 는 Last-Modified와 같이 사용되고,

If-None-Match 는 ETag랑 같이 사용한다.


If-Modified-Since: 이후에 데이터가 수정되었으면?

3XX 상태 코드는 "리다이렉션" 하라는 의미이다.
즉, 304는 어디로 리다이렉션을 하라?? "너의 캐시로 리다이렉션해서 그 데이터를 갖다 뿌리세요~ "라는 의미이다.

Last-Modified, If-Modified-Since 의 단점

사실, 1초 미만 단위로 조정할 일은 별로 없다.

하지만, 이 부분이 치명적인데, 데이터를 수정한 날짜는 다르지만, 실제로 데이터의 결과값이 같다면???

(word 파일을 수정했다가 원래대로 다시 돌려놨는데, "최종 수정시간"은 변경되있다. 최종 파일이 내가 캐시에서 들고 있는 값과 똑같은데도 말이다. )

이런 경우에도 전체 데이터를 전부 다시 다운로드 한다.

그래서, 날짜 기반이 아니라, 다른 로직으로 데이터를 비교하고 싶다면??

ex) 스페이스나 주석은 크게 영향이 없기 때문에, 만료된 캐시의 데이터를 쓰고 싶을 때

이럴 때는 서버에서 완전하게 캐시 메커니즘을 컨트롤할 수있는 방법이 있다.

그게 바로 "ETag"이다!!

ETag, If-None-Match

날짜가 아니라, 서버에서 임의의 이름을 붙여놓는다.

예시처럼 버전으로 달 수도 있고, 그냥 아무거나 짚어넣을 수도 있다.

하지만, 해쉬 값을 이름으로 부여할 수도 있다.

파일 같은 거를 "해쉬 알고리즘"에 넣어서 "해쉬 결과"를 받을 수 있다.
그럼 해쉬는 파일이 동일하면, 똑같은 결과가 나온다.

보통 해쉬 라이브러리가 제공이 되는데, 거기다 파일을 짚어넣으면 그 파일의 컨텐츠가 똑같으면, 똑같은 해쉬값이 나온다. 파일의 컨텐츠 값이 조금이라도 다르면 완전 다른 해쉬값이 출력된다.

이런 방법을 사용하면, 원본을 조금 수정했다가 다시 원본처럼 만들면 => 해쉬값을 똑같이 나온다.

이런 경우는 만료된 캐시를 If-Modified-Since가 달라도 사용할 수있다.

그래서, 데이터 값이 변경되면, ETag의 이름도 바꿔줘서 해시를 생성하도록 하면 된다.

이 로직이 생각보다 단순한 것이 클라이언트 입장에서 ETag만 보내서 같으면, 만료된 캐시를 재사용(유지), 다르면 다시 받기!!

이제 ETag를 활용하는 방법을 알아보자!!

이제 요청을 하면, 서버에서 받아서 ETag라는 것을 내려준다.

응답 메시지를 받은 웹 브라우저는 캐시 유효기간과 함께 ETag 값을 함께 저장한다.

2번째 요청을 하는데, 요청 전에 캐시 저장소를 뒤져보니까 해당 캐시의 유효기간이 초과되어있다.

그러면, 클라이언트는 가지고 있는 ETag 값을 If-None-Match에 담아서 서버로 보낸다.

If-None-Match "만약 매치가 안 되면" 이라는 뜻인데, ETag의 값이 똑같이 매치가 됐기 때문에, If-None-Match은 실패했다!!

304 Not Modified를 보내고, HTTP Body는 보내지 않는다. 캐시에 있는 데이터를 쓰면 되니까...

HTTP 응답을 받으면, 웹 브라우저는 내부적으로 캐시를 갱신한다. 하지만, 캐시가 가지고 있는 기존 데이터는 재활용한다.

ETag, If-None-Match 정리

캐시 제어 로직을 100% 서버에서 관리하기 때문에, 클라이언트 입장에서는 완전 까막눈이다.

클라이언트는 캐시 메커니즘을 전혀모르기 때문에, 그저 ETag 값을 서버에 전달하는 역할만 할 뿐이다.

profile
좋은 길로만 가는 "조은길"입니다😁

0개의 댓글