Web

[HTTP 웹 기본 지식] 섹션8. HTTP 헤더2 캐시와 조건부 요청

Ella_K 2022. 11. 20. 00:48

※ 김영한 님의 인프런 "모든 개발자를 위한 HTTP 웹 기본 지식" 강의를 요약한 내용입니다.

 캐시

📌 캐시가 없을 때

  • 데이터가 변경되지 않아도 계속 네트워크를 통해 데이터를 다운로드 받아야함
  • 인터넷 네트워크는 매우 느리고 비쌈
  • 브라우저 로딩 속도가 느림
  • 느린 사용자 경험

📌 캐시 적용

  • 캐시 덕분에 캐시 가능 시간동안 네트워크를 사용하지 않아도 된다.
  • 비싼 네트워크 사용량을 줄일 수 있음
  • 브라우저 로딩 속도가 빠름
  • 빠른 사용자 경험

📌 캐시 시간 초과

  • 캐시 유효 시간이 초과하면, 서버를 통해 데이터를 다시 조회하고 캐시를 갱신한다.
  • 네트워크 다운로드 발생

 

검증 헤더와 조건부 요청

📌 검증 헤더 Last-Modified & 조건부 요청 if-modified-since 사용

  • 첫번째 요청시 서버는 클라이언트에 데이터와 함께 Last-Modified헤더에 데이터가 마지막에 수정된 시간을 담아 보낸다.
  • 응답 결과를 데이터 최종 수정일과 함께 브라우저 캐시에 저장한다.
  • 다음 요청 시 캐시 시간이 초과 됬으면, 요청 if-modified-since헤더에 캐시가 가지고 있는 데이터 최종 수정일을 담아 보낸다.
  • 서버에서 데이터 최종 수정일을 확인해서 동일하면, 304 Not Modified 상태코드로 HTTP Body없이 헤더 메타 정보만 응답한다.
  • 브라우저 캐시는 응답 결과를 재사용하고 헤더 데이터를 갱신한다.
  • 웹 브라우저는 데이터를 브라우저 캐시에서 조회 한다.
  • 결과적으로 네트워크 다운로드가 발생하지만 용량이 적은 헤더 정보만 다운로드

단점

  • 1초 미만 단위로 캐시 조정 불가능
  • 날짜 기반의 로직 사용
  • 데이터를 수정해서 날짜가 다르지만, 같은 데이터를 수정해서 데이터 결과가 똑같은 경우
  • 서버에서 별도의 캐시 로직을 관리하고 싶은 경우

📌 검증 헤더 ETag & 조건부 요청 if-None-Match 사용

  • ETag (Entity Tag) : 캐시용 데이터에 임의의 고유한 버전 이름을 달아둠
  • ETag만 보내서 같으면 유지, 다르면 다시 받기
  • 첫 번째 요청시 서버는 클라이언트에 데이터와 함께 ETag 헤더에 태그를 담아 보낸다.
  • 브라우저 캐시에 응답 결과와 ETag 값을 저장한다.
  • 다음 요청 시 캐시 시간이 초과 됬으면, 요청 if-None-Match 헤더에 캐시가 가지고 있는 태그값을 담아 보낸다.
  • 서버에서 태그값을 확인해서 동일하면, 304 Not Modified 상태코드로 HTTP Body없이 헤더 메타 정보만 응답한다.
  • 브라우저 캐시는 응답 결과를 재사용하고 헤더 데이터를 갱신한다.
  • 웹 브라우저는 데이터를 브라우저 캐시에서 조회 한다.
  • 캐시 제어 로직을 서버에서 완전히 관리 (클라이언트는 캐시 메커니즘을 모른다.)
    • 애플리케이션 배포 주기에 맞추어 ETag 모두 갱신

📌 Cache-Control

  • max-age: 캐시 유효 시간, 초 단위
  • no-cache: 데이터는 캐시해도 되지만, 항상 원 서버에 검증하고 사용
  • no-store: 데이터에 민감한 정보가 있으므로 저장하면 안됨

 

프록시 캐시

웹 브라우저, 원 서버 중간에 위치하는 캐시 서버 (public 캐시)

📌 Cache-Control

  • Cache-Control: public
    • 응답이 public 캐시에 저장되어도 됨
  • Cache-Control: private
    • 응답이 해당 사용자만을 위한 것임, private 캐시에 저장해야 함(기본값)
  • Cache-Control: s-maxage
    • 프록시 캐시에만 적용되는 max-age
  • Age: 60 (HTTP 헤더)
    • 오리진 서버에서 응답 후 프록시 캐시 내에 머문 시간(초)

📌 캐시 무효화

확실한 캐시 무효화 응답

  • Cache-Control: no-cache, no-store, must-revalidate
  • Pragma: no-chache (HTTP 1.0 하위 호환)

Cache-Control: no-cache

  • 데이터는 캐시해도 되지만, 항상 원 서버에 검증하고 사용
  • 원서버에 접근할 수 없는 경우 프록시 캐시 서버 설정에 따라서 캐시 데이터를 반환할 수 있다.
    • Error or 200 OK 응답

Cache-Control: no-store

  • 데이터에 민감한 정보가 있으므로 저장하면 안됨

Cache-Control: must-revalidate

  • 캐시 만료후 최초 조회시 원 서버에 검증해야함
  • 원 서버 접근 실패시 반드시 오류가 발생해야함 - 504(Gateway Timeout)
  • must-revalidate는 캐시 유효 시간이라면 캐시를 사용함

Pragma: no-cache

  • HTTP 1.0 하위 호환