| 인터넷 엔지니어링 태스크 포스 (IETF) | M. Nottingham |
| Request for Comments: 8288 | 2017년 9월 |
| Obsoletes: 5988 | |
| Category: Standards Track | |
| ISSN: 2070-1721 |
웹 링크
초록
이 명세서는 웹 상의 리소스들 간의 관계("링크")와 그 관계의 유형("링크 관계 타입")에 대한 모델을 정의합니다.
또한 이러한 링크를 Link 헤더 필드를 사용해 HTTP 헤더에 직렬화하는 방법을 정의합니다.
이 메모의 상태
이 문서는 인터넷 표준 트랙 문서입니다.
이 문서는 인터넷 엔지니어링 태스크 포스(IETF)의 산출물입니다. 이는 IETF 커뮤니티의 합의를 반영합니다. 공개 검토를 거쳤으며 인터넷 엔지니어링 스티어링 그룹(IESG)에 의해 발행 승인을 받았습니다. 인터넷 표준에 관한 추가 정보는 RFC 7841의 섹션 2를 참조하십시오.
이 문서의 현재 상태, 정오표, 피드백 제공 방법에 관한 정보는 https://www.rfc-editor.org/info/rfc8288에서 확인할 수 있습니다.
Copyright Notice
Copyright (c) 2017 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 Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.
This document may contain material from IETF Documents or IETF Contributions published or made publicly available before November 10, 2008. The person(s) controlling the copyright in some of this material may not have granted the IETF Trust the right to allow modifications of such material outside the IETF Standards Process. Without obtaining an adequate license from the person(s) controlling the copyright in such materials, this document may not be modified outside the IETF Standards Process, and derivative works of it may not be created outside the IETF Standards Process, except to format it for publication as an RFC or to translate it into languages other than English.
1. 소개
이 명세서는 웹 상의 리소스들 간의 관계("링크")와 그 관계의 유형("링크 관계 타입")에 대한 모델을 정의합니다.
HTML [W3C.REC-html5-20141028] 및 Atom [RFC4287]은 모두 잘 정의된 링크 개념을 가지고 있습니다. 섹션 2는 이러한 형식과 (잠재적으로) 다른 곳에서의 링크를 포괄하는 프레임워크로 이를 일반화합니다.
또한, 섹션 3은 이러한 링크를 전달하기 위한 HTTP 헤더 필드를 정의합니다.
1.1. 표기 규약
이 문서에서 대문자로만 나타나는 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", 및 "OPTIONAL"은 BCP 14 [RFC2119] 및 [RFC8174]에서 설명된 대로 해석됩니다.
이 문서는 Augmented Backus-Naur Form(ABNF) [RFC5234] 표기와 [RFC7230]에서 사용하는 #rule을 포함하여, quoted-string, token, SP, BWS, OWS, RWS, LOALPHA, DIGIT 규칙을 명시적으로 포함합니다.
추가로 다음 규칙들이 포함됩니다:
- URI 및 URI-Reference (RFC3986에서)
- type-name 및 subtype-name (RFC6838에서)
- media-query-list (W3C Media Queries에서)
- Language-Tag (RFC5646에서)
1.2. 적합성 및 오류 처리
적합성과 오류 처리에 관한 요구사항은 [RFC7230]의 섹션 2.5에 강조된 사항이 본 문서에도 적용됩니다.
2. 링크
이 명세서에서 링크는 두 리소스 간의 유형화된 연결이며 다음으로 구성됩니다:
링크는 “링크 컨텍스트가 링크 대상에 대해 링크 관계 타입 리소스를 가진다, 그 리소스는 대상 속성을 가진다”라는 형태의 명제로 볼 수 있습니다.
예를 들어, “https://www.example.com/”은 “https://example.com”에 “canonical” 리소스를 가지며, 그 리소스는 “text/html”이라는 “type”을 가진다고 말할 수 있습니다.
링크 컨텍스트와 링크 대상은 모두 국제화된 리소스 식별자(IRI) [RFC3987]일 수 있습니다. 그러나 일반적인 경우 링크 컨텍스트는 많은 프로토콜(예: HTTP)이 IRI의 역참조를 지원하지 않기 때문에 URI [RFC3986]이기도 합니다. 마찬가지로 링크 대상은 직렬화가 IRI를 지원하지 않는 경우(예: 섹션 3의 Link 헤더 필드) URI로 변환될 수 있습니다.
이 명세서는 링크의 기수성(cardinality)에 제한을 두지 않습니다; 특정 대상에 대해 여러 링크가 존재할 수 있으며 동일한 컨텍스트와 대상 사이에 동일하거나 다른 타입의 여러 링크가 있을 수 있습니다. 또한 특정 직렬화에서의 링크의 상대적 순서나 직렬화 간의 순서(예: Link 헤더 필드와 문서 내 링크)는 본 명세서에서 지정되거나 중요한 것이 아닙니다. 순서를 중요하게 여기는 애플리케이션은 자체적으로 고려할 수 있습니다.
링크는 링크 직렬화로 전달됩니다; 이는 "wire 상의 바이트"이며 다양한 형식으로 나타날 수 있습니다. 예를 들어 Atom과 HTML은 각각의 형식으로 링크를 직렬화하는 방법을 정의했으며, 섹션 3은 링크를 HTTP 헤더 필드에 직렬화하는 방법을 정의합니다.
이 명세서는 서로 다른 직렬화 전반에 걸친 일반적인 링크 문법을 정의하지 않으며, 특정 링크에 대해 특정 컨텍스트를 강제하지도 않습니다; 직렬화는 이러한 측면을 명시해야 합니다.
마지막으로, 링크는 링크 애플리케이션에 의해 사용됩니다. 일반적으로 애플리케이션은 자신이 사용하는 링크 관계 타입과 그것들이 나타날 수 있는 직렬화를 정의합니다. 예를 들어 "웹 브라우징" 애플리케이션은 HTML 링크 직렬화(및 선택적으로 Link 헤더 필드)에서 "stylesheet" 관계 타입을 찾으며, "AtomPub" 애플리케이션은 Atom 직렬화에서 "edit" 및 "edit-media" 링크 관계를 사용합니다.
2.1. 링크 관계 타입
가장 단순한 경우 링크 관계 타입은 링크의 의미를 식별합니다. 예를 들어, 관계 타입이 "copyright"인 링크는 현재 링크 컨텍스트가 링크 대상에 대한 저작권 리소스를 가짐을 나타냅니다.
링크 관계 타입은 대상 리소스가 특정 속성을 가지거나 특정 동작을 수행함을 나타내는 데에도 사용될 수 있습니다; 예를 들어 "service" 링크는 링크 대상이 정의된 프로토콜의 일부로 사용될 수 있음을 의미합니다.
관계 타입은 미디어 타입과 혼동되어서는 안 됩니다; 관계 타입은 링크를 역참조했을 때 얻어지는 표현의 형식을 식별하지 않습니다. 대신, 현재 컨텍스트가 다른 리소스와 어떻게 관련되는지를 설명합니다.
관계 타입은 다른 관계 타입의 존재 여부나 출현 기수성에 기반한 추가 의미를 유추해서는 안 됩니다. 예외적으로 "alternate"와 "stylesheet"의 조합은 역사적 이유로 HTML에서 특별한 의미를 갖습니다.
관계 타입에는 등록된 것과 확장된 것의 두 가지가 있습니다.
2.1.1. 등록된 관계 타입
잘 정의된 관계 타입은 편의성과 다른 애플리케이션의 재사용을 촉진하기 위해 토큰으로 등록될 수 있으며, 절차는 섹션 2.1.1.1에 설명되어 있습니다.
등록된 관계 타입 이름은 reg-rel-type 규칙을 준수해야 하며(섹션 3.3 참고), 문자 단위로 대소문자 구분 없이 비교되어야 합니다. 의미가 특정 애플리케이션에 매우 특화되어 있다면 이름도 그에 맞춰야 하며, 덜 특화된 용도를 위해 일반적인 이름을 남겨두어야 합니다.
등록된 관계 타입은 링크 컨텍스트의 미디어 타입이나 링크 대상의 사용 가능한 표현 미디어 타입을 제한해서는 안 됩니다. 다만 대상 리소스의 동작과 속성(예: 허용되는 HTTP 메서드, 요구되는 요청/응답 미디어 타입)은 지정할 수 있습니다.
역사적으로 등록된 관계 타입은 애플리케이션 정의 기본 URI를 접두사로 붙여 URI로 식별되기도 했습니다(예: Atom의 예). 이 관행은 권장되지 않습니다. 그러한 문자열은 다른 애플리케이션에서 등록된 관계 타입과 동등하게 간주되지 않을 수 있기 때문입니다. 내부적으로 이러한 URI를 사용하는 애플리케이션은 이를 명시적으로 수용하는 직렬화에서만 사용해야 합니다.
2.1.1.1. 링크 관계 타입 등록 절차
"Link Relations" 레지스트리는 “https://www.iana.org/assignments/link-relations/”에 위치합니다. 등록 요청은 해당 지침을 따르거나 “link-relations@ietf.org” 메일링 리스트로 이메일을 보내어 제출할 수 있습니다.
등록 요청은 최소한 다음 정보를 포함해야 합니다:
- Relation Name: 관계 타입의 이름
- Description: 타입 의미에 대한 짧은 영어 설명. 링크 컨텍스트와 링크 대상 간의 관계 관점에서 기술하는 것이 좋습니다.
- Reference: 링크 관계 타입을 규정하는 문서에 대한 참조, 가능하면 해당 문서를 가져올 수 있는 URI 포함. 관련 섹션을 명시할 수는 있으나 필수는 아닙니다.
전문가는 레지스트리에 수집할 추가 필드를 정의할 수 있습니다.
등록된 관계 타입의 일반 요건은 섹션 2.1.1에 설명되어 있습니다.
등록은 자유롭게 접근 가능한 안정적 명세를 참조해야 합니다.
관계 타입은 제3자(전문가 포함)에 의해 등록될 수 있으며, 전문가가 미등록 관계 타입이 널리 배포되어 있고 적시에 등록될 가능성이 낮다고 판단하면 등록할 수 있습니다. 이러한 등록은 여전히 규정된 요구사항과 명세 참조 필요성을 따릅니다.
2.1.1.2. 등록 요청 처리
관계 타입은 Specification Required 정책에 따라 등록되며(참조 RFC8126 섹션 4.6), 이는 지정 전문가의 검토 및 승인을 의미합니다.
레지스트리의 목표는 인터넷에서의 일반적인 링크 사용을 반영하는 것입니다. 따라서 전문가는 남용적이거나 하찮거나 인터넷에서 사용될 가능성이 낮거나 해로운 경우를 제외하고는 등록을 승인하는 쪽으로 편향되어야 합니다. 제안된 응용에 대해 이름이 지나치게 일반적이면 등록을 보류할 수 있습니다.
등록이 거부되는 경우 전문가는 그 이유를 명확히 밝혀야 합니다. 의미에 관한 조언을 제공할 수 있으나, 등록을 차단하지 않는 한 이는 명시적으로 표시되어야 합니다.
요청이 승인되면 전문가는 IANA에 통보하고 등록이 처리됩니다. IESG는 이의 제기에 대한 최종 중재자입니다.
2.1.2. 확장 관계 타입
등록을 원치 않는 애플리케이션은 확장 관계 타입을 사용할 수 있으며, 이는 관계 타입을 고유하게 식별하는 URI입니다. URI는 그 의미를 정의한 리소스를 가리킬 수 있지만, 클라이언트는 그 리소스를 자동으로 접근해서는 안 됩니다(서버 과부하 방지).
확장 관계 타입에 사용되는 URI는 해당 정의를 내린 사람 또는 당사자가 제어하거나 위임받은 것이어야 합니다.
확장 관계 타입을 비교할 때는 문자열(직렬화가 다른 형식인 경우 URI로 변환한 후)을 문자 단위로 대소문자 구분 없이 비교해야 합니다. 따라서 소문자 URI 사용을 권장합니다.
확장 관계 타입은 URI여야 하지만, 직렬화가 다른 형식으로 표현될 수 있고 URI로 변환될 수 있다면 해당 직렬화에서 다른 형태로 표현하는 것을 허용할 수 있습니다.
2.2. 대상 속성
대상 속성은 링크 또는 그 대상에 대해 설명하는 키/값 쌍의 목록입니다; 예를 들어 미디어 타입 힌트가 있습니다.
이들은 개별 링크 관계 타입이나 링크 직렬화에 의해 정의될 수 있습니다.
본 명세서는 대상 속성의 이름, 기수성, 또는 사용을 조정하려 하지 않습니다. 직렬화를 작성하고 유지하는 이들은 의미나 문법의 충돌을 피하기 위해 대상 속성을 조정해야 하며 자체 레지스트리를 정의할 수 있습니다.
대상 속성의 이름은 token 규칙을 따르는 것이 바람직하지만, 이식성을 위해 "%", "’", "*" 문자를 포함해서는 안 되며 대소문자 구분 없이 비교되어야 합니다.
대상 속성 정의는 다음을 지정하는 것이 바람직합니다:
- 값을 유니코드 또는 그 부분집합으로 직렬화하는 방법(직렬화 간 이식성 최대화),
- 주어진 링크에 대해 대상 속성이 여러 번 발생할 때의 의미와 오류 처리.
본 명세서는 Link HTTP 헤더 필드에서 사용하기 위한 대상 속성을 섹션 3.4에 정의합니다.
3. HTTP 헤더의 링크 직렬화
Link 헤더 필드는 하나 이상의 링크를 HTTP 헤더에 직렬화하는 수단을 제공합니다.
필드 값의 ABNF는 다음과 같습니다:
Link = #link-value link-value = "<" URI-Reference ">" *( OWS ";" OWS link-param ) link-param = token BWS [ "=" BWS ( token / quoted-string ) ]
어떤 link-param이든 token 또는 quoted-string 문법을 사용한 값으로 생성될 수 있으므로 수신자는 두 형식을 모두 파싱할 수 있어야 합니다. 즉, 다음의 파라미터들은 동등합니다:
x=y x="y"
이전의 Link 헤더 정의들은 token과 quoted-string 형식을 명시적으로 동일시하지 않았습니다; title 파라미터는 항상 인용되었고 hreflang 파라미터는 항상 token이었습니다. 상호운용성을 극대화하려는 송신자는 해당 형식을 따르는 것이 좋습니다.
개별 link-params는 필요한 언인쿼팅 후의 값에 대한 문법을 지정합니다(RFC7230 섹션 3.2.6 참조).
본 명세서는 일반 링크 모델의 일부인 "rel", "anchor", "rev" 링크 파라미터뿐만 아니라 직렬화에서 정의된 대상 속성인 "hreflang", "media", "title", "title*", 및 "type" 링크 파라미터를 설정합니다.
3.1. 링크 대상
각 link-value는 꺾쇠 괄호("<>") 안에 URI-Reference 형태로 하나의 대상 IRI를 전달합니다(필요 시 URI-Reference로 변환). 만약 URI-Reference가 상대적이면 파서는 RFC3986 섹션 5에 따라 이를 해석해야 합니다. 메시지 콘텐츠에 나타난 어떤 기준 IRI(base IRI)도 적용되지 않는다는 점에 유의하세요.
3.2. 링크 컨텍스트
기본적으로 Link 헤더 필드에 전달된 링크의 컨텍스트는 해당 링크가 연관된 표현의 URL이며(RFC7231 섹션 3.1.4.1 참조), URI로 직렬화됩니다.
anchor 파라미터가 존재하면 이는 해당 표현의 일부(예: 프래그먼트)나 제3의 리소스(절대 URI일 때)로 이를 대체합니다. anchor 값이 상대 URI인 경우 파서는 RFC3986 섹션 5에 따라 이를 해석해야 합니다. 본문에 있는 기준 URI는 적용되지 않습니다.
anchor 파라미터 값의 ABNF는 다음과 같습니다:
URI-Reference ; Section 4.1 of [RFC3986]
링크 애플리케이션은 anchor 파라미터가 있는 링크를 무시할 수 있습니다. 예를 들어, 사용 중인 애플리케이션이 링크 컨텍스트를 다른 리소스로 할당하는 것을 허용하지 않을 수 있습니다. 그런 경우 전체 링크를 무시해야 하며, anchor를 적용하지 않고 링크를 처리해서는 안 됩니다.
HTTP 상태 코드 및 응답 헤더에 따라 링크 컨텍스트가 “익명(anonymous)”일 수 있다는 점에 유의하세요(예: GET 요청에 대한 404 응답).
3.3. 관계 타입
Link 헤더 필드에서 전달된 링크의 관계 타입은 "rel" 파라미터 값으로 전달됩니다. rel 파라미터는 반드시 존재해야 하며, 단일 link-value에서 두 번 이상 나타나서는 안 됩니다; 첫 번째 이후의 발생은 파서가 무시해야 합니다.
rel 파라미터는 여러 링크 관계 타입을 포함할 수 있습니다. 이 경우 동일한 컨텍스트, 대상 및 대상 속성을 공유하는 여러 링크가 성립됩니다.
과거에 "rev" 파라미터는 관계 의미가 역방향임을 표시하는 데 사용되었습니다. 즉 A에서 B로 REL="X"인 링크는 B에서 A로 REV="X"인 링크와 동일한 관계를 표현합니다. rev는 저자를 혼동시키는 경우가 많기 때문에 본 명세서에서는 사용이 권장되지 않습니다; 대부분의 경우 별도의 관계 타입을 사용하는 것이 바람직합니다.
rel 및 rev 파라미터 값의 ABNF는 다음과 같습니다:
relation-type *( 1*SP relation-type )
여기서:
relation-type = reg-rel-type / ext-rel-type reg-rel-type = LOALPHA *( LOALPHA / DIGIT / "." / "-" ) ext-rel-type = URI ; Section 3 of [RFC3986]
확장 관계 타입은 Link 헤더 필드에서 절대 URI여야 하며, 세미콜론(;)이나 쉼표(,)와 같은 토큰에서 허용되지 않는 문자를 포함하면 인용되어야 합니다(헤더 필드 자체에서 이러한 문자는 구분자이기 때문).
3.4. 대상 속성
Link 헤더 필드는 이 직렬화에 특정한 여러 대상 속성을 정의하며 확장 대상 속성도 허용합니다. 대상 속성은 Link 헤더 필드에서 파라미터로 직렬화됩니다(RFC7231 섹션 3.1.1.1의 문법 정의 참조).
3.4.1. 직렬화-정의 속성
"hreflang", "media", "title", "title*", 및 "type" 링크-파라미터는 링크의 직렬화-정의 대상 속성으로 변환될 수 있습니다.
"hreflang" 속성은 존재할 때 링크를 역참조했을 때의 결과 언어에 대한 힌트를 제공합니다. 이는 단지 힌트일 뿐이며, 예를 들어 실제로 링크를 따라 얻은 HTTP 응답의 Content-Language 헤더를 무시하지 않습니다. 단일 link-value에 여러 hreflang이 있으면 여러 언어가 제공됨을 나타냅니다.
hreflang 파라미터 값의 ABNF는 다음과 같습니다:
Language-Tag
"media" 속성은 스타일 정보의 대상 매체를 나타내며(HTML5 섹션 4.2.4 참조) 값에 세미콜론(;)이나 쉼표(,)가 포함되면 반드시 인용되어야 합니다. link-value 당 media 속성은 하나만 있어야 하며, 이후의 발생은 파서가 무시해야 합니다.
media 파라미터 값의 ABNF는 다음과 같습니다:
media-query-list
"title" 속성은 링크 대상의 목적지를 사람 읽을 수 있는 식별자(예: 메뉴 항목)로 표시하는 데 사용되며, Content-Language 헤더 필드가 있을 때 그 언어로 간주됩니다. title 속성은 단일 link-value에 두 번 이상 나타나서는 안 되며 이후 발생은 파서가 무시해야 합니다.
"title*" 링크-파라미터는 RFC8187에 따라 다른 문자 집합으로 인코딩하거나 언어 정보를 포함할 수 있습니다. title* 링크-파라미터는 단일 link-value에 두 번 이상 나타나서는 안 되며 이후 발생은 파서가 무시해야 합니다. 속성이 언어 정보를 포함하지 않을 경우 그 언어는 Content-Language 헤더로 표시됩니다(존재할 때).
title과 title*이 모두 나타나면 애플리케이션은 title*의 값을 사용하는 것이 바람직합니다.
"type" 속성은 링크를 역참조했을 때의 결과 미디어 타입에 대한 힌트를 제공합니다. 이는 단지 힌트이며, 실제로 링크를 따라 얻은 HTTP 응답의 Content-Type 헤더를 무시하지 않습니다. type 속성은 단일 link-value에 두 번 이상 나타나서는 안 되며 이후 발생은 파서가 무시해야 합니다.
type 파라미터 값의 ABNF는 다음과 같습니다:
type-name "/" subtype-name ; see Section 4.2 of [RFC6838]
3.4.2. 확장 속성
다른 link-params는 링크 확장으로 간주되며 대상 속성으로 처리됩니다.
이러한 대상 속성은 RFC8187 인코딩을 사용할 수 있습니다(예: "example" 및 "example*"). 두 형식이 모두 존재할 경우 동일한 대상 속성으로 간주되어야 하며, 애플리케이션은 이름이 "*"로 끝나는 쪽의 값을 RFC8187 디코딩 후 사용하는 것이 바람직하나, 디코딩 오류가 발생하거나 디코딩을 지원하지 않는 경우 대체 값으로 되돌아갈 수 있습니다.
3.5. Link 헤더 필드 예시
예를 들면:
Link: <http://example.com/TheBook/chapter2>; rel="previous";
title="previous chapter"
이는 “chapter2”가 논리적 내비게이션 경로에서 이 리소스보다 이전에 있음을 나타냅니다.
유사하게,
Link: </>; rel="http://example.net/foo"
이는 루트 리소스("/")가 확장 관계 타입 "http://example.net/foo"로 이 리소스와 관련되어 있음을 나타냅니다.
다음 링크는:
Link: </terms>; rel="copyright"; anchor="#foo"
이는 연결된 저작권 조건이 문서의 프래그먼트 식별자 "foo"가 가리키는 부분에만 적용됨을 나타냅니다.
다음 예시는 Link 헤더 필드가 여러 링크를 인코딩하는 사례와 RFC 8187 인코딩을 사용하여 비-ASCII 문자와 언어 정보를 인코딩하는 방법을 보여줍니다.
Link: </TheBook/chapter2>;
rel="previous"; title*=UTF-8'de'letztes%20Kapitel,
</TheBook/chapter4>;
rel="next"; title*=UTF-8'de'n%c3%a4chstes%20Kapitel
여기서 두 링크 모두 독일어("de")로 인코딩된 제목을 가지고 있으며, 두 번째 링크는 유니코드 코드 포인트 U+00E4를 포함합니다.
링크 값은 동일한 링크 대상과 링크 컨텍스트 사이에 여러 링크를 전달할 수 있습니다; 예를 들어:
Link: <http://example.org/>;
rel="start http://example.net/relation/other"
여기서 "http://example.org/"에 대한 링크는 등록된 관계 타입 "start"와 확장 관계 타입 "http://example.net/relation/other"을 가집니다.
마지막으로, 다음 헤더 필드는:
Link: <https://example.org/>; rel="start",
<https://example.org/index>; rel="index"
다음과 동등합니다:
Link: <https://example.org/>; rel="start" Link: <https://example.org/index>; rel="index"
4. IANA 고려사항
4.1. Link HTTP 헤더 필드 등록
이 명세서는 HTTP의 "Message Headers" 레지스트리에서 "Link" 항목을 본 문서를 참조하도록 업데이트합니다(RFC3864 참조).
Header Field Name: Link Protocol: http Status: standard Reference: RFC 8288
4.2. 링크 관계 타입 레지스트리
이 명세서는 "Link Relation Types" 레지스트리의 등록 절차를 업데이트합니다; 섹션 2.1.1.1 참조. 또한 그 레지스트리의 RFC 5988에 대한 모든 참조는 본 문서로 대체되었습니다.
IANA는 레지스트리에 대한 모든 수신 요청을 본 문서 및(정의된 경우) 전문가가 설정한 프로세스로 안내할 것입니다; 일반적으로 이는 레지스트리 웹 페이지로의 참조를 의미합니다.
전문가는 레지스트리에 수집할 추가 필드를 정의할 수 있습니다(섹션 2.1.1.1 참조).
4.3. 링크 관계 응용 데이터 레지스트리
본 명세에 따라 IANA는 사용되지 않았고 향후 사용이 예상되지 않으므로 "Link Relation Application Data" 레지스트리를 제거했습니다.
5. 보안 고려사항
Link 헤더 필드의 내용은 보안, 프라이버시 또는 무결성이 보장되지 않습니다. 이러한 속성을 제공하는 현재 유일한 종단 간 방법은 HTTP에 대한 전송 계층 보안(TLS)을 사용하는 것입니다 (RFC2818 참조).
링크 애플리케이션은 HTTP 헤더 필드에서 수집된 링크를 자동으로 따라가거나 신뢰하거나 사용하는 경우 열릴 수 있는 공격 벡터를 고려해야 합니다.
예를 들어, anchor 파라미터를 사용하여 링크 컨텍스트를 다른 리소스와 연결하는 Link 헤더 필드는 제3자의 주장으로 인해 부정확하거나 악의적일 수 있으므로 신뢰할 수 없습니다. 애플리케이션은 이러한 링크를 폐기하도록 지정하거나(예: 리소스 간에 동일한 권한(authority)이 있음이 확립된 경우에만 허용) 위험을 완화할 수 있습니다.
링크를 역참조하는 것은 사용 중인 애플리케이션에 따라 여러 위험을 수반합니다. 예를 들어 Referer 헤더(RFC7231 참조)는 애플리케이션 상태(민감한 정보 포함)에 대한 정보를 노출할 수 있습니다. 마찬가지로 쿠키(RFC6265 참조)도 공격 벡터가 될 수 있습니다. 애플리케이션은 이러한 메커니즘이 어떻게 동작해야 하는지 신중히 규정하여 위험을 완화할 수 있습니다.
Link 헤더 필드는 IRI와 URI를 광범위하게 사용합니다. IRI 관련 보안 고려사항은 RFC3987 섹션 8을, URI 관련 보안 고려사항은 RFC3986 섹션 7을, HTTP 헤더 필드 관련 보안 고려사항은 RFC7230 섹션 9를 참조하십시오.
6. 국제화 고려사항
링크 대상은 IRI를 지원하지 않는 직렬화에서 표현하기 위해 URI로 변환되어야 할 수 있습니다. 이는 Link HTTP 헤더 필드를 포함합니다.
유사하게, Link 헤더 필드의 anchor 파라미터는 IRI를 지원하지 않으므로 포함하기 전에 IRI를 URI로 변환해야 합니다.
관계 타입은 비교를 용이하게 하기 위해 URI로 정의됩니다. 이들은 최종 사용자에게 표시될 것으로 기대되지 않습니다.
등록된 관계 이름은 소문자 ASCII 문자여야 한다는 점에 유의하십시오.
7. 참고문헌
7.1. 규범적 참고문헌
- [RFC2119]
- Bradner, S., “Key words for use in RFCs to Indicate Requirement Levels”, BCP 14, RFC 2119, March 1997.
- [RFC3864]
- Klyne, G., Nottingham, M., and J. Mogul, “Registration Procedures for Message Header Fields”, BCP 90, RFC 3864, September 2004.
- [RFC3986]
- Berners-Lee, T., Fielding, R., and L. Masinter, “Uniform Resource Identifier (URI): Generic Syntax”, STD 66, RFC 3986, January 2005.
- [RFC3987]
- Duerst, M. and M. Suignard, “Internationalized Resource Identifiers (IRIs)”, RFC 3987, January 2005.
- [RFC5234]
- Crocker, D., Ed. and P. Overell, “Augmented BNF for Syntax Specifications: ABNF”, STD 68, RFC 5234, January 2008.
- [RFC5646]
- Phillips, A., Ed. and M. Davis, Ed., “Tags for Identifying Languages”, BCP 47, RFC 5646, September 2009.
- [RFC6838]
- Freed, N., Klensin, J., and T. Hansen, “Media Type Specifications and Registration Procedures”, BCP 13, RFC 6838, January 2013.
- [RFC7230]
- Fielding, R., Ed. and J. Reschke, Ed., “Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing”, RFC 7230, June 2014.
- [RFC7231]
- Fielding, R., Ed. and J. Reschke, Ed., “Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content”, RFC 7231, June 2014.
- [RFC8126]
- Cotton, M., Leiba, B., and T. Narten, “Guidelines for Writing an IANA Considerations Section in RFCs”, BCP 26, RFC 8126, June 2017.
- [RFC8174]
- Leiba, B., “Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words”, BCP 14, RFC 8174, May 2017.
- [RFC8187]
- Reschke, J., “Indicating Character Encoding and Language for HTTP Header Field Parameters”, RFC 8187, September 2017.
- [W3C.REC-css3-mediaqueries-20120619]
- Rivoal, F., “Media Queries”, W3C Recommendation, June 2012.
7.2. 비규범적 참고문헌
- [RFC2046]
- Freed, N. and N. Borenstein, “Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types”, RFC 2046, November 1996.
- [RFC2818]
- Rescorla, E., “HTTP Over TLS”, RFC 2818, May 2000.
- [RFC4287]
- Nottingham, M., Ed. and R. Sayre, Ed., “The Atom Syndication Format”, RFC 4287, December 2005.
- [RFC6265]
- Barth, A., “HTTP State Management Mechanism”, RFC 6265, April 2011.
- [W3C.REC-html5-20141028]
- Hickson, I., Berjon, R., Faulkner, S., et al., “HTML5”, W3C Recommendation, October 2014.
부록 A. 다른 링크 직렬화에 대한 주석
헤더 필드(섹션 3)는 링크의 한 가지 직렬화에 불과하며, 다른 명세들은 대체 직렬화를 정의했습니다.
A.1. HTML의 링크 직렬화
HTML은 Link 헤더 필드의 원래 문법에 영감을 주었으며, 본 문서의 많은 설계 결정은 이에 대한 호환성을 유지하려는 욕구에서 비롯되었습니다.
HTML에서 link 요소는 "href" 속성으로 대상 URI를, "rel"로 관계 타입을 전달하여 이곳에서 규정한 링크로 매핑될 수 있습니다. 링크의 컨텍스트는 전체 HTML 문서와 연관된 URI입니다. HTML은 "media", "hreflang", "type", "sizes" 등의 링크 속성을 정의합니다.
HTML5의 섹션 4.8은 현대 HTML 링크를 정의합니다. 해당 문서는 Microformats 위키를 레지스트리로 연결하며, 시간이 지나면 IANA 레지스트리가 그 내용을 반영하고 이상적으로는 교체할 수 있어야 합니다(그러나 이는 HTML 커뮤니티에 달려 있습니다).
기존 HTML 콘텐츠 조사 결과 등록되지 않은, URI가 아닌 짧은 링크 관계 타입이 일반적으로 사용되는 것으로 나타났습니다. HTML을 소비하는 구현체는 그러한 비등록 짧은 링크를 오류로 간주해서는 안 되며, 문서에 국한된(local scope) 의미를 갖는 것으로 처리해야 합니다.
마지막으로, HTML 명세는 "alternate" 관계 타입이 동일 링크에서 다른 관계 타입과 결합될 때 특별한 의미를 부여합니다. 이러한 링크는 Link 헤더 필드에서 단일 관계 타입 목록(예: rel="alternate stylesheet")으로 직렬화되어 이 관계를 보존해야 합니다.
A.2. Atom의 링크 직렬화
Atom은 atom:link 요소에서 링크를 전달하는 직렬화로, "href" 속성은 링크 대상, "rel" 속성은 관계 타입을 나타냅니다. 링크의 컨텍스트는 피드 위치자나 항목 ID에 따라 달라지며, 일반적으로 피드 수준 링크는 Link 헤더 필드로 전송하기에 적합합니다.
atom:link를 Link 헤더 필드로 직렬화할 때는 링크 대상을 URI로 변환해야 합니다.
Atom은 확장 관계 타입을 IRI로 정의합니다. 본 명세는 비교를 단순화하고 오류를 줄이기 위해 이를 URI로 재정의합니다.
Atom은 등록된 링크 관계 타입을 "http://www.iana.org/assignments/relation/" 접두사를 사용하여 절대 URI로 직렬화할 수 있습니다. 이 접두사는 Atom 직렬화에 특화된 것입니다.
또한 링크 관계 타입은 항상 대소문자 구분 방식으로 비교되므로, Atom 문서에 직렬화할 때는 등록된 형태(대개 소문자)로 변환하는 것이 권장됩니다.
Link 헤더 필드는 단일 링크에 여러 관계를 직렬화할 수 있지만 atom:link는 그렇지 않습니다. 이 경우 하나의 link-value는 여러 atom:link 요소에 매핑될 수 있습니다.
HTML과 마찬가지로 atom:link는 Link 헤더 문법에 명시적으로 반영되지 않은 몇몇 속성을 정의하지만, 이러한 속성은 링크 확장으로 사용되어 충실도를 유지할 수 있습니다.
부록 B. Link 헤더 필드 파싱 알고리즘
이 부록은 헤더 집합에서 Link 헤더를 추출하는 알고리즘, Link 헤더 필드 값을 파싱하는 알고리즘, 및 필드 값의 일반 부분을 파싱하는 알고리즘을 제시하는 비규범적 알고리즘 집합을 개괄합니다.
이 알고리즘들은 ABNF가 제시하는 문법보다 더 관대합니다; 여기에 포함된 오류 처리는 합리적인 접근법이지만 필수적인 것은 아닙니다. 따라서 이들은 권고적이며, 불일치가 있는 경우에는 본 명세서 본문에 정의된 동작이 올바른 동작입니다.
B.1. 헤더 집합에서 링크 파싱
이 알고리즘은 HTTP 헤더 집합에 포함된 Link 헤더 필드를 파싱하는 데 사용됩니다. (field_name, field_value) 쌍의 header_set이 주어지면(ASCII 인코딩 가정), 링크 객체 목록을 반환합니다.
- field_values를 field_name이 대소문자 구분 없이 "link"와 일치하는 header_set의 멤버들로 구성된 리스트로 둡니다.
- links를 빈 리스트로 둡니다.
- 각 field_value에 대해:
- field_value에서 링크 필드 값 파싱(부록 B.2)의 결과를 value_links로 둡니다.
- value_links의 각 멤버를 links에 추가합니다.
- links를 반환합니다.
B.2. 링크 필드 값 파싱
이 알고리즘은 Link 헤더 필드에서 쉼표로 구분된 0개 이상의 link-value를 파싱합니다. ASCII 문자열 field_value가 주어지면 링크 객체 목록을 반환합니다.
- links를 빈 리스트로 둡니다.
- field_value에 내용이 있는 동안:
- 선행 OWS를 소비합니다.
- 첫 문자가 "<"가 아니면 links를 반환합니다.
- 첫 문자인 "<"를 버립니다.
- 첫 ">" 문자 또는 field_value의 끝까지를 소비하고 그 결과를 target_string으로 둡니다.
- 다음 문자가 ">"가 아니면 links를 반환합니다.
- 선행 ">" 문자를 버립니다.
- link_parameters를 파싱 파라미터(부록 B.3)의 결과로 둡니다(0개 이상의 문자 소비).
- target_uri를 target_string을 상대적으로 해석한 결과로 둡니다(RFC3986 섹션 5.2). 본문에 있는 기준 URI는 사용되지 않습니다.
- relations_string을 link_parameters에서 첫 번째 튜플 whose first item matches "rel"의 두 번째 항목으로 하거나, 없으면 빈 문자열로 둡니다.
- relations_string을 RWS로 분할하여 relation_types 리스트로 만듭니다.
- context_string을 link_parameters에서 첫 번째 튜플 whose first item matches "anchor"의 두 번째 항목으로 둡니다. 없으면 컨텍스트 문자열은 Link 헤더를 갖는 표현의 URL(RFC7231 섹션 3.1.4.1)이며, URI로 직렬화됩니다. URL이 익명인 경우 context_string은 null입니다.
- context_uri를 context_string을 상대적으로 해석한 결과로 둡니다(RFC3986 섹션 5.2), 만약 context_string이 null이면 context는 null입니다. 본문 기준 URI는 사용되지 않습니다.
- target_attributes를 빈 리스트로 둡니다.
- link_parameters의 각 튜플(param_name, param_value)에 대해:
- param_name이 "rel" 또는 "anchor"와 일치하면 이 튜플을 건너뜁니다.
- param_name이 "media", "title", "title*" 또는 "type"이며 target_attributes가 이미 같은 param_name을 가진 튜플을 포함하면 이 튜플을 건너뜁니다.
- (param_name, param_value)를 target_attributes에 추가합니다.
- star_param_names를 link_parameters 중 param_name의 마지막 문자가 "*"인 param_name들의 집합으로 둡니다.
- 각 star_param_name에 대해:
- base_param_name을 star_param_name에서 마지막 문자를 제거한 값으로 둡니다.
- 만약 구현체가 base_param_name의 국제화된 형태를 지원하지 않기로 선택하면(금지 포함), link_parameters에서 star_param_name인 튜플들을 모두 제거하고 다음 star_param_name으로 건너뜁니다.
- link_parameters에서 base_param_name인 튜플들을 모두 제거합니다.
- link_parameters에서 star_param_name인 모든 튜플의 첫 번째 멤버를 base_param_name으로 변경합니다.
- 각 relation_type에 대해:
- relation_type을 소문자로 정규화합니다.
- target이 target_uri, 관계 타입이 relation_type, 컨텍스트가 context_uri, 대상 속성이 target_attributes인 링크 객체를 links에 추가합니다.
- links를 반환합니다.
B.3. 파라미터 파싱
이 알고리즘은 헤더 필드 값에서 파라미터를 파싱합니다. ASCII 문자열 input이 주어지면 포함된 (parameter_name, parameter_value) 튜플 목록을 반환합니다. input은 파싱된 파라미터를 제거하도록 수정됩니다.
- parameters를 빈 리스트로 둡니다.
- input에 내용이 있는 동안:
- 선행 OWS를 소비합니다.
- 첫 문자가 ";"가 아니면 parameters를 반환합니다.
- 선행 ";" 문자를 버립니다.
- 선행 OWS를 소비합니다.
- 첫 BWS, "=", ";" 또는 "," 문자 또는 입력의 끝까지를 소비하여 parameter_name으로 둡니다.
- 선행 BWS를 소비합니다.
- 다음 문자가 "="이면:
- 선행 "=" 문자를 버립니다.
- 선행 BWS를 소비합니다.
- 다음 문자가 DQUOTE이면 인용 문자열 파싱(부록 B.4)의 결과를 parameter_value로 둡니다(0개 이상의 문자 소비).
- 그렇지 않으면 첫 ";" 또는 "," 문자 전까지 또는 입력의 끝까지를 소비하여 parameter_value로 둡니다.
- parameter_name의 마지막 문자가 "*"이면 parameter_value를 RFC8187에 따라 디코딩합니다. 복구 불가능한 오류가 발생해도 처리를 계속합니다.
- 그렇지 않으면:
- parameter_value를 빈 문자열로 둡니다.
- parameter_name을 소문자로 정규화합니다.
- (parameter_name, parameter_value)를 parameters에 추가합니다.
- 선행 OWS를 소비합니다.
- 다음 문자가 ","이거나 입력의 끝이면 처리 중단하고 parameters를 반환합니다.
B.4. 인용 문자열 파싱
이 알고리즘은 RFC7230 섹션 3.2.6에 따라 인용 문자열을 파싱합니다. ASCII 문자열 input이 주어지면 언인쿼팅된 문자열을 반환합니다. input은 파싱된 문자열을 제거하도록 수정됩니다.
- output을 빈 문자열로 둡니다.
- input의 첫 문자가 DQUOTE가 아니면 output을 반환합니다.
- 첫 문자를 버립니다.
- input에 내용이 있는 동안:
- 첫 문자가 백슬래시("\")이면:
- 첫 문자를 버립니다.
- 더 이상 입력이 없으면 output을 반환합니다.
- 그렇지 않으면 첫 문자를 소비하고 output에 추가합니다.
- 그렇지 않고 첫 문자가 DQUOTE이면 그것을 버리고 output을 반환합니다.
- 그렇지 않으면 첫 문자를 소비하고 output에 추가합니다.
- 첫 문자가 백슬래시("\")이면:
- output을 반환합니다.
부록 C. RFC 5988로부터의 변경사항
이 명세서는 이전 버전인 RFC 5988과 다음과 같은 차이점이 있습니다:
- 초기 관계 타입 등록 항목은 RFC 5988에서 이미 등록되었으므로 제거되었습니다.
- 소개가 축약되었습니다.
- "Link Relation Application Data" 레지스트리가 제거되었습니다.
- 정오표(errata)가 통합되었습니다.
- 참조가 업데이트되었습니다.
- 링크 기수성에 대한 설명이 명확해졌습니다.
- 용어가 "target IRI" 및 "context IRI"에서 각각 "link target" 및 "link context"로 변경되었습니다.
- 등록된 관계 타입에 URI를 할당하는 것은 직렬화별로 하도록 변경되었습니다.
- Link 헤더 필드가 HTML 및 Atom 링크와 의미적으로 동등하다는 오해의 소지가 있는 진술이 제거되었습니다.
- "link serialisations" 및 "link applications"의 정의와 사용이 보다 신중해졌습니다.
- 대상 속성의 기수성(일반적 및 "type"에 대해)이 명확히 규정되었습니다.
- Link 헤더 필드의 기본 링크 컨텍스트를 RFC 7231에 따라 표현의 식별성(identity)에 의존하도록 수정했습니다.
- Link 헤더의 권장 파싱 알고리즘을 정의했습니다.
- 대상 속성의 값 공간 및 정의가 지정되었습니다.
- ABNF가 RFC7230과 호환되도록 업데이트되었습니다(특히 공백이 명시적임).
- HTTP 헤더 필드의 일부 파라미터가 이제 token으로 나타날 수 있습니다.
- HTTP 헤더의 파라미터가 이제 값이 없을 수 있습니다.
- 인용 문자열 처리 방식이 RFC7230에 의해 정의되었습니다.
- type 헤더 필드 파라미터는 이제 "/"를 허용하지 않는 token이므로 인용되어야 합니다.