캐시

캐시가 없다면 데이터가 변경되지 않더라도 매번 네트워크를 통해서 데이터를 다운로드 받아야 한다.

하지만 네트워크는 매우 느리고 비싸기 때문에 브라우저 로딩 속도에 영향을 준다. 이러한 이유로 캐시를 사용하는 것이 좋다.

 

헤더 종류

캐시 제어 헤더

  • Cache-Control: 캐시 제어
    • 오리진 서버뿐만 아니라 프록시 캐시 서버도 제어할 수 있다.
  • Pragma: 캐시 제어(하위 호환)
  • Expires: 캐시 유효 기간(하위 호환)

검증 헤더

  • 캐시 유효시간이 초과하더라도, 캐시 데이터와 서버 데이터가 동일한지 검증하는 용도
    • 동일한 경우 메세지 바디 없이 304로 응답
  • 응답 시 사용
  • 종류
    • ETag : 캐시용 데이터에 임의의 고유한 버전 이름을 달아둠. ex) ETag: "v1.0"
    • Last-Modified : 마지막으로 수정된 날짜와 시간이 명시된다. ex) 2023년 4월 910:00:00

조건부 요청 헤더

  • 조건을 만족하면 200 OK, 만족하지 않으면 304 Not Modified를 반환
  • 요청 시 사용
  • 종류
    • If-Match, If-None-Match: ETag 값 사용
    • If-Modified-Since, If-Unmodified-Since: Last-Modified 값 사용

 

ETag vs Last Modified

날짜 기반의 Last Modified는 다음의 단점을 가지고 있다.

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

2. 날짜 기반의 로직이 사용되며, 서버가 별도의 캐시 로직을 관리하지 않음.

  • 수정된 결과가 이전 버전과 동일하더라도, 서로 다른 데이터로 인식된다. 이때 서버는 캐시 로직을 관리하지 않기 때문에 아무것도 할 수 없다.

 

이와 달리 ETag는 캐시 제어 로직을 서버 측에서 관리할 수 있다.

 

캐시 무효화

확실하게 캐시를 무효화하기 위해서는 다음과 같이 작성한다.

Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
  • Cache-Control: no-cache
    • 데이터는 캐시해도 되지만, 항상 원 서버에 검증하고 사용
    • 원 서버 접근 실패 시 설정에 따라서 캐시 데이터를 반환할 수 있음.(Error or 200 OK)
  • Cache-Control: no-store
    • 데이터에 민감한 정보가 있으므로 저장 X(메모리에서 사용하고 최대한 빨리 삭제)
  • Cache-Control: must-revalidate
    • 캐시 만료후 최초 조회 시 원 서버에 검증해야 함
      • 캐시 유효시간이라면 캐시 사용
    • 원 서버 접근 실패 시 반드시 오류가 발생해야 함(504 Gateway Timeout)
  • Pragma: no-cache
    • HTTP 1.0 하위 호환

'개발 도서 및 강의 > 모든 개발자를 위한 HTTP 웹 기본 지식' 카테고리의 다른 글

7. HTTP - 일반 헤더  (0) 2023.04.09
6. HTTP 상태 코드  (0) 2023.04.02
5. HTTP 메서드 활용  (0) 2023.04.02
3. HTTP 기본  (0) 2023.04.02
4. HTTP 메서드  (0) 2023.03.29

+ Recent posts