RFC 문서를 번역하고 정리한 문서입니다. https://www.rfc-editor.org/rfc/rfc9110.htm
A target resource might be provided with, or be capable of generating, multiple representations that are each intended to reflect the resource's current state. An algorithm, usually based on content negotiation (Section 12), would be used to select one of those representations as being most applicable to a given request. This selected representation provides the data and metadata for evaluating conditional requests (Section 13) and constructing the content for 200 (OK), 206 (Partial Content), and 304 (Not Modified) responses to GET (Section 9.3.1).
타겟 리소스는 리소스의 현재 상태를 반영하려는 의도를 가진 여러개의 “표현(representation)”들을 제공받거나 생성할 능력을 가지고 있는데. 주로 Content negotiation에 기반한 알고리즘이 그 여러개의 표현중 주어진 요청에 가장 적합한 표현을 선택한다. 이것이 selected representation 이다.
요청된 URI에 하나 이상의 캐시된 정보가 있는데, 모두 신선한 응답이 아니거나, 어떤 데이터가 유효한 데이터인지 알 수 없어 선택할 수 없을 때, 다음 요청을 받게되는 서버로 request를 전달하고 그 서버에서 조건부 요청 메커니즘을 이용해 사용할 유효한 response를 선택할 수 있는 기회를 주고, 이 과정에서 캐시에 저장된 메타데이터를 업데이트 하거나(304 Not Modified), 저장된 response를 새로운 response로 교체(200 OK)할 수 있도록 한다. 이 과정을 “유효성 검사” 또는 “재검증” 이라고 합니다.

"신선한(fresh)" 응답은 아직 신선도 수명(freshness lifetime)을 초과하지 않은 응답입니다. 반대로 '오래된(stale)' 응답은 이미 만료된 응답입니다.
응답의 '신선도 수명'은 원본 서버에서 생성된 후 만료 시간까지의 기간입니다.
"명시적 만료 시간(explicit expiration time)"은 원본 서버가 추가 유효성 검사 없이 캐시에서 저장된 응답을 더 이상 사용할 수 없도록 의도하는 시간이며, "휴리스틱 만료 시간(heuristic expiration time)"은 명시적 만료 시간이 없는 경우 캐시에 의해 할당됩니다.
응답이 신선하다고 판단되면 원본 서버에 요청하지 않고 캐시된 응답을 사용할 수 있어서 효율적입니다.

“If-Modified-Since” 헤더 필드는 요청하는 데이터의 변경 일자가 필드 값으로 요청된 일자보다 최신일 때 GET 또는 HEAD 리퀘스트를 생성합니다.
다음과 같은 경우에는 반드시 무시됩니다.
반드시 원본 서버의 시간에 따라 “If-Modified-Since” 필드 값의 타임스탬프를 해석해야 합니다.
예시: If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
원본 서버가 판단한 자료가 마지막으로 수정된 시간을 날짜와 시간을 표시하는 타임스탬프로 제공합니다.
예시: Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT
“Pragma” 리퀘스트 헤더는 클라이언트가 “no-cache”를 명시 할 수 있도록 HTTP/1.0 캐시를 위해 선언되었습니다. 하지만 Cache-Control 충분히 지원되고 있기 때문에 deprecated 되었습니다.
“Expires” 응답 헤더 필드에는 응답이 오래된 것으로 간주되는 날짜/시간이 표시됩니다.
예시: Expires: Thu, 01 Dec 1994 16:00:00 GMT
Cache-Control 헤더에 max-age 디렉티브가 포함된 경우 수신자는 헤더는 반드시 무시됩니다. 동일하게 s-maxage 디렉티브가 포함된경우 공유 캐시 수신자는 Expires 헤더가 반드시 무시됩니다. 두 경우 모두 Expires의 값은 Cache-Control 헤더 필드를 구현하지 않은 수신자만 대상으로 합니다.
If-None-Match 헤더 필드 값이 “*”일때 수신자 캐시 또는 원본 서버에 타겟 리소스의 현재 “표현”(representation)이 없거나, Etag가 있는 선택된 “표현”이 필드에 나열된 어느 값과도 일치하지 않을때, 조건부로 리퀘스트 메소드가 작동하게 합니다.
이를 이해하기 쉬운 말로 정리하자면,
예시:
If-None-Match: "xyzzy"
If-None-Match: W/"xyzzy"
If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz"
If-None-Match: *
응답의 ETag 필드는 요청 처리가 끝날 때 결정된 선택된 표현의 현재 엔티티 태그를 제공합니다. 엔티티 태그는 같은 리소스에 대한 여러개의 표현을 구분하기 위한 불투명한 유효성 검사기입니다. (이 여러개의 표현이 시간 경과에 따른 리소스 상태 변경으로 인한 것인지, content negotiation에 의해 같은 시간에 여러개의 표현이 유효해서인지, 혹은 둘 모두 인지 상관없이.) Etag는 따옴표로 묶인 문자열로 구성되며, weakness indicator가 앞에 붙을 수 있습니다.
ETag = entity-tag
entity-tag = [ weak ] opaque-tag
weak = %s"W/"
opaque-tag = DQUOTE *etagc DQUOTE
etagc = %x21 / %x23-7E / obs-text
; VCHAR except double quotes, plus obs-text
예시:
ETag: "xyzzy"
ETag: W/"xyzzy"
ETag: ""
This section defines cache request directives. They are advisory; caches MAY implement them, but are not required to.
max-agemax-stalemin-freshno-cacheno-storeonly-if-cached**Response Directives(응답 지시문)**
This section defines cache response directives. A cache MUST obey the Cache-Control directives defined in this section.
max-ages-maxagemax-age와 동일하게 동작하지만 공유 캐시에만 적용이 됩니다.must-revalidateproxy-revalidatemust-revalidate와 동일하지만, (프록시와 같은)공유 캐시에만 적용되며 사설 캐시에 의해서는 무시됩니다.must-understandno-cacheno-storeno-transformno-transform 디렉티브는 이를 허용하지 않습니다.privatepublic