Computer Science/Network

[Http Cache] 캐시(Cache)의 동작 원리와 조건부 요청 - 2편

JeongKyun 2022. 6. 1.
반응형

참고

[이번 포스팅은 이전 동작원리와 조건부 요청 1편에 이어 작성하는 글입니다.]

 


 

검증 헤더와 조건부 요청


검증 헤더란?

  • 캐시 데이터와 서버 데이터가 같은지 검증하는 데이터를 말한다.
  • Last-Modified, ETag를 사용한다.

 

조건부 요청 헤더란?

  • 검증 헤더로 조건에 따른 분기하여 사용한다.
  • If-Modified-Since -> Last-Modified 사용
  • If-None-Match -> ETag를 사용
  • 조건이 만족하면 200 OK를 내려준다.
  • 조건이 만족하지 않으면 304 Not Modified를 내려준다.

 

 

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

[데이터 미변경 예시]

1. 캐시 데이터: 2020.11.10 10:00:00 vs 서버: 2020.11.10 10:00:00

->  304 Not Modified 헤더 데이터만 전송해준다. (Http Body X)

 

[데이터 변경 예시]

1. 캐시 데이터: 2020.11.10 10:00:00 vs 서버: 2020.11.10 11:00:00

->  200 OK, 모든 데이터 전송(Http Body O)

 

 

Last-Modified, If-Modified-Since 단점

1. 1초 미만 단위로 캐시 조정이 불가능하다.

2. 날짜 기반의 로직을 사용한다.

3. 데이터를 수정해서 날짜가 다르지만, 같은 데이터를 수정해서 데이터 결과가 똑같은 경우

4. 서버에서 별도의 캐시 로직을 관리하고 싶은 경우

(스페이스나 주석처럼 크게 영향이 없는 변경에서 캐시를 유지하고 싶은 경우)

 

이 단점을 보완하기 위해 아래의 개념들을 사용한다.

 

 


 

E-Tag, If-None-Match란?


  • 캐시용 데이터에 임의의 고유한 버전 이름을 달아둠
  • 예 : ETag : "v1.0", ETag: "a2awdnd1"
  • 데이터가 변경되면 이 이름을 바꾸어서 변경함(Hash를 다시 생성)
  • 예 : ETag: "aaaa", ETag: "bbbb"
  • 단순하게 ETag만 보내서 같으면 유지, 다르면 다시 받는 로직을 만들 수 있다.

 

E-Tag, If-None-Match 프로세스

ETag 사용

서버에서 ETag에 데이터를 넣어서 클라이언트로 전송한다.

 

브라우저 캐시에 ETag의 값도 같이 저장을 한다.

 

캐시 시간 초과가 발생 !

 

캐시에 들어가있는 값이 변경이 일어나지않아 클라이언트(브라우저)에서 서버로 If-None-Match에 해당 값을 실어서 보낸다.

 

서버에서 관리하고있는 ETag 값과 브라우저 캐시에 들어있는 값이 같다는 것을 서버에서 확인하고 데이터가 수정되지 않았다는 것을 알았다.

 

데이터가 변경되지않음을 안 서버는 304 Not Modified를 실어서 HTTP Body 없이 헤더만 클라이언트에게 보내준다.

 

이제 이전글에서 알아본 것과 동일하게 클라이언트에서는 가벼운 헤더만 수신받아 헤더 데이터를 브라우저 캐시 데이터에 갱신만 해준다.

 

이제 캐시 유효 시간 갱신된 클라이언트는 캐시에서 해당 값을 꺼내와서 조회한다.

 

E-Tag, If-None-Match 정리

  • 단순하게 ETag만 서버에 보내서 같으면 유지, 다르면 다시 받는 형식이다.
  • 캐시 제어 로직을 서버에서 완전히 관리한다.
  • 클라이언트는 단순히 이 값을 서버에 제공한다.

 

이것을 사용하는 이유는 예로 들어 다음과 같다.

입력창에 A라는 것이 있었는데 B를 추가하여 AB가 되었다가 B를 다시 지어 A가 되었을 경우를 생각해보자.

 

"A -> AB -> A" 이것은 데이터 변경은 일어나지 않았다. 그렇지만 이전 방법은 if-modified-since의 시간은 갱신이 되었을 것이고 그렇다면 서버에서는 새로운 데이터를 내려줄 수 밖에 없게된다.

 

그렇기에 ETag를 사용하면 시간으로 보는것이 아니라 값으로 보기 때문에 해당 문제를 해결할 수 있다.

 


 

캐시 제어 헤더를 알아보자.


Cache-Control : 캐시 제어

Pragma : 캐시 제어(하위 호환)

Expires : 캐시 유효 기간(하위 호환)

 

Cache-Control

1. Cache-Control : max-age

캐시 유효 시간, 초 단위를 말한다.

 

2. Cache-Control: no-cache

데이터는 캐시해도 되지만 항상 origin서버에 검증하고 사용한다.

 

3. Cache-Control: no-store

데이터에 민감한 정보가 있으므로 저장하면 안된다.

(메모리에서 사용하고 최대한 빨리 삭제)

 

Pragma

1. Pragma: no-cache

2. HTTP 1.0 하위 호환

 

Expires

1. expires: Mon, 01 Jan 1990 00:00:00 GMT

2. 캐시 만료일을 정확한 날짜로 지정

3. HTTP 1.0 부터 사용

4. 지금은 더 유연한 Cache-Control: max-age 권장

5. Cache-Control: max-age와 함께 사용하면 Expires는 무시한다.

 

 

댓글

💲 많이 본 글