Internet Engineering Task Force (IETF) P. Bryan, Ed. 의견 요청서: 6901 Salesforce.com 분류: 표준 트랙 K. Zyp ISSN: 2070-1721 SitePen (USA) M. Nottingham, Ed. Akamai 2013년 4월 JavaScript Object Notation (JSON) Pointer 초록 JSON Pointer는 JavaScript Object Notation(JSON) 문서 안의 특정 값을 식별하기 위한 문자열 구문을 정의한다. 이 메모의 상태 이 문서는 인터넷 표준 트랙 문서이다. 이 문서는 Internet Engineering Task Force(IETF)의 산물이다. 이는 IETF 커뮤니티의 합의를 나타낸다. 공개 검토를 거쳤으며 Internet Engineering Steering Group(IESG)에 의해 출판 승인을 받았다. 인터넷 표준에 관한 추가 정보는 RFC 5741의 Section 2에서 확인할 수 있다. 이 문서의 현재 상태, 정오표 및 피드백 제공 방법에 관한 정보는 http://www.rfc-editor.org/info/rfc6901에서 얻을 수 있다. Copyright Notice Copyright (c) 2013 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. Bryan, et al. 표준 트랙 [Page 1]
RFC 6901 JSON Pointer 2013년 4월 목차 1. 소개 . . . . . . . . . . . . . . . . . . . . . . . . . 2 2. 규약 . . . . . . . . . . . . . . . . . . . . . . . . . . 2 3. 구문 . . . . . . . . . . . . . . . . . . . . . . . . . 2 4. 평가 . . . . . . . . . . . . . . . . . . . . . . . . . 3 5. JSON 문자열 표현 . . . . . . . . . . . . . . . . . . . 4 6. URI 프래그먼트 식별자 표현 . . . . . . . . . . . . . . 5 7. 오류 처리 . . . . . . . . . . . . . . . . . . . . . . 6 8. 보안 고려 사항 . . . . . . . . . . . . . . . . . . . . 6 9. 감사의 말 . . . . . . . . . . . . . . . . . . . . . . 7 10. 참고 문헌 . . . . . . . . . . . . . . . . . . . . . . 7 10.1. 규범 참고 문헌 . . . . . . . . . . . . . . . . . . 7 10.2. 참고 정보 문헌 . . . . . . . . . . . . . . . . . . 7 1. 소개 이 명세는 JavaScript Object Notation(JSON) 문서 [RFC4627] 안의 특정 값을 식별하기 위한 문자열 구문인 JSON Pointer를 정의한다. JSON Pointer는 JSON 문자열 값뿐만 아니라 Uniform Resource Identifier(URI) [RFC3986] 프래그먼트 식별자로도 쉽게 표현되도록 의도되었다. 2. 규약 이 문서에서 쓰이는 핵심어 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", "OPTIONAL"은 [RFC2119]에 설명된 대로 해석되어야 한다. 이 명세는 규범적 구문 규칙을 Augmented Backus-Naur Form(ABNF) [RFC5234] 표기법으로 표현한다. 3. 구문 JSON Pointer는 0개 이상의 참조 토큰 시퀀스를 포함하는 유니코드 문자열([RFC4627], Section 3 참조)이며, 각 토큰 앞에는 '/'(%x2F) 문자가 붙는다. '~'(%x7E)와 '/'(%x2F) 문자는 JSON Pointer에서 특별한 의미를 가지므로, 이러한 문자가 참조 토큰에 나타날 때 '~'는 '~0'으로, '/'는 '~1'로 인코딩되어야 한다. Bryan, et al. 표준 트랙 [Page 2]
RFC 6901 JSON Pointer 2013년 4월 JSON Pointer의 ABNF 구문은 다음과 같다. json-pointer = *( "/" reference-token ) reference-token = *( unescaped / escaped ) unescaped = %x00-2E / %x30-7D / %x7F-10FFFF ; %x2F ('/') 및 %x7E ('~')는 'unescaped'에서 제외된다 escaped = "~" ( "0" / "1" ) ; 각각 '~'와 '/'를 나타낸다 JSON Pointer 값이 이 구문을 따르지 않으면 오류 조건이다 (Section 7 참조). JSON Pointer는 바이트가 아니라 문자 단위로 지정된다는 점에 유의하라. 4. 평가 JSON Pointer의 평가는 JSON 문서의 루트 값에 대한 참조에서 시작하며, 문서 안의 어떤 값에 대한 참조로 완료된다. JSON Pointer의 각 참조 토큰은 순차적으로 평가된다. 각 참조 토큰의 평가는 이스케이프된 문자 시퀀스를 디코딩하는 것으로 시작한다. 이는 먼저 '~1' 시퀀스의 모든 출현을 '/'로 변환하고, 그다음 '~0' 시퀀스의 모든 출현을 '~'로 변환하여 수행된다. 이 순서로 치환을 수행함으로써 구현은 '~01'을 먼저 '~1'로, 그다음 '/'로 바꾸는 오류를 피할 수 있다. 이는 올바르지 않다(문자열 '~01'은 변환 후 올바르게 '~1'이 된다). 그런 다음 참조 토큰은 다음 방식에 따라 참조되는 값을 변경한다. o 현재 참조된 값이 JSON 객체인 경우, 새로 참조되는 값은 참조 토큰이 식별하는 이름을 가진 객체 멤버이다. 멤버 이름은 토큰과 같은 수의 유니코드 문자를 가지고, 그 코드 포인트들이 바이트 단위로 동일하면 토큰과 같다. 유니코드 문자 정규화는 수행되지 않는다. 객체 안에서 참조된 멤버 이름이 고유하지 않으면, 참조되는 멤버는 정의되지 않으며 평가는 실패한다(아래 참조). Bryan, et al. 표준 트랙 [Page 3]
RFC 6901 JSON Pointer 2013년 4월 o 현재 참조된 값이 JSON 배열인 경우, 참조 토큰은 반드시 다음 중 하나를 포함해야 한다. * 숫자로 구성된 문자(아래 ABNF 참조; 선행 0은 허용되지 않음)로서, 부호 없는 10진 정수 값을 나타내며, 새로 참조되는 값을 토큰이 식별한 0부터 시작하는 인덱스의 배열 요소로 만든다. 또는 * 정확히 단일 문자 "-"이며, 새로 참조되는 값을 마지막 배열 요소 뒤의 (존재하지 않는) 멤버로 만든다. 배열 인덱스의 ABNF 구문은 다음과 같다. array-index = %x30 / ( %x31-39 *(%x30-39) ) ; "0", 또는 선행 "0"이 없는 숫자들 구현은 각 참조 토큰을 문서의 내용에 대해 평가하며, JSON Pointer의 어떤 참조 토큰에 대해서든 구체적인 값으로 해석하지 못하면 오류 조건을 발생시킨다. 예를 들어, 배열이 숫자가 아닌 토큰으로 참조되면 오류 조건이 발생한다. 자세한 내용은 Section 7을 참조하라. "-" 문자를 사용하여 배열을 인덱싱하면, 정의상 존재하지 않는 배열 요소를 참조하므로 항상 이러한 오류 조건이 발생한다는 점에 유의하라. 따라서 JSON Pointer를 적용하는 애플리케이션은 그 문자를 유용하게 사용하려면 어떻게 처리할지 지정해야 한다. JSON Pointer 애플리케이션에서 특정 동작이 정의되지 않은 모든 오류 조건은 평가의 종료를 초래한다. 5. JSON 문자열 표현 JSON Pointer는 JSON 문자열 값으로 표현될 수 있다. [RFC4627], Section 2.5에 따라, 따옴표 '"'(%x22), 역슬래시 '\'(%x5C), 제어 문자(%x00-1F)의 모든 인스턴스는 반드시 이스케이프되어야 한다. JSON 문자열을 JSON Pointer로 처리하기 전에, 백슬래시 이스케이프 시퀀스는 이스케이프 해제되어야 한다는 점에 유의하라. Bryan, et al. 표준 트랙 [Page 4]
RFC 6901 JSON Pointer 2013년 4월 예를 들어, 다음 JSON 문서가 주어졌다고 하자. { "foo": ["bar", "baz"], "": 0, "a/b": 1, "c%d": 2, "e^f": 3, "g|h": 4, "i\\j": 5, "k\"l": 6, " ": 7, "m~n": 8 } 다음 JSON 문자열은 함께 표시된 값으로 평가된다. "" // 전체 문서 "/foo" ["bar", "baz"] "/foo/0" "bar" "/" 0 "/a~1b" 1 "/c%d" 2 "/e^f" 3 "/g|h" 4 "/i\\j" 5 "/k\"l" 6 "/ " 7 "/m~0n" 8 6. URI 프래그먼트 식별자 표현 JSON Pointer는 UTF-8 [RFC3629]을 사용하여 옥텟으로 인코딩하고, [RFC3986]의 프래그먼트 규칙에서 허용되지 않는 문자를 퍼센트 인코딩함으로써 URI 프래그먼트 식별자로 표현될 수 있다. 특정 미디어 타입은 JSON Pointer를 그 프래그먼트 식별자 구문으로 명시적으로 지정해야 한다는 점에 유의하라(일반적으로 해당 등록 [RFC6838]에서). 즉, 문서가 JSON이라고 해서 JSON Pointer를 그 프래그먼트 식별자 구문으로 사용할 수 있음을 의미하지는 않는다. 특히 application/json의 프래그먼트 식별자 구문은 JSON Pointer가 아니다. Bryan, et al. 표준 트랙 [Page 5]
RFC 6901 JSON Pointer 2013년 4월 위와 같은 예제 문서가 주어졌을 때, 다음 URI 프래그먼트 식별자는 함께 표시된 값으로 평가된다. # // 전체 문서 #/foo ["bar", "baz"] #/foo/0 "bar" #/ 0 #/a~1b 1 #/c%25d 2 #/e%5Ef 3 #/g%7Ch 4 #/i%5Cj 5 #/k%22l 6 #/%20 7 #/m~0n 8 7. 오류 처리 오류 조건이 발생하면 JSON Pointer의 평가는 완료되지 못한다. 오류 조건에는 다음이 포함되지만 이에 국한되지 않는다. o 유효하지 않은 포인터 구문 o 존재하지 않는 값을 참조하는 포인터 이 명세는 오류가 어떻게 처리되는지 정의하지 않는다. JSON Pointer를 적용하는 애플리케이션은 각 유형의 오류에 대한 영향과 처리 방식을 지정하는 것이 좋다. 예를 들어, 어떤 애플리케이션은 오류 발생 시 포인터 처리를 중단할 수 있고, 다른 애플리케이션은 누락된 값에 기본값을 삽입하여 복구를 시도할 수 있다. 8. 보안 고려 사항 주어진 JSON Pointer가 실제 JSON 값을 참조한다는 보장은 없다. 따라서 JSON Pointer를 사용하는 애플리케이션은 해석되지 않는 포인터를 어떻게 처리해야 하는지 정의하여 이러한 상황을 예상해야 한다. JSON Pointer에는 NUL(유니코드 U+0000) 문자가 포함될 수 있다는 점에 유의하라. 문자열 끝을 표시하기 위해 NUL을 사용하는 프로그래밍 언어에서 이 문자를 잘못 해석하지 않도록 주의가 필요하다. Bryan, et al. 표준 트랙 [Page 6]
RFC 6901 JSON Pointer 2013년 4월 9. 감사의 말 다음 사람들은 이 명세에 아이디어, 피드백 및 문구를 기여했다. Mike Acar, Carsten Bormann, Tim Bray, Jacob Davies, Martin J. Duerst, Bjoern Hoehrmann, James H. Manger, Drew Perttula, and Julian Reschke. 10. 참고 문헌 10.1. 규범 참고 문헌 [RFC2119] Bradner, S., "요구 사항 수준을 나타내기 위해 RFC에서 사용하는 핵심어", BCP 14, RFC 2119, 1997년 3월. [RFC3629] Yergeau, F., "UTF-8, ISO 10646의 변환 형식", STD 63, RFC 3629, 2003년 11월. [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform Resource Identifier(URI): 일반 구문", STD 66, RFC 3986, 2005년 1월. [RFC4627] Crockford, D., "JavaScript Object Notation(JSON)을 위한 application/json 미디어 타입", RFC 4627, 2006년 7월. [RFC5234] Crocker, D. and P. Overell, "구문 명세를 위한 확장 BNF: ABNF", STD 68, RFC 5234, 2008년 1월. 10.2. 참고 정보 문헌 [RFC6838] Freed, N., Klensin, J., and T. Hansen, "미디어 타입 명세 및 등록 절차", BCP 13, RFC 6838, 2013년 1월. Bryan, et al. 표준 트랙 [Page 7]
RFC 6901 JSON Pointer 2013년 4월
저자 주소
Paul C. Bryan (editor)
Salesforce.com
Phone: +1 604 783 1481
EMail: pbryan@anode.ca
Kris Zyp
SitePen (USA)
Phone: +1 650 968 8787
EMail: kris@sitepen.com
Mark Nottingham (editor)
Akamai
EMail: mnot@mnot.net
Bryan, et al. 표준 트랙 [Page 8]