[HTTP] HTTP 헤더 - 3 (캐시, 검증 헤더, 조건부 요청 헤더)

Enochkon·2022년 10월 2일
0

네트워크

목록 보기
9/9

HTTP 헤더 3

캐시

캐시란?

서버와 클라이언트 사이에 데이터를 직접 가져오는것은 느리므로, 중복되는 데이터를 클라이언트쪽에서 저장하고 있다가 사용한다. 이를 "캐시"라고 한다.

캐시의 사용 이유

  • 변경되지 않은 데이터의 경우 다시 전송 안받아도 되기 때문에 시간을 아낄 수 있다.
  • 인터넷 네트워크에 비해 캐시메모리를 사용하는게 가격면에서 훨씬 싸다.
  • 브라우저를 더 빨리 로딩할 수 있다.

캐시 사용법

  1. 서버가 데이터를 보낼 때 캐시 유효시간(초)를 보낸다.
  2. 클라이언트가 데이터를 받고 유효시간 만큼 데이터를 캐시메모리에 저장한다.
  3. 클라이언트가 같은 데이터를 요청할 때 캐시메모리에 있는 데이터의 유효시간이 지나지 않았으면 서버와 통신하지 않고 캐시에서 데이터를 가져온다.

캐시 시간 초과 : 캐시의 유효시간이 초과하면, 캐시에 있는 데이터를 삭제하고 필요 시 서버를 통해 다시 데이터를 가져온다.

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

캐시 유효 시간이 초과해서 서버에 다시 요청했을 때 기존과 똑같은 데이터일 경우 전부 다시 다운받으면 비효율적이다. → “데이터가 안바뀌었으니 그대로 사용해라” 라는 말을 해주기 위해 검증 헤더 사용

검증헤더

캐시 데이터와 서버 데이터가 같은지 검증하는 할 때 사용

조건부 헤더

검증 헤더로 받은 조건에 따라 분기가 생기는 헤더.
조건이 만족하면 200 OK , 만족하지 않으면 304 NOT Modified 사용

검증 헤더와 조건부 요청 헤더 사용 예시

  1. 기본적인 캐시 통신에 유효시간 뿐만 아니라 데이터가 마지막에 수정된 시간(검증 헤더)을 추가한다.
  2. 캐시 유효 시간이 초과되었을 때 데이터의 최종 수정일이 바뀌었는지 조건부 요청을 보낸다.
  3. 만약 바뀌었으면 데이터를 보내지만, 안바뀌었을 경우 304 not modified란 응답을 보낸다.(바디 없이 헤더로만)
  4. 클라이언트는 캐시에 있는 데이터의 유효시간을 연장해서 사용한다.

장점

  • 캐시에 저장되어 있는 데이터를 재활용 할 수 있다.
  • 서버와 직접 통신하는 것보다 시간과 비용을 줄일 수 있다.

캐시, 검증, 조건부 요청 제어 헤더

캐시 제어 헤더

캐시 지시어 Cache-Control

  • Cache-Control: max-age
    • 캐시 유효 시간, 초단위
  • Cache-Control: no-cache
    • 데이터는 캐시해도 되지만, 항상 원(origin) 서버에 검증하고 사용.
  • Cache-Control: no-store
    • 데이터에 민감한 정보가 있으므로 저장하면 안됨. (메모리에서 사용하고 최대한 빨리 삭제.
  • Cache-Control: public
    • 응답이 public 캐시에 저장되어도 됨.
  • Cache-Control: private
    • 응답이 해당 사용자만의 것. private 캐시에 저장해야 함(기본값)
  • Cache-Control: s-maxage
    • 프록시 캐시에만 적용되는 max-age
  • Age: 60 (HTTP 헤더)
    • 오리진 서버에서 응답 후 프록시 캐시 내에 머문 시간(초)

Pragma
캐시 제어(하위호환) → 예전에 쓰던거

  • Pragma: no-cache
  • HTTP 1.0 하위 호환. 잘쓰지는 않지만 낮은버전과의 호환을 위해 가끔 사용

Expires
캐시 만료일 지정(하위 호환)

  • 캐시 만료일을 정확한 날짜로 지정
  • HTTP 1.0 부터 사용
  • 지금은 더 유연한 Cache-Control: max-age 권장 (현재는 Cache-Control: max-age와 Expires를 동시에 쓰면 Expires가 무시됨)

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

  • 검증 헤더 (Validator)
    • ETag : “v1.0”, ETag: “asdhflkasdf1”
    • Last-Modified: Thu, 04 Jun 2020 07:19:24 GMT
  • 조건부 요청 헤더
    • If-Match, If-None-Match: ETag값 사용
    • If-Modified-Since, If-Unmodified-Since: Last-Modified 값 사용.
      데이터가 수정되었는지 여부를 물어봄
    • 데이터 미변경시 : 304 Not Modified, 헤더 데이터만 전송
    • 데이터 변경시 : 200 OK 모든 데이터를 전송.

프록시 캐시

거리가 먼 origin 서버(실제 데이터를 보내는 서버)에 직접 통신을 하려면 각 클라이언트마다 소요시간이 너무 오래걸린다. -> 이를 해결하기 위해 클라이언트와 origin 서버 사이에 둔 캐시를 프록시 캐시라고 한다.

캐시 무효화

사용자의 개인정보 같은 데이터는 캐시하면 위험하기 때문에 캐시가 안되도록 해줘야한다.

  • Cache-Control: no-cache
    • 데이터는 캐시해도 되지만 항상 원서버에 검증하고 사용
  • Cache-Control: no-store
    • 데이터에 민감한 정보가 있으므로 저장하면 안됨.
  • Cache-Control: must-revalidate
    • 캐시 만료 후 최초 조회 시 원 서버에 검증해야함.
    • 원 서버 접근 실패 시 무조건 오류가 발생해야함.
  • Pragma: no-cache
    • 프로토콜이 요청할 수 있으므로 사용 (HTTP 1.0 하위호환)

출처

https://www.inflearn.com/course/http-웹-네트워크/dashboard
https://developer.mozilla.org/ko/docs/Web/HTTP

0개의 댓글