| 인터넷 엔지니어링 태스크 포스 (IETF) | S. Ludin |
| 의견 요청: 9213 | Akamai |
| 분류: 표준 트랙 | M. Nottingham |
| ISSN: 2070-1721 | Fastly |
| Y. Wu | |
| Cloudflare | |
| 2022년 6월 |
대상화된 HTTP 캐시 제어
초록
이 명세서는 캐시 지시어를 특정 캐시 또는 캐시의 클래스에 대상화(타깃)할 수 있도록 하는 HTTP 응답 헤더 필드 관례를 정의합니다. 또한 그 중 하나인 CDN-Cache-Control 응답 헤더 필드를 정의하며, 이는 콘텐츠 전송 네트워크(CDN) 캐시를 대상으로 합니다.
이 메모의 상태
이 문서는 인터넷 표준 트랙 문서입니다.
이 문서는 인터넷 엔지니어링 태스크 포스(IETF)의 산출물입니다. 이는 IETF 커뮤니티의 합의를 반영합니다. 공개 검토를 거쳤으며 인터넷 엔지니어링 스티어링 그룹(IESG)에 의해 발행 승인을 받았습니다. 인터넷 표준에 관한 추가 정보는 RFC 7841의 2절을 참조하십시오.
이 문서의 현재 상태, 정오표, 피드백 제공 방법에 관한 정보는 https://www.rfc-editor.org/info/rfc9213에서 확인할 수 있습니다.
Copyright Notice
Copyright (c) 2022 IETF Trust and the persons identified as the document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.
1. 소개
현대의 HTTP 배포 환경에서는 종종 여러 계층의 캐시를 사용합니다. 예를 들어, 웹사이트는 오리진 서버 자체에 캐시를 둘 수 있고; 오리진 서버와 동일한 네트워크에 캐싱 계층을 배포할 수 있으며; 인터넷 전역에 분산된 하나 이상의 CDN을 사용할 수 있고; 브라우저 캐싱의 이점도 얻을 수 있습니다.
이러한 서로 다른 캐시 클래스들을 별도로 제어하는 것이 바람직한 경우가 많기 때문에, 특정 캐시들을 대상으로 캐시 지시어를 지정할 수 있는 수단이 필요합니다. 예를 들어, 발행자가 특정 캐시(예: 관계가 있는 CDN 캐시)의 콘텐츠를 무효화하는 메커니즘을 가지고 있다면, 다른 캐시의 동작을 제한하면서 해당 캐시에 대해 더 관대한 캐싱 정책을 부여하는 것을 더 편안하게 여길 수 있습니다.
HTTP Cache-Control 응답 헤더 필드(Section 5.2 of [HTTP-CACHING])는 캐시 동작을 지시하는 데 널리 사용됩니다. 그러나 이는 비교적 구분이 적어서, 일부 캐시 지시어(예: s-maxage)는 특정 캐시 클래스(공유 캐시)를 대상으로 하지만, 기존의 모든 캐시 지시어(예: stale-while-revalidate)에 대해 일관되게 대상화 기능이 제공되지는 않습니다. 캐싱 확장이 늘어나고 대상이 될 수 있는 곳이 많아짐에 따라 이는 문제가 됩니다.
일부 구현은 이 문제를 해결하기 위해 임의의 제어 메커니즘을 정의했지만 상호운용성은 낮습니다. 섹션 2는 HTTP 응답 헤더를 사용한 대상화된 캐시 제어의 표준 프레임워크를 정의하며, 섹션 3은 그 중 하나인 CDN-Cache-Control 응답 헤더 필드를 정의합니다.
1.1. 표기 규약
2. 대상화된 Cache-Control 헤더 필드
대상화된 Cache-Control 헤더 필드(이하 "대상화된 필드")는 Cache-Control 응답 헤더 필드([HTTP-CACHING], 섹션 5.2)와 동일한 의미를 가지는 HTTP 응답 헤더 필드입니다. 다만, 캐시 지시어의 대상(타깃)을 나타내는 별개의 필드 이름을 가집니다.
예:
CDN-Cache-Control: max-age=60
는 섹션 3에서 정의된 바와 같이 CDN에 적용되는 대상화된 필드입니다.
2.1. 구문
대상화된 필드는 Dictionary Structured Fields(Section 3.2 of [STRUCTURED-FIELDS])입니다. Dictionary의 각 멤버는 캐시 응답 지시어(Section 5.2.2 of [HTTP-CACHING])와 확장 응답 지시어(Section 5.2.3 of [HTTP-CACHING])를 포함합니다. 대상화된 필드는 종종 Cache-Control 필드와 동일한 문법을 가지지만, 오류 처리 차이로 인해 Cache-Control 파서를 사용하면 Structured Fields 파서를 사용하는 것과 상호운용성 문제를 일으킬 수 있습니다.
캐시 지시어 값은 구조화된 데이터 타입으로 정의되어 있지 않으므로, 해당 값을 적절한 타입으로 매핑할 필요가 있습니다. 섹션 5.2은 캐시 지시어 값이 없거나, 인용 문자열(quoted-string) 또는 토큰(token)이라고 정의합니다.
따라서 값이 없는 캐시 지시어는 Boolean으로 매핑됩니다(Section 3.3.6 of [STRUCTURED-FIELDS]). 값이 인용 문자열이면 String으로(Section 3.3.3) 매핑되고, 토큰이면 Token(Section 3.3.4), Integer(Section 3.3.1), 또는 Decimal(Section 3.3.2)로 매핑됩니다. 이는 값의 내용에 따라 달라집니다.
예를 들어, max-age 지시어(Section 5.2.2.1)는 정수 값을 가지며; no-store(Section 5.2.2.5)는 항상 Boolean true 값을 가지며, no-cache(Section 5.2.2.4)는 Boolean true 이거나 쉼표로 구분된 필드 이름 목록을 포함하는 문자열이 될 수 있습니다.
구현은 이러한 추론된 제약을 위반하는 값을 생성해서는 안됩니다. 특히, 첫 문자가 알파벳 또는 "*"가 아닌 문자열 값은 다른 타입으로 오해되지 않도록 반드시 String으로 생성되어야 합니다.
구현은 이러한 제약을 위반하는 값을 수용해서는 안됩니다. 예를 들어, 소수(decimal) 값을 가진 max-age를 정수로 강제 변환하는 수용 구현은 다른 구현과 다르게 동작하여 상호운용성 문제를 일으킬 수 있습니다.
캐시 지시어에 수신된 파라미터는 다른 처리가 명시되지 않는 한 무시되어야 합니다.
특정 응답의 대상화된 필드가 비어 있거나 파싱 오류가 발생하면, 해당 필드는 캐시에 의해 무시되어야 합니다(즉, 필드가 없는 것처럼 동작하며, 다른 cache-control 메커니즘으로 폴백할 가능성이 큽니다).
2.2. 캐시 동작
이 명세를 구현하는 캐시는 대상 리스트(target list)를 유지합니다. 대상 리스트는 캐싱 정책에 사용되는 대상화된 필드 이름의 순서 있는 목록이며, 순서는 가장 적용 가능성이 높은 것에서 가장 낮은 것으로 우선순위를 반영합니다. 대상 리스트는 고정되거나 사용자 구성 가능하거나 구현에 따라 요청별로 생성될 수 있습니다.
예를 들어, CDN 캐시는 CDN-Cache-Control과 해당 CDN에 특정한 헤더인 ExampleCDN-Cache-Control을 모두 지원할 수 있으며, 후자가 전자를 재정의할 수 있습니다. 이 경우 대상 리스트는 다음과 같습니다:
[ExampleCDN-Cache-Control, CDN-Cache-Control]
이 명세를 구현하는 캐시가 대상 리스트에 있는 하나 이상의 헤더 필드 이름을 가진 응답을 수신하면, 캐시는 유효하고 비어 있지 않은 값이 있는 리스트상의 첫 번째(대상 리스트 순서 기준) 필드를 선택하여 그 값을 응답의 캐싱 정책을 결정하는 데 사용해야 하며, 리스트상의 필드들에서 유효한 비어 있지 않은 값이 없을 경우를 제외하고는 해당 응답의 Cache-Control 및 Expires 헤더 필드를 무시해야 합니다.
이는 응답별로 발생한다는 점에 유의하십시오; 캐시의 대상 리스트에 어떤 멤버도 존재하지 않거나 유효하지 않거나 비어 있지 않다면, 캐시는 HTTP에 따라 요구되는 다른 캐시 제어 메커니즘으로 폴백합니다([HTTP-CACHING]).
캐시의 대상 리스트에 없는 대상화된 필드는 해당 캐시의 동작을 변경해서는 안되며, 통과(pass-through)되어야 합니다.
대상화된 필드를 사용하는 캐시는 다음 캐시 지시어들의 의미를 구현해야 합니다:
- max-age
- must-revalidate
- no-store
- no-cache
- private
또한, 캐시는 Cache-Control 응답 헤더 필드에서 지원하는 다른 캐시 지시어들(확장 캐시 지시어 포함)을 구현하는 것이 권장됩니다.
대상화된 필드 내 캐시 지시어의 의미와 우선순위는 Cache-Control의 것과 동일합니다. 특히 no-store와 no-cache는 max-age를 무력화하며, 인식되지 않는 확장 지시어는 무시됩니다.
2.3. HTTP 신선도와의 상호작용
HTTP 캐싱은 섹션 4.2에 정의된 단일 종단 간(end-to-end) 신선도 모델을 가집니다. 추가적인 신선도 메커니즘이 요청 경로상의 일부 캐시에만 제공되는 경우(예: 대상화된 필드 사용) 이들 간의 상호작용을 신중히 고려해야 합니다. 특히 대상화된 캐시는 다른 캐시보다 더 긴 신선도 수명을 가질 수 있어, 다른 캐시에게는 해당 응답이 조기에(또는 즉시) 만료된 것으로 보이는 상황을 만들 수 있으며, 이는 캐시 효율성에 부정적 영향을 미칠 수 있습니다.
예를 들어, CDN 캐시에 저장된 응답이 다음과 같은 헤더로 제공될 수 있습니다:
Age: 1800 Cache-Control: max-age=600 CDN-Cache-Control: max-age=3600
CDN 관점에서는 이 응답이 캐시된 지 30분 후에도 여전히 신선하지만, 다른 캐시 관점에서는 이미 만료된 상태입니다. 자세한 논의는 [AGE-PENALTY]를 참조하십시오.
대상화된 캐시에 강력한 일관성(coherence) 메커니즘(예: 오리진 서버가 캐시된 응답을 적극적으로 무효화할 수 있는 능력)이 있는 경우, 이러한 효과를 완화하는 것이 바람직할 수 있습니다. 배포에서 관찰되는 일부 기법은 다음과 같습니다:
- Age 헤더 필드 제거
- Date 헤더 필드 값을 현재 시각으로 갱신
- Expires 헤더 필드 값을 현재 시각 + Cache-Control: max-age 값으로 갱신
이 명세서는 이러한 효과를 완화하기 위한 구현상의 특정 요구사항을 부과하지 않지만, 대상화된 필드의 정의에서 이를 규정할 수 있습니다.
2.4. 대상화된 필드 정의
특정 클래스의 캐시에 대한 대상화된 필드는 "Hypertext Transfer Protocol (HTTP) Field Name Registry"(<https://www.iana.org/assignments/http-fields/>)에 등록을 요청하여 정의할 수 있습니다.
등록 요청은 본 문서를 명세 문서로 사용할 수 있으며, 이 경우 Comments 필드에 대상화된 필드가 적용되는 캐시 클래스가 명확히 정의되어야 합니다. 또는 해당 필드를 정의하는 다른 문서가 존재한다면 그것을 명세 문서로 사용할 수 있습니다.
관례적으로 대상화된 필드는 접미사 "-Cache-Control"을 가집니다(예: "ExampleCDN-Cache-Control"). 그러나 이 접미사만으로 대상화된 필드를 식별해서는 안됩니다; 이는 단지 관례일 뿐입니다.
3. CDN-Cache-Control 대상 필드
CDN-Cache-Control 응답 헤더 필드는 대상화된 필드(섹션 2)로, 오리진 서버가 CDN 캐시의 동작을 다른 캐시들과 구분하여 제어할 수 있게 해줍니다.
이는 오리진 서버를 대신해 작동하는 분산 네트워크의 일부인 캐시(일반적으로 CDN이라고 부르는)에 적용됩니다.
CDN-Cache-Control을 사용하는 CDN 캐시는 보통 이 헤더를 하류의 CDN 캐시로 전달하여 하류 캐시들도 이를 사용할 수 있게 합니다. 다만, 바람직하지 않은 경우(예: 하류에서 사용되지 않는 것으로 알려져 있어 전달하지 않도록 설정된 경우)에는 이를 제거할 수 있습니다.
3.1. 예시
예를 들어, 다음 헤더 필드들은 CDN 캐시(즉, 대상 리스트가 [CDN-Cache-Control]인 캐시)에게는 응답을 600초 동안 신선하다고 간주하고, 다른 공유 캐시들은 120초 동안 신선하다고 간주하며, 나머지 캐시들은 60초 동안 신선하다고 간주하도록 지시합니다:
Cache-Control: max-age=60, s-maxage=120 CDN-Cache-Control: max-age=3600
다음 헤더 필드들은 CDN 캐시에게는 응답을 600초 동안 신선하다고 지시하는 반면, 다른 모든 캐시는 저장하지 못하게 합니다:
CDN-Cache-Control: max-age=600 Cache-Control: no-store
CDN-Cache-Control이 없을 경우, 다음 헤더 필드는 모든 캐시가 응답을 저장하지 못하도록 합니다:
Cache-Control: no-store
반면 다음은 CDN 캐시를 제외한 모든 캐시가 응답을 저장하지 못하도록 합니다:
Cache-Control: no-store CDN-Cache-Control: none
(참고: 'none'은 등록된 캐시 지시어가 아니며, 비어 있는 값을 가진 헤더 필드를 보내어 무시되는 상황을 피하기 위해 여기 사용되었습니다.)
4. IANA 고려사항
IANA는 [HTTP]에 의해 정의된 "Hypertext Transfer Protocol (HTTP) Field Name Registry"에 다음 항목을 등록했습니다:
- Field Name:
- CDN-Cache-Control
- Status:
- permanent
- Specification Document:
- RFC 9213
- Comments:
- 콘텐츠 전송 네트워크를 대상으로 한 캐시 지시어
5. 보안 고려사항
HTTP 캐싱의 보안 고려사항은 [HTTP-CACHING]의 내용을 따릅니다.
응답에 여러 캐싱 정책을 싣는 능력은 응답이 다양한 시스템에서 어떻게 캐시되는지에 대한 혼란을 초래할 수 있으며, 그 결과 민감한 정보를 포함한 응답이 의도치 않게 재사용될 수 있습니다. 따라서 주의가 필요합니다.
6. 참고문헌
6.1. 규범적 참고문헌
- [HTTP]
- Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., “HTTP Semantics”, STD 97, RFC 9110, DOI 10.17487/RFC9110, June 2022, <https://www.rfc-editor.org/info/rfc9110>.
- [HTTP-CACHING]
- Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., “HTTP Caching”, STD 98, RFC 9111, DOI 10.17487/RFC9111, June 2022, <https://www.rfc-editor.org/info/rfc9111>.
- [RFC2119]
- Bradner, S., “Key words for use in RFCs to Indicate Requirement Levels”, BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.
- [RFC8174]
- Leiba, B., “Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words”, BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.
- [STRUCTURED-FIELDS]
- Nottingham, M. and P-H. Kamp, “Structured Field Values for HTTP”, RFC 8941, DOI 10.17487/RFC8941, February 2021, <https://www.rfc-editor.org/info/rfc8941>.
6.2. 비공식 참고문헌
- [AGE-PENALTY]
- Cohen, E. and H. Kaplan, “The age penalty and its effect on cache performance”, March 2001, <https://dl.acm.org/doi/10.5555/1251440.1251447>.