※ 김영한 님의 인프런 "모든 개발자를 위한 HTTP 웹 기본 지식" 강의를 요약한 내용입니다.
✅ 캐시
📌 캐시가 없을 때
- 데이터가 변경되지 않아도 계속 네트워크를 통해 데이터를 다운로드 받아야함
- 인터넷 네트워크는 매우 느리고 비쌈
- 브라우저 로딩 속도가 느림
- 느린 사용자 경험
📌 캐시 적용
- 캐시 덕분에 캐시 가능 시간동안 네트워크를 사용하지 않아도 된다.
- 비싼 네트워크 사용량을 줄일 수 있음
- 브라우저 로딩 속도가 빠름
- 빠른 사용자 경험
📌 캐시 시간 초과
- 캐시 유효 시간이 초과하면, 서버를 통해 데이터를 다시 조회하고 캐시를 갱신한다.
- 네트워크 다운로드 발생
✅ 검증 헤더와 조건부 요청
📌 검증 헤더 Last-Modified & 조건부 요청 if-modified-since 사용
- 첫번째 요청시 서버는 클라이언트에 데이터와 함께 Last-Modified헤더에 데이터가 마지막에 수정된 시간을 담아 보낸다.
- 응답 결과를 데이터 최종 수정일과 함께 브라우저 캐시에 저장한다.
- 다음 요청 시 캐시 시간이 초과 됬으면, 요청 if-modified-since헤더에 캐시가 가지고 있는 데이터 최종 수정일을 담아 보낸다.
- 서버에서 데이터 최종 수정일을 확인해서 동일하면, 304 Not Modified 상태코드로 HTTP Body없이 헤더 메타 정보만 응답한다.
- 브라우저 캐시는 응답 결과를 재사용하고 헤더 데이터를 갱신한다.
- 웹 브라우저는 데이터를 브라우저 캐시에서 조회 한다.
- 결과적으로 네트워크 다운로드가 발생하지만 용량이 적은 헤더 정보만 다운로드
단점
- 1초 미만 단위로 캐시 조정 불가능
- 날짜 기반의 로직 사용
- 데이터를 수정해서 날짜가 다르지만, 같은 데이터를 수정해서 데이터 결과가 똑같은 경우
- 서버에서 별도의 캐시 로직을 관리하고 싶은 경우
📌 검증 헤더 ETag & 조건부 요청 if-None-Match 사용
- ETag (Entity Tag) : 캐시용 데이터에 임의의 고유한 버전 이름을 달아둠
- ETag만 보내서 같으면 유지, 다르면 다시 받기
- 첫 번째 요청시 서버는 클라이언트에 데이터와 함께 ETag 헤더에 태그를 담아 보낸다.
- 브라우저 캐시에 응답 결과와 ETag 값을 저장한다.
- 다음 요청 시 캐시 시간이 초과 됬으면, 요청 if-None-Match 헤더에 캐시가 가지고 있는 태그값을 담아 보낸다.
- 서버에서 태그값을 확인해서 동일하면, 304 Not Modified 상태코드로 HTTP Body없이 헤더 메타 정보만 응답한다.
- 브라우저 캐시는 응답 결과를 재사용하고 헤더 데이터를 갱신한다.
- 웹 브라우저는 데이터를 브라우저 캐시에서 조회 한다.
- 캐시 제어 로직을 서버에서 완전히 관리 (클라이언트는 캐시 메커니즘을 모른다.)
- 예
- 애플리케이션 배포 주기에 맞추어 ETag 모두 갱신
📌 Cache-Control
- max-age: 캐시 유효 시간, 초 단위
- no-cache: 데이터는 캐시해도 되지만, 항상 원 서버에 검증하고 사용
- no-store: 데이터에 민감한 정보가 있으므로 저장하면 안됨
✅ 프록시 캐시
웹 브라우저, 원 서버 중간에 위치하는 캐시 서버 (public 캐시)
📌 Cache-Control
- Cache-Control: public
- 응답이 public 캐시에 저장되어도 됨
- Cache-Control: private
- 응답이 해당 사용자만을 위한 것임, private 캐시에 저장해야 함(기본값)
- Cache-Control: s-maxage
- 프록시 캐시에만 적용되는 max-age
- Age: 60 (HTTP 헤더)
- 오리진 서버에서 응답 후 프록시 캐시 내에 머문 시간(초)
📌 캐시 무효화
확실한 캐시 무효화 응답
- Cache-Control: no-cache, no-store, must-revalidate
- Pragma: no-chache (HTTP 1.0 하위 호환)
Cache-Control: no-cache
- 데이터는 캐시해도 되지만, 항상 원 서버에 검증하고 사용
- 원서버에 접근할 수 없는 경우 프록시 캐시 서버 설정에 따라서 캐시 데이터를 반환할 수 있다.
- Error or 200 OK 응답
Cache-Control: no-store
- 데이터에 민감한 정보가 있으므로 저장하면 안됨
Cache-Control: must-revalidate
- 캐시 만료후 최초 조회시 원 서버에 검증해야함
- 원 서버 접근 실패시 반드시 오류가 발생해야함 - 504(Gateway Timeout)
- must-revalidate는 캐시 유효 시간이라면 캐시를 사용함
Pragma: no-cache
- HTTP 1.0 하위 호환
'Web' 카테고리의 다른 글
[Web] 세션과 JWT (0) | 2023.03.11 |
---|---|
[HTTP 웹 기본 지식] 섹션7. HTTP 헤더1 일반 헤더 (0) | 2022.11.19 |
[HTTP 웹 기본 지식] 섹션6. HTTP 상태코드 (0) | 2022.11.18 |
[HTTP 웹 기본 지식] 섹션5. HTTP 메서드 활용 (0) | 2022.11.18 |
[HTTP 웹 기본 지식] 섹션4. HTTP 메서드 (0) | 2022.11.17 |