이번 TIL은 인프런의 "모든 개발자를 위한 HTTP 웹 기본 지식"을 학습하고, 정리한 내용입니다.
만약, 제 글의 내용을 퍼갈 시에는 " 모든 개발자를 위한 HTTP 웹 기본 지식 "도 출처에 첨부하시기 바랍니다.
검증 헤더에는 크게 2가지가 있다. Last-Modified
와 ETag
그리고 Last-Modified
와 ETag
를 활용해서, 클라이언트해서 요청을 할 때, 조건부 요청 헤더를 만들어서 보내면 된다.
If-Modified-Since 는 Last-Modified
와 같이 사용되고,
If-None-Match 는 ETag
랑 같이 사용한다.
3XX 상태 코드는 "리다이렉션" 하라는 의미이다.
즉, 304는 어디로 리다이렉션을 하라?? "너의 캐시로 리다이렉션해서 그 데이터를 갖다 뿌리세요~ "라는 의미이다.
사실, 1초 미만 단위로 조정할 일은 별로 없다.
하지만, 이 부분이 치명적인데, 데이터를 수정한 날짜는 다르지만, 실제로 데이터의 결과값이 같다면???
(word 파일을 수정했다가 원래대로 다시 돌려놨는데, "최종 수정시간"은 변경되있다. 최종 파일이 내가 캐시에서 들고 있는 값과 똑같은데도 말이다. )
이런 경우에도 전체 데이터를 전부 다시 다운로드 한다.
그래서, 날짜 기반이 아니라, 다른 로직으로 데이터를 비교하고 싶다면??
ex) 스페이스나 주석은 크게 영향이 없기 때문에, 만료된 캐시의 데이터를 쓰고 싶을 때
이럴 때는 서버에서 완전하게 캐시 메커니즘을 컨트롤할 수있는 방법이 있다.
그게 바로 "ETag"이다!!
날짜가 아니라, 서버에서 임의의 이름을 붙여놓는다.
예시처럼 버전으로 달 수도 있고, 그냥 아무거나 짚어넣을 수도 있다.
하지만, 해쉬 값을 이름으로 부여할 수도 있다.
파일 같은 거를 "해쉬 알고리즘"에 넣어서 "해쉬 결과"를 받을 수 있다.
그럼 해쉬는 파일이 동일하면, 똑같은 결과가 나온다.
보통 해쉬 라이브러리가 제공이 되는데, 거기다 파일을 짚어넣으면 그 파일의 컨텐츠가 똑같으면, 똑같은 해쉬값이 나온다. 파일의 컨텐츠 값이 조금이라도 다르면 완전 다른 해쉬값이 출력된다.
이런 방법을 사용하면, 원본을 조금 수정했다가 다시 원본처럼 만들면 => 해쉬값을 똑같이 나온다.
이런 경우는 만료된 캐시를 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 응답을 받으면, 웹 브라우저는 내부적으로 캐시를 갱신한다. 하지만, 캐시가 가지고 있는 기존 데이터는 재활용한다.
캐시 제어 로직을 100% 서버에서 관리하기 때문에, 클라이언트 입장에서는 완전 까막눈이다.
클라이언트는 캐시 메커니즘을 전혀모르기 때문에, 그저 ETag 값을 서버에 전달하는 역할만 할 뿐이다.