HTTP 헤더 3
캐시
캐시란?
서버와 클라이언트 사이에 데이터를 직접 가져오는것은 느리므로, 중복되는 데이터를 클라이언트쪽에서 저장하고 있다가 사용한다. 이를 "캐시"라고 한다.
캐시의 사용 이유
- 변경되지 않은 데이터의 경우 다시 전송 안받아도 되기 때문에 시간을 아낄 수 있다.
- 인터넷 네트워크에 비해 캐시메모리를 사용하는게 가격면에서 훨씬 싸다.
- 브라우저를 더 빨리 로딩할 수 있다.
캐시 사용법
- 서버가 데이터를 보낼 때 캐시 유효시간(초)를 보낸다.
- 클라이언트가 데이터를 받고 유효시간 만큼 데이터를 캐시메모리에 저장한다.
- 클라이언트가 같은 데이터를 요청할 때 캐시메모리에 있는 데이터의 유효시간이 지나지 않았으면 서버와 통신하지 않고 캐시에서 데이터를 가져온다.
캐시 시간 초과 : 캐시의 유효시간이 초과하면, 캐시에 있는 데이터를 삭제하고 필요 시 서버를 통해 다시 데이터를 가져온다.
검증 헤더와 조건부 요청 헤더
캐시 유효 시간이 초과해서 서버에 다시 요청했을 때 기존과 똑같은 데이터일 경우 전부 다시 다운받으면 비효율적이다. → “데이터가 안바뀌었으니 그대로 사용해라” 라는 말을 해주기 위해 검증 헤더 사용
검증헤더
캐시 데이터와 서버 데이터가 같은지 검증하는 할 때 사용
조건부 헤더
검증 헤더로 받은 조건에 따라 분기가 생기는 헤더.
조건이 만족하면 200 OK , 만족하지 않으면 304 NOT Modified 사용
검증 헤더와 조건부 요청 헤더 사용 예시
- 기본적인 캐시 통신에 유효시간 뿐만 아니라 데이터가 마지막에 수정된 시간(검증 헤더)을 추가한다.
- 캐시 유효 시간이 초과되었을 때 데이터의 최종 수정일이 바뀌었는지 조건부 요청을 보낸다.
- 만약 바뀌었으면 데이터를 보내지만, 안바뀌었을 경우 304 not modified란 응답을 보낸다.(바디 없이 헤더로만)
- 클라이언트는 캐시에 있는 데이터의 유효시간을 연장해서 사용한다.
장점
- 캐시에 저장되어 있는 데이터를 재활용 할 수 있다.
- 서버와 직접 통신하는 것보다 시간과 비용을 줄일 수 있다.
캐시, 검증, 조건부 요청 제어 헤더
캐시 제어 헤더
캐시 지시어 Cache-Control
- Cache-Control: max-age
- Cache-Control: no-cache
- 데이터는 캐시해도 되지만, 항상 원(origin) 서버에 검증하고 사용.
- Cache-Control: no-store
- 데이터에 민감한 정보가 있으므로 저장하면 안됨. (메모리에서 사용하고 최대한 빨리 삭제.
- Cache-Control: public
- Cache-Control: private
- 응답이 해당 사용자만의 것. private 캐시에 저장해야 함(기본값)
- Cache-Control: s-maxage
- 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