HTTP 헤더 - 캐시와 조건부 요청

MoMoon·2022년 2월 25일
0

HTTP

목록 보기
7/7

캐시

1) 기본 동작

클라이언트가 요청 -> 응답 결과를 브라우저 캐시에 저장 -> 캐시 유효 시간 검증 -> 캐시에서 조회

2) 캐시 제어 헤더

  • Cache-Control: 캐시 제어
    • max-age : 캐시 유효시간, 초단위
    • no-cache : 데이터는 캐시해도 되지만, 항상 오리진 서버에 검증하고 사용
    • no-store : 데이터에 민감한 정보가 있으므로 저장 X (메모리에서 사용하고 최대한 빠른 삭제)
  • Pragma: 캐시 제어 (하위 호환)
  • Expires: 캐시 만료일을 지정 (날짜) (하위호환)

3) 검증 헤더와 조건부 요청

- 캐시 만료 후에도 서버에서 데이터는 변경되지않음
- 데이터를 전송 받은 대신에 저장해 두었던 캐시를 재사용
- 단 클라이언트의 데이터와 서버의 데이터가 같다는 검증 방법이 필요
  • Last-Modefied : 데이터가 마지막에 수정된 시간
    위 기본 동작의 응답 결과로 수정된 시간도 같이 가져옴
    ㄴ 요청 시 if-modeified-since: [?] 헤더에 추가 -> HTTP 바디을 빼고 헤더만 클라이언트에 전송, 304 Not Modified -> 캐시 조회

2.1) 검증 헤더

  • Last-Modeified
    • HTTP 헤더에 수정날짜를 포함해서 전송
  • ETag (Entitiy Tag)
    • 캐시용 데이터에 임의의 고유한 버전 이름을 달아둠
    • 데이터가 변경되면 이 이름을 바꾸어서 변경 (Hash를 다시 생성)

2.2) 조건부 요청 헤더

If-Modified-Since

  • 이후에 수정이 되었는지?
  • Last-Modefied 사용

단점

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

If-None-Match

  • ETag 사용
  • ETag만 보내서 같으면 유지, 다르면 다시 받기

둘 다 조건이 만족하면 200 OK , 불만족 시 304 Not Found (데이터 변경이 없으면)


4) 프록시 캐시

클라이언트 -> 프록시 캐시 서버 -> 오리진 서버
- 오리진 서버에 직접 접근이 오래 걸리는 경우 프록시 캐시 서버를 통해 빠른 접근이 가능함

기본 흐름

사용자 -> 프록시 캐시 서버 -> 프록시 캐시 서버에 해당 캐시가 있는지 확인 -> 없다면 오리진 서버에서 데이터 다운, 있다면 프록시 서버에서 데이터 전송

  • 최초 사용자는 캐시가 없으므로 느림

해당 헤더

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

5) 캐시 무효화

  • 확실한 캐시 무효화 응답
  • Cache-Control
    • no-cache : 데이터는 캐시 가능, 항상 오리진 서버에 검증 후 사용
    • no-store : 데이터에 민감한 정보가 있으므로 저장 X
    • must-revalidate : 캐시 만료 후 최초 조회 시 오리진 서버에 검증
      ㄴ 오리진 서버에 접근 불가할 경우, 504 Gateway TimeOut이 무조건 발생
  • Pragma : 과거 브라우저(HTTP 1.0 하위호환)
    • no-cache

해당 페이지에 캐시가 반드시 없어야만 된다면 위에 헤더들을 다 추가할 것



참고 자료

0개의 댓글