| 인터넷 엔지니어링 태스크 포스 (IETF) | J. Reschke |
| 의견 요청: 6266 | greenbytes |
| 업데이트: 2616 | 2011년 6월 |
| 카테고리: 표준 트랙 | |
| ISSN: 2070-1721 |
하이퍼텍스트 전송 프로토콜 (HTTP)에서의 Content-Disposition 헤더 필드 사용
초록
RFC 2616은 Content-Disposition 응답 헤더 필드를 정의하지만, 이것이 HTTP/1.1 표준의 일부는 아니라고 지적합니다. 이 명세서는 HTTP에서 사용되는 Content-Disposition의 정의와 등록을 인계받아 국제화 관련 측면을 명확히 합니다.
이 메모의 상태
이 문서는 인터넷 표준 트랙 문서입니다.
이 문서는 인터넷 엔지니어링 태스크 포스(IETF)의 산출물입니다. 이는 IETF 커뮤니티의 합의를 반영합니다. 공개 검토를 거쳤으며 인터넷 엔지니어링 스티어링 그룹(IESG)에 의해 발행 승인을 받았습니다. 인터넷 표준에 관한 추가 정보는 RFC 5741의 섹션 2를 참조하십시오.
이 문서의 현재 상태, 정오표, 피드백 제공 방법에 관한 정보는 http://www.rfc-editor.org/info/rfc6266에서 확인할 수 있습니다.
Copyright Notice
Copyright (c) 2011 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 (http://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.
1. 소개
RFC 2616은 Content-Disposition 응답 헤더 필드(Section 19.5.1 of [RFC2616])을 정의하지만, 그것이 HTTP/1.1 표준의 일부가 아니라고 지적합니다(Section 15.5).
Content-Disposition은 HTTP 표준의 일부가 아니지만, 널리 구현되어 있으므로, 구현자들을 위해 그 사용법과 위험을 문서화합니다.
이 명세서는 HTTP에서 사용되는 Content-Disposition의 정의와 등록을 인계받습니다. 기존 사용자 에이전트(UA)와의 상호운용성 테스트를 바탕으로, 이 문서는 Multipart Internet Mail Extensions(MIME) 변형([RFC2183]) 에 정의된 기능의 프로필을 완전하게 정의하고, 국제화 측면도 명확히 합니다.
2. 표기 규약
이 문서에서 사용된 핵심 용어 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", 및 "OPTIONAL"은 [RFC2119]에 설명된 대로 해석됩니다.
이 명세서는 Section 2.1의 ABNF 표기(augmented BNF)를 사용하며, 암시적 선형 공백(LWS)에 대한 규칙을 포함합니다.
3. 적합성 및 오류 처리
이 명세서는 Content-Disposition 헤더 필드의 송신자(보통 HTTP 오리진 서버)와 수신자(보통 HTTP 사용자 에이전트)에 대한 적합성 기준을 정의합니다. 구현이 자신의 역할과 관련된 모든 요구사항을 준수하면 적합한 구현으로 간주됩니다.
이 명세서는 또한 헤더 필드 값의 특정 형태를 ABNF와 서술로써 무효로 정의하지만(섹션 4), 이러한 무효한 필드 값을 특별히 처리하는 방법은 정의하지 않습니다.
송신자는 무효한 Content-Disposition 헤더 필드를 생성해서는 안됩니다.
수신자는 무효한 헤더 필드에서 사용 가능한 값을 복구하기 위한 조치를 취할 수는 있으나, 메시지를 즉시 거부해서는 안됩니다 (예: 구현이 밸리데이터인 경우처럼 명시적으로 바람직한 동작인 경우는 제외). 따라서 무효한 필드의 기본 처리 방식은 이를 무시하는 것입니다.
4. 헤더 필드 정의
Content-Disposition 응답 헤더 필드는 응답 페이로드를 어떻게 처리할지에 대한 추가 정보를 전달하는 데 사용되며, 로컬에 응답 페이로드를 저장할 때 사용할 파일 이름과 같은 추가 메타데이터를 첨부하는 데에도 사용될 수 있습니다.
4.1. 문법
content-disposition = "Content-Disposition" ":"
disposition-type *( ";" disposition-parm )
disposition-type = "inline" | "attachment" | disp-ext-type
; case-insensitive
disp-ext-type = token
disposition-parm = filename-parm | disp-ext-parm
filename-parm = "filename" "=" value
| "filename*" "=" ext-value
disp-ext-parm = token "=" value
| ext-token "=" ext-value
ext-token = <the characters in token, followed by "*">
다음은 [RFC2616]에서 정의된 항목입니다:
token = <token, defined in [RFC2616], Section 2.2> quoted-string = <quoted-string, defined in [RFC2616], Section 2.2> value = <value, defined in [RFC2616], Section 3.6> ; token | quoted-string
[RFC5987]에서 정의된 항목:
ext-value = <ext-value, defined in [RFC5987], Section 3.2>
동일한 매개변수 이름이 여러 번 나타나는 Content-Disposition 헤더 필드 값은 무효입니다.
또한 암시된 선형 공백 규칙(Section 2.1 of [RFC2616]) 때문에 단어(token 또는 quoted-string)와 구분자 사이에 선택적 공백이 올 수 있습니다.
또한 ext-value에 사용되는 형식은 자연어(e.g., "en")를 지정할 수 있게 하지만, 파일 이름에는 제한적으로만 유용하며 수신자에게 무시될 가능성이 높습니다.
4.2. Disposition 유형
처리 유형이 "attachment"(대소문자 구분 없이)와 일치하면, 이는 수신자가 응답을 정상적으로 처리하는 대신(미디어 타입에 따른 처리) 로컬에 저장하도록 사용자에게 저장 프롬프트를 표시해야 함을 나타냅니다.
반면에 "inline"(대소문자 구분 없이)과 일치하면 이는 기본 처리를 의미합니다. 따라서 "inline" 처리 유형은 파일 이름과 같은 추가 매개변수가 첨가될 때에만 유용합니다(아래 참조).
알려지지 않았거나 처리되지 않는 처리 유형은 수신자가 "attachment"와 같은 방식으로 처리해야 합니다([RFC2183], Section 2.8 참조).
4.3. Disposition 매개변수: 'Filename'
"filename" 및 "filename*" 매개변수(대소문자 구분 없이 일치)는 메시지 페이로드를 저장하기 위한 파일 이름을 구성하는 방법에 대한 정보를 제공합니다.
처리 유형에 따라 이 정보는 즉시 사용될 수 있습니다(예: "attachment"로 인해 발생하는 "다른 이름으로 저장..." 상호작용) 또는 나중에 사용될 수 있습니다(예: 사용자가 현재 표시 중인 페이지 내용을 저장하기로 결정할 때).
"filename"과 "filename*"의 차이는 "filename*"이 [RFC5987]에 정의된 인코딩을 사용하여 ISO-8859-1 문자 집합에 없는 문자를 사용할 수 있게 해준다는 점입니다.
이 명세서 이전의 많은 사용자 에이전트 구현은 "filename*"을 이해하지 못합니다. 따라서 하나의 헤더 필드 값에 "filename"과 "filename*"이 모두 포함된 경우, 수신자는 가능하면 "filename*"을 선택하고 "filename"은 무시해야 합니다. 이렇게 하면 송신자는 더 표현력이 높은 "filename*" 매개변수와 레거시 수신자를 위한 대체용 "filename" 매개변수를 동시에 전송하여 특정 사용자 에이전트를 특수 처리하는 일을 피할 수 있습니다(예시는 섹션 5 참조).
수신자는 지정된 파일 이름을 권고적(advisory)으로만 취급해야 하며, 원하는 정보를 추출할 때 매우 주의해야 합니다. 특히 다음을 준수해야 합니다:
-
수신자는 시스템의 허가된 위치 이외의 어떤 위치에도 쓰기할 수 없어야 합니다. 예를 들어 "/etc/passwd"와 같은 잘 알려진 시스템 위치를 덮어쓸 수 있는 문제를 고려하십시오. 이를 위해 파일 이름의 폴더 정보는 신뢰하지 말고 마지막 경로 세그먼트만 남겨 실제 파일명만 사용하는 전략(경로 구분자 "\"와 "/"로 구분되는 '경로 세그먼트' 기준)이 권장됩니다.
-
많은 플랫폼은 파일 시스템에서 타입 정보를 위해 Internet Media Types([RFC2046])을 사용하지 않고 파일 확장자에 의존합니다. 서버가 제공한 파일 확장자를 그대로 신뢰하면 저장된 파일을 나중에 열 때 권한 상승(privilege escalation)을 초래할 수 있으므로(예: ".exe"), 파일 확장자를 통해 미디어 타입을 결정하는 수신자는 수신된 페이로드의 미디어 타입과 안전하게 일치하는 확장자를 사용해야 합니다.
-
수신자는 제어 문자나 선행/후행 공백과 같이 UI나 파일 이름에서 혼란을 일으키는 문자 시퀀스를 제거하거나 대체해야 합니다.
-
"." 및 "..", "~", "|", 그리고 장치 이름 등 파일 시스템이나 셸 명령에서 특별한 의미를 갖는 이름은 무시하거나 대체하는 것이 권장됩니다.
4.4. Disposition 매개변수: 확장
미래의 확장을 가능하게 하기 위해, 수신자는 인식하지 못하는 매개변수를 무시해야 합니다([RFC2183], Section 2.8 참조).
4.5. 확장성
RFC 2183 섹션 9은 disposition 유형과 disposition 매개변수에 대한 IANA 레지스트리를 정의합니다. 이 레지스트리는 MIME과 HTTP와 같이 Content-Disposition을 사용하는 여러 프로토콜에서 공유됩니다. 따라서 등록된 모든 값이 HTTP 문맥에서 의미가 있는 것은 아닐 수 있습니다.
5. 예시
사용자 에이전트에게 "다른 이름으로 저장" 대화상자를 표시하고 파일 이름을 "example.html"로 지정하도록 지시:
Content-Disposition: Attachment; filename=example.html
Content-Disposition 헤더 필드가 있는 것처럼 행동하지 않되, 이후 저장 작업을 위해 파일 이름 "an example.html"을 기억하도록 사용자 에이전트에 지시:
Content-Disposition: INLINE; FILENAME= "an example.html"
참고: 공백 문자를 포함하기 위해 quoted-string 형식을 사용합니다.
파일 이름에 유니코드 문자 U+20AC (유로 기호)를 포함하여 "다른 이름으로 저장" 대화상자를 표시하도록 지시:
Content-Disposition: attachment;
filename*= UTF-8''%e2%82%ac%20rates
여기서는 [RFC5987]에 정의된 인코딩을 사용하여 ISO-8859-1에 없는 문자를 인코딩합니다.
위 예시와 동일하지만, RFC 5987을 구현하지 않는 사용자 에이전트와의 호환성을 위해 "filename" 매개변수를 추가한 예:
Content-Disposition: attachment;
filename="EURO rates";
filename*=utf-8''%e2%82%ac%20rates
참고: RFC 5987 인코딩을 지원하지 않는 사용자 에이전트는 "filename" 뒤에 "filename*"가 오는 경우 "filename*"을 무시합니다.
6. 국제화 고려사항
"filename*" 매개변수(섹션 4.3)는 [RFC5987]에 정의된 인코딩을 사용하여 서버가 ISO-8859-1 문자 집합 밖의 문자를 전송하고 선택적으로 사용 언어를 지정할 수 있게 합니다.
향후 매개변수도 국제화를 필요로 할 수 있으며, 그 경우 동일한 인코딩을 사용할 수 있습니다.
7. 보안 고려사항
서버가 제공한 정보를 사용하여 로컬 파일 이름을 구성하는 것은 많은 위험을 수반합니다. 이러한 위험은 섹션 4.3에 요약되어 있습니다.
또한 구현자는 HTTP에 적용되는 보안 고려사항(RFC2616 섹션 15)과 [RFC5987]에 정의된 매개변수 인코딩에 유의해야 합니다(자세한 내용은 Section 5 참조).
8. IANA 고려사항
8.1. Disposition 값 및 매개변수 등록소
이 명세서는 RFC 2183 섹션 9에 정의된 disposition 값 및 매개변수 등록 절차에 대한 변경을 도입하지 않습니다.
8.2. 헤더 필드 등록
이 문서는 Content-Disposition HTTP 헤더 필드의 정의를 영구 HTTP 헤더 필드 레지스트리(참조 [RFC3864])에 업데이트합니다.
- Header field name:
- Content-Disposition
- Applicable protocol:
- http
- Status:
- standard
- Author/Change controller:
- IETF
- Specification document:
- this specification (섹션 4)
- Related information:
- none
9. 감사의 글
Adam Barth, Rolf Eike Beer, Stewart Bryant, Bjoern Hoehrmann, Alfred Hoenes, Roar Lauritzsen, Alexey Melnikov, Henrik Nordstrom, Mark Nottingham에게 감사드립니다.
10. 참고문헌
10.1. 규범적 참고문헌
- [ISO-8859-1]
- International Organization for Standardization, “Information technology -- 8-bit single-byte coded graphic character sets -- Part 1: Latin alphabet No. 1”, ISO/IEC 8859-1:1998, 1998.
- [RFC2119]
- Bradner, S., “Key words for use in RFCs to Indicate Requirement Levels”, BCP 14, RFC 2119, March 1997.
- [RFC2616]
- Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L., Leach, P., and T. Berners-Lee, “Hypertext Transfer Protocol -- HTTP/1.1”, RFC 2616, June 1999.
- [RFC5987]
- Reschke, J., “Character Set and Language Encoding for Hypertext Transfer Protocol (HTTP) Header Field Parameters”, RFC 5987, August 2010.
10.2. 비규범적 참고문헌
- [RFC2046]
- Freed, N. and N. Borenstein, “Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types”, RFC 2046, November 1996.
- [RFC2047]
- Moore, K., “MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII Text”, RFC 2047, November 1996.
- [RFC2183]
- Troost, R., Dorner, S., and K. Moore, Ed., “Communicating Presentation Information in Internet Messages: The Content-Disposition Header Field”, RFC 2183, August 1997.
- [RFC2231]
- Freed, N. and K. Moore, “MIME Parameter Value and Encoded Word Extensions: Character Sets, Languages, and Continuations”, RFC 2231, November 1997.
- [RFC2388]
- Masinter, L., “Returning Values from Forms: multipart/form-data”, RFC 2388, August 1998.
- [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.
- [US-ASCII]
- American National Standards Institute, “Coded Character Set -- 7-bit American Standard Code for Information Interchange”, ANSI X3.4, 1986.
Appendix A. RFC 2616 정의로부터의 변경사항
RFC2616 섹션 19.5.1과 비교하여, 실제 구현을 반영한 다음의 규범적 변경이 이루어졌습니다:
- RFC 2616에 따르면 "attachment" 처리 유형은 "application/octet-stream" 타입의 콘텐츠에만 적용됩니다. 이 제한은 제거되었으며, 수신자들이 실제로 콘텐츠 타입을 검사하지 않으며 이는 미디어 타입을 올바르게 선언하는 것을 저해하기 때문입니다.
- RFC 2616은 filename 매개변수에 대해 quoted-string만 허용했습니다. 이는 예외적인 문법이며 실제 사용을 반영하지 않습니다.
- RFC 2183에 정의된 "inline" 처리 유형의 정의가 재도입되었으며 그 처리에 대한 제안이 추가되었습니다.
- 이 명세서는 [RFC5987]에 정의된 확장 매개변수 인코딩을 지원하도록 요구합니다.
Appendix B. RFC 2183과의 차이점
RFC2183 섹션 2는 "creation-date", "modification-date", "quoted-date-time", "size"와 같은 추가적인 disposition 매개변수를 정의합니다. 대부분의 사용자 에이전트가 이를 구현하지 않으므로 이 명세서에서는 생략되었습니다.
Appendix C. 국제화를 위한 대체 접근법
기본적으로 HTTP 헤더 필드 매개변수는 ISO-8859-1([ISO-8859-1]) 문자 인코딩 밖의 문자를 운반할 수 없습니다(자세한 내용은 [RFC2616], Section 2.2 참조). "filename" 매개변수에 대해서는 이것이 용납될 수 없는 제한입니다.
불행히도 사용자 에이전트 구현자들이 상호운용 가능한 접근법을 마련하지 못했지만, IETF Standards Track는 하나의 해결책만을 규정합니다([RFC2231], HTTP용으로 명확히 하고 프로파일한 것은 [RFC5987]입니다).
완전성을 위해 아래 섹션들은 시도되었던 다양한 접근법을 설명하고, 이들이 본 명세서에서 사용한 RFC 5987 인코딩보다 왜 열등한지 설명합니다.
C.1. RFC 2047 인코딩
RFC 2047은 헤더 필드를 위한 인코딩 메커니즘을 정의하지만, 이 인코딩은 헤더 필드 매개변수에 사용되어서는 안 됩니다 — 자세한 내용은 RFC2047 섹션 5 참조:
'encoded-word'는 'quoted-string' 내에 나타나서는 안 됩니다.
...
'encoded-word'는 MIME Content-Type 또는 Content-Disposition 필드의 매개변수에 사용되어서는 안 되며, 'comment' 또는 'phrase' 내를 제외한 어떤 구조체화된 필드 본문에서도 사용되어서는 안 됩니다.
실제로 일부 사용자 에이전트는 이 인코딩을 구현하고, 일부는 구현하지 않으며(인코딩된 문자열을 사용자에게 노출), 일부는 혼란을 겪습니다.
C.2. 퍼센트 인코딩
일부 사용자 에이전트는 percent-encoded([RFC3986], Section 2.1) 시퀀스를 받아들입니다. 디코딩에 사용되는 문자 인코딩은 참조 페이지의 인코딩, 사용자 에이전트의 로케일 및 구성, 그리고 매개변수 값 자체에 따라 달라집니다.
실제로 이는 사용하기 어렵습니다. 이를 지원하지 않는 사용자 에이전트는 이스케이프된 문자 시퀀스를 사용자에게 그대로 표시할 것이고, 지원하는 사용자 에이전트들 사이에서도 어떤 문자 인코딩을 기대하는지 예측하기 어렵습니다.
C.3. 인코딩 스니핑
일부 사용자 에이전트는 기본적으로 quoted-string 형식의 값이 ISO-8859-1로 간주되는 것을 검사하고, UTF-8이 더 올바른 해석일 가능성이 높으면 UTF-8로 전환합니다.
위 접근법들처럼 이는 상호운용성이 없고, 실제 값을 잘못 해석할 위험이 있습니다.
Appendix D. Content-Disposition 헤더 필드 생성에 관한 조언
기존 및 향후 사용자 에이전트와 성공적으로 상호운용하려면, Content-Disposition 헤더 필드의 송신자는 다음을 권장합니다:
- US-ASCII([US-ASCII]) 로 충분히 표현 가능한 경우 "filename" 매개변수를 포함하십시오.
- 파일명에 허용되지 않는 문자(예: 공백)가 포함되지 않는 경우에만 filename 매개변수의 'token' 형태를 사용하고, 그렇지 않으면 quoted-string 형태를 사용하십시오.
- 퍼센트 문자와 두 개의 16진수 문자가 연속된 시퀀스(e.g., %A9)를 filename 매개변수에 포함하지 마십시오. 일부 구현체는 이를 이스케이프 문자로 간주하고 일부는 그대로 통과시키기 때문입니다.
- quoted-string 형식의 filename 매개변수에 "\" 문자를 포함하지 마십시오. 일부 사용자 에이전트는 이스케이프를 구현하지 않으며 "\"는 불법 경로 문자로 간주될 수 있습니다.
- filename 매개변수에 비-ASCII 문자를 사용하지 마십시오. 대부분의 기존 구현은 이를 ISO-8859-1로 디코딩하지만, 일부는 UTF-8을 탐지하는 휴리스틱을 적용하여 특정 이름에서 실패할 수 있습니다.
- 원하는 파일 이름을 "filename" 형식으로 충실히 표현할 수 없을 때는 "filename*" 매개변수를 포함하십시오. 다만 레거시 사용자 에이전트는 이를 처리하지 못하고 "filename"으로 대체할 것입니다.
- "filename*" 매개변수를 전송할 때 가능하면 레거시 사용자 에이전트용 대체로 "filename" 매개변수도 함께 생성하십시오. 예를 들어 U+00E4를 "ae"로 대체하는 식으로 US-ASCII 시퀀스로 대체할 수 있습니다. 일부 로케일에서는 불가능할 수도 있습니다.
- 대체용 "filename" 매개변수를 포함하는 경우(위 참조), 일부 구현의 파싱 문제 때문에 "filename"이 먼저 오도록 하십시오.
- "filename*" 매개변수가 있는 경우 인코딩으로 UTF-8을 사용하십시오. 적어도 하나의 구현체가 이 인코딩만 구현합니다.
이 조언은 문서 작성 시점의 UA 행동을 기반으로 하며 변경될 수 있습니다. 문서 출판 시점에 <http://purl.org/NET/http/content-disposition-tests>는 다양한 구현체에서의 현재 지원 수준 개요를 제공합니다.