날짜 및 연령 헤더를 기반으로 응답 캐싱

Jan 17 2021

OkHttp에서 응답을 캐싱하지 않고 매번 서버에 도달하는 동작을보고 있습니다. 그러나 응답에는 향후 Expires 시간이 있으므로 이상적으로는 캐시됩니다.

다음은 응답에서보고있는 헤더의 간단한 예입니다 (에서 요청이 전송되고 응답이 수신 됨 Sat, 16 Jan 2021 00:40:36 GMT).

date: Sat, 16 Jan 2021 00:40:36 GMT
age: 6
expires: Sat, 16 Jan 2021 00:40:40 GMT
last-modified: Sat, 16 Jan 2021 00:40:30 GMT

CacheStrategy에서 본 것에서 문제는 만료 시간이 지난 지 확인하기 위해 date + age를 함께 추가한다는 것입니다. 이 경우 00:40:36 + 6 = 00:40:42 > 00:40:40이므로 캐시에 추가되지 않습니다.

따라서 이상적으로는 응답 날짜가 마지막 수정 날짜와 같거나 (이 경우 Sat, 16 Jan 2021 00:40:30 GMT), 대신 마지막 수정을 사용하려면 사용자 지정 CacheStrategy가 필요합니다. 이러한 계산 날짜.

누군가 내가 잘못된 가정을하고 있는지 또는 위의 옵션 중 하나가 더 나은지에 대한 통찰력이 있으면 알려주십시오. 날짜 / 연령 헤더에 대한 몇 가지 사양을 살펴 보았는데이 시나리오에서 어떤 사양이되어야하는지 약간 불분명합니다.

또한 OkHttp에서 캐싱 동작을 디버깅하는 것이 약간 어렵다는 것을 알았습니다. 지금은 조건부 중단 점을 사용하여 추적하려고 시도했지만 누구든지 더 나은 아이디어가 있다면 감사하겠습니다.

답변

2 JesseWilson Jan 22 2021 at 11:32

expires헤더를 max-age 지시문을 설정하는 Cache-Control 헤더로 바꿉니다 .

Cache-Control: max-age=86400

이로 인해 OkHttp는 언제 제공되었는지에 관계없이 응답을 24 시간 동안 캐시합니다. 만료 헤더는 CloudFlare가 기간이 아닌 특정 만료 시간으로 처리했기 때문에 문제가있었습니다.

1 Menelaos Jan 26 2021 at 01:57

나는 max-age당신이 선택한 "Cache-Control"헤더를 사용하는 것이 좋습니다 .

내가 이렇게하는 주된 이유는 공식 문서의 예제에도 나와 있기 때문입니다. 다음을 참조하세요. https://square.github.io/okhttp/interceptors/#rewriting-responses

.header("Cache-Control", "max-age=60")

이 작업을 수행하는 데 선호되는 방법은 분명히 백엔드입니다. 백엔드를 수정할 수 없다면 인터셉터가 두 번째 옵션이 될 것 같습니다. 이는 권장되지 않는 마지막 옵션입니다.

백엔드 외에도 cloudflare 자체가 제공하는 옵션도 살펴 보겠습니다. https://support.cloudflare.com/hc/en-us/articles/360021806811-Getting-Started-with-Cloudflare-Caching