본문 바로가기
프로그래밍/Web Basic

캐시 기본 동작, 조건부 요청

by YuminK 2023. 8. 1.

캐시 기본  동작

캐시가 없을 때

1. 데이터가 변경되지 않아도 계속 네트워크를 통해서 데이터를 다운로드 받아야 한다.

2. 인터넷 네트워크는 매우 느리고 비싸다.

3. 브라우저 로딩 속도가 느리다.

4. 느린 사용자 경험

 

캐시 적용 

1. 캐시 덕분에 캐시 가능 시간 동안 네트워크를 사용하지 않아도 된다.

2. 비싼 네트워크 사용량을 줄일 수 있다.

3. 브라우저 로딩 속도가 매우 빠르다.

4. 빠른 사용자 경험

캐시 시간 초과

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

 

검증 헤더와 조건부 요청

캐시 유효 시간이 초과해서 서버에 다시 요청하는 상황은 다음과 같다.

1. 서버에서 기존 데이터를 변경함

2. 서버에서 기존 데이터를 변경하지 않음

검증 헤더와 조건부 요청

1. 캐시 유효 시간이 초과해도, 서버의 데이터가 갱신되지 않으면 304 Not Modified 코드를 반환하고 바디 정보를 넘기지 않는다. (헤더 데이터만 처리)

2. 클라이언트는 서버가 보낸 응답 헤더 정보로 캐시의 메타 정보를 갱신

3. 결과적으로 네트워크 다운로드가 발생하지만, 용량이 적은 헤더 정보만 다운로드

4. 매우 실용적인 해결책

 

검증 헤더와 조건부 요청

검증 헤더

 - 캐시 데이터와 서버 데이터가 같은지 검증하는 데이터

 - Last-Modified, ETag

 

조건부 요청 헤더

 - 검증 헤더로 조건에 따른 분기

 - If-Modified-Since: Last-Modified 사용

 - If-None-Match: ETag 사용

 - 조건이 만족하면 200 OK

 - 조건이 만족하지 않으면 304 Not Modified

 

If-Modified-Since 예시

- 데이터 미변경시

캐시: 2020년 11월 10일 10:00:00 vs 서버: 2020년 11월 10일 10:00:00

304 Not Modified 헤더 데이터만 전송(BODY 미포함)

전송 용량 0.1M (헤더 0.1M)

 

- 데이터 변경 예시

캐시: 2020년 11월 10일 10:00:00 vs 서버: 2020년 11월 10일 11:00:00

200 OK, 모든 데이터 전송(BODY 포함)

전송 용량 1.1M (헤더 0.1M, 바디 1.0M)

 

Last-Modified, If-Modified-Since 단점

1. 1초 미만 단위로 캐시 조정이 불가능

2. 날짜 기반의 로직 사용

3. 데이터를 수정해서 날짜가 다르지만, 같은 데이터를 수정해서 데이터 결과가 같은 경우는?

4. 서버에서 별도의 캐시 로직을 관리하고 싶은 경우는?

 

ETag, If-None-Match

- ETag(Entity Tag) 

캐시용 데이터에 임의의 고유한 버전 이름을 달아둠

예) ETag: "v.1.0", ETag: "asdfds"

 

- 데이터가 변경되면 이름을 바꾸면 된다. (Hash를 다시 생성)

예) ETag: "aaaa" => ETag: "bbbbb"

 

- ETag 값이 다르면 다시 받고 아니면 유지

ETag, If-None-Match 정리

 - ETag 값이 다르면 다시 받고, 같으면 유지하는 로직

 - 캐시 제어 로직을 서버에서 완전히 관리한다.

 

캐시 제어 헤더

1. Cache-Control: 캐시 제어

2. Pragma: 캐시 제어(하위 호환)

3. Expires: 캐시 유효 기간(하위 호환)

 

Cache-Control

캐시 지시어

1. Cache-Control: max-age

캐시 유효 시간, 초 단위

2. Cache-Control: no-cache

데이터는 캐시해도 되지만, 항상 Origin 서버에 검증하고 사용한다.

3. Cache-Control: no-store

데이터에 민감한 정보가 있으므로 저장하면 안 된다. (메모리에서 사용하고 빠르게 삭제) 

 

Pragma

1. Pragma: no-cache

2. HTTP 1.0 하위 호환

 

Expires

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

1. expires: Mon, 01 Jan 1990 00:00:00 GMT

2. 캐시 만료일을 정확한 날짜로 지정

3. HTTP 1.0부터 사용

4. 지금은 더 유연한 Cache-Control: max-age 권장

5. Cache-Control: max-age와 함께 사용하면 Expires는 무시

 

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

• 검증 헤더 (Validator)

• ETag: "v1.0", ETag: "asid93jkrh2l"

• Last-Modified: Thu, 04 Jun 2020 07:19:24 GMT

 

• 조건부 요청 헤더

• If-Match, If-None-Match: ETag 값 사용

• If-Modified-Since, If-Unmodified-Since: Last-Modified 값 사용

 

출처: HTTP 웹 기본 지식 강의(김영한)

댓글