캐시초과 이후
캐시 시간 초과 후에도 서버 데이터가 변경되지 않았는지 확인하기 위해서는 검증 헤더와 조건부 요청을 사용할 수 있다. 검증 헤더는 서버에서 클라이언트로 전송되는 헤더 정보 중 하나로, 해당 데이터가 변경되었는지 확인할 수 있는 정보를 담고 있다. 조건부 요청은 클라이언트가 서버에게 데이터가 변경되었는지 확인하기 위해 검증 헤더를 함께 보내는 요청 방식이다.
검증 헤더
검증 헤더는 캐시 데이터와 서버 데이터가 같은지 검증하는 데이터를 말하며, Last-Modified와 ETag가 대표적인이고, 조건부 요청 헤더는 검증 헤더를 기반으로 조건에 따른 분기를 수행하는데, If-Modified-Since와 If-None-Match가 대표적이다.
검증 헤더와 조건부 요청 - If-Modified-Since, Last-Modified
If-Modified-Since는 Last-Modified를 사용하여 데이터가 수정된 이후에 요청이 왔는지를 검사한다. 데이터가 변경되지 않은 경우, 캐시된 데이터를 그대로 사용하기 위해서 304 Not Modified 응답을 반환하며, 전송 용량은 헤더 데이터만 전송되므로 작아진다. 하지만 데이터가 변경된 경우, 모든 데이터를 다시 전송하기 때문에 전송 용량이 커진다.
클라이언트가 서버에 데이터를 요청할 때 If-None-Match나 If-Modified-Since와 같은 검증 헤더를 함께 전송하면, 서버는 이를 기반으로 데이터가 갱신되었는지 확인한다. 만약 데이터가 갱신되지 않았다면, 서버는 304 Not Modified와 함께 헤더 메타 정보만을 응답하는데. 이 응답을 받은 클라이언트는 서버에서 보낸 응답 헤더 정보를 기반으로 캐시의 메타 정보를 갱신하고, 캐시에 저장되어 있는 데이터를 재활용한다.
이렇게 함으로써, 용량이 적은 헤더 정보만을 다운로드하면서도 캐시된 데이터를 재활용할 수 있어, 네트워크 다운로드를 최소화할 수 있다. 이는 매우실용적인 해결책이며 웹 성능 향상에 큰 역할을 한다.
ETag와 If-None-Match
ETag와 If-None-Match는
Last-Modified와 If-Modified-Since의 단점을 보완하기 위해 나온 방법이다.
ETag는 캐시용 데이터에 임의의 고유한 버전 이름을 달아둠으로써 데이터가 변경될 때마다 이름을 바꾸어서 변경하며,
If-None-Match는 이전에 받은 ETag와 현재 서버의 ETag가 같은지 비교하여 캐시된 데이터와 서버 데이터가 같은지 검증한다. 만약 같다면 데이터가 변경되지 않았으므로 304 Not Modified를 반환하고, 캐시된 데이터의 헤더 정보만 클라이언트에게 전송한다. 하지만 다르다면 데이터가 변경된 것이므로 200 OK를 반환하고 모든 데이터를 전송한다.
클라이언트는 이전에 받았던 리소스의 ETag 값을 서버에 제공하고, 서버는 이 값을 기반으로 리소스가 변경되었는지 검증한다. 만약 ETag 값이 같으면, 서버는 클라이언트에게 캐시된 리소스를 그대로 반환하고, 다르면 새로운 리소스를 보내준다.
이를 통해 캐시 제어 로직을 서버에서 관리할 수 있으며, 클라이언트는 단순히 ETag 값을 서버에 제공하는 역할을 한다.
예를 들어, 서버는 배타적 오픈 기간 동안 파일이 변경되어도 ETag 값을 동일하게 유지할 수 있으며, 애플리케이션 배포 주기에 맞추어 ETag를 갱신할 수 있다.
💡 이렇게 ETag와 If-None-Match를 사용하여 조건부 요청을 하면, 불필요한 데이터 전송을 줄일 수 있고 전송 용량을 최적화할 수 있다.
출처 : 인프런 - 모든 개발자를 위한 HTTP 웹 기본지식 by 우아한형제 김영한이사님
'WEB HTTP > HTTP 기본' 카테고리의 다른 글
HTTP 헤더 - 캐시 무효화 (0) | 2023.03.22 |
---|---|
HTTP 헤더 - 캐시 제어, 프록시 캐시 (0) | 2023.03.21 |
HTTP 헤더 - 캐시 기본동작 (0) | 2023.03.21 |
HTTP헤더 - 쿠키 Cookie,Set-Cookie (0) | 2023.03.21 |
HTTP헤더 - 일반정보, 특별한 정보, 인증 (0) | 2023.03.21 |