Chapter 7 HTTP 헤더2 - 캐시와 조건부 요청
이 학습 자료는 김영한님의 인프런 강의를 참고해서 만들었습니다.
1. 캐시의 기본 동작
- 캐시가 없을 때
- 데이터가 변경이 되지 않아도 네트워크를 통해서 데이터를 다운로드 받아야 함.
- 느린 사용자 경험을 야기
- 캐시를 적용
- 캐시 가능 시간동안 네트워크를 사용하지 않아도 된다.
- 네트워크 사용량을 줄여서 빠른 사용자 경험을 만듦
- 캐시 가능 시간이 초과되면 다시 요청해야 함.
2. 검증 헤더와 조건부 요청
- 캐시 만료후에도 서버에서 데이터를 변경하지 않았으면, 캐시를 재사용 할 수 있음
→ 검증이 필요 - 검증 헤더 : 캐시 데이터와 서버 데이터가 같은지 검증하는 데이터
Last-Modified
: 데이터 최종 수정일- 데이터 최종 수정일을 비교하여 검증 함.
- 검증에 성공하면 HTTP BODY 없이 HTTP 헤더(
304 Not Modified
+ 헤더 메타 정보 )만 보냄- 캐시를 갱신이 되어 캐시에 저장되어 있는 정보 재활용
- 검증에 성공하면 HTTP BODY 없이 HTTP 헤더(
- 데이터 최종 수정일을 비교하여 검증 함.
ETag
: Entity Tag- 캐시용 데이터에 임의의 고유한 버전을 달아두고, 데이터가 변경 되면 이 이름을 변경함(Hash 재생성)
- ETag만 보내서 같으면 유지하고, 다르면 다시 받기
- 조건부 요청 헤더
- 검증 헤더로 조건에 따라서 분기
If-Modified-Since: Last-Modified
사용- 데이터 미변경 →
304 Not Modified
, 헤더 데이터만 전송(BODY 미포함) - 데이터 변경 →
200 OK
, 모든 데이터 전송(BODY 포함) - 단점
- 1초 미만 단위로는 불가능
- 날짜 기반의 로직으로 사용 → 데이터를 수정해서 날짜는 다르지만 같은 데이터가 남는 경우가 생김
- 서버에서 별도의 캐시 로직을 관리할 수 없음(ex) 스페이스나 주석의 변경시 캐시 유지 불가능)
- 데이터 미변경 →
If-None-Match: Etag
사용- 캐시 제어 로직을 서버에서 완전히 관리
- 조건이 만족하면
200 OK
- 만족하지 않으면
304 Not Modified
3. 캐시와 조건부 요청 헤더
3.1 캐시 제어 헤더
Cache-Control
: 캐시 제어Cache-Control: max-age
: 캐시 유효 시간, 초 단위Cache-Control: no-cache
: 데이터는 캐시 가능하지만, 항상 원(origin) 서버에 검증하고 사용Cache-Control: no-store
: 저장하면 안됨
Pragma
: 캐시 제어(하위 호환)Pragma: no-cache
Expires
: 캐시 유효 기간(하위 호환)expires: 날짜
: 캐시 만료일을 정확한 날짜로 지정 → 권장X
3.2 조건부 요청 헤더
- 검증 헤더
ETag
Last-Modified
- 조건부 요청 헤더
If-Match
,If-None-Match
:ETag
값 사용If-Modified-Since
,If-Unmodified-Since
:Last-Modified
값 사용
4. 프록시 캐시
- 원 서버에 직접 접근하면 속도가 떨어짐으로 프록시 캐시 서버를 두어서 대신 접근하게 한다.
4.1 캐시 지시어
Cache-Control: public
: 응답이 public 캐시에 저장되어도 됨Cache-Control: private
: 응답이 해당 사용자의 private 캐시에 저장해야 함(기본값)Cache-Control: s-maxage
: 프록시 케시에만 적용되는 max-ageAge: 60
: 오리진 서버에서 응답 후 프록시 캐시 내에 머문 시간
5. 캐시 무효화
Cache-Control: no-cache, no-store, must-revalidate
must-revalidate
: 원서버가 오류가 나면 프록시 캐시 서버에서 캐시 반환하지 않고 오류를 냄no-cache
: 원서버에서 오류가나면 프록시 캐시 서버에서 캐시를 대신 반환해줌
Pragma: no-cache
(하위 호환)- 위에 있는것 모두 넣어야 확실히 무효화가 됨.
'CS > [NETWORK]' 카테고리의 다른 글
[네트워크] JWT란? (0) | 2023.05.14 |
---|---|
[네트워크] 쿠키와 세션 (0) | 2022.05.04 |
Chapter 7 HTTP 헤더1 - 일반헤더 (0) | 2021.11.23 |
Chapter 6 HTTP 상태 코드 (0) | 2021.11.18 |
Chapter 5 HTTP 메서드 활용 (0) | 2021.11.16 |