Internet-Draft JSON 스키마 검증 2022년 6월
Wright 외 2022년 12월 18일 만료 [페이지]
작업 그룹:
인터넷 엔지니어링 태스크 포스
Internet-Draft:
draft-bhutton-json-schema-validation-01
발행일:
의도된 상태:
정보 제공
만료일:
저자:
A. Wright, 편집자
H. Andrews, 편집자
B. Hutton, 편집자
Postman

JSON 스키마 검증: JSON의 구조적 검증을 위한 어휘

초록

JSON Schema(application/schema+json)에는 여러 목적이 있으며, 그중 하나는 JSON 인스턴스 검증입니다. 이 문서는 JSON Schema가 JSON 문서의 의미를 설명하고, JSON 데이터로 작업하는 사용자 인터페이스에 힌트를 제공하며, 유효한 문서가 어떤 모습이어야 하는지에 대한 단언을 하기 위한 어휘를 명세합니다.

독자에게 드리는 참고 사항

이 초안의 이슈 목록은 다음에서 찾을 수 있습니다. https://github.com/json-schema-org/json-schema-spec/issues.

추가 정보는 https://json-schema.org/를 참조하십시오.

피드백을 제공하려면 이 이슈 트래커, 홈페이지에 나열된 커뮤니케이션 방법, 또는 문서 편집자에게 보내는 이메일을 사용하십시오.

이 메모의 상태

이 Internet-Draft는 BCP 78 및 BCP 79의 조항을 완전히 준수하여 제출되었습니다.

Internet-Draft는 인터넷 엔지니어링 태스크 포스(IETF)의 작업 문서입니다. 다른 그룹도 작업 문서를 Internet-Draft로 배포할 수 있음에 유의하십시오. 현재 Internet-Draft 목록은 https://datatracker.ietf.org/drafts/current/에 있습니다.

Internet-Draft는 최대 6개월 동안 유효한 초안 문서이며, 언제든지 다른 문서에 의해 갱신, 대체 또는 폐기될 수 있습니다. Internet-Draft를 참고 자료로 사용하거나 "진행 중인 작업" 이외의 방식으로 인용하는 것은 적절하지 않습니다.

이 Internet-Draft는 2022년 12월 18일에 만료됩니다.

목차

1. 소개

JSON Schema는 주어진 JSON 문서(인스턴스)가 일정 수의 기준을 만족하도록 요구하는 데 사용할 수 있습니다. 이러한 기준은 이 명세에서 설명하는 키워드를 사용하여 단언됩니다. 또한 대화형 사용자 인터페이스의 인스턴스 생성을 지원하기 위한 키워드 집합도 정의됩니다.

이 명세는 JSON Schema Core [json-schema] 명세에서 정의한 개념, 구문 및 용어를 사용합니다.

2. 규약 및 용어

이 문서에서 핵심 단어 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", "OPTIONAL"은 RFC 2119 [RFC2119]에 설명된 대로 해석됩니다.

이 명세는 배열과 객체 인스턴스 모두를 가리키기 위해 "컨테이너 인스턴스"라는 용어를 사용합니다. 배열 요소 또는 객체 멤버 값을 가리키기 위해 "자식 인스턴스"라는 용어를 사용합니다.

배열 값의 요소들은 이 배열의 서로 다른 두 요소가 동등하지 [json-schema] 않다면 고유하다고 합니다.

3. 개요

JSON Schema 검증은 인스턴스 데이터의 구조에 제약을 단언합니다. 단언된 모든 제약을 만족하는 인스턴스 위치에는 그 다음 설명 메타데이터 및 사용 힌트와 같은 비단언 정보를 포함하는 모든 키워드가 주석으로 추가됩니다. 인스턴스 내의 모든 위치가 단언된 모든 제약을 만족하면, 해당 인스턴스는 스키마에 대해 유효하다고 합니다.

각 스키마 객체는 적용되는 각 인스턴스 위치에 대해 독립적으로 평가됩니다. 이는 검증기가 문서 전체 검증 프로세스에서 상태를 유지할 필요가 없도록 보장하여 구현 요구사항을 크게 단순화합니다.

이 명세는 단언 키워드 집합과 함께, JSON 인스턴스에 유용한 정보를 주석으로 달기 위해 사용할 수 있는 작은 메타데이터 키워드 어휘를 정의합니다. 7절 키워드는 주로 주석으로 사용되도록 의도되었지만, 선택적으로 단언으로도 사용할 수 있습니다. 8절 키워드는 JSON 문자열로 포함된 문서와 함께 작업하기 위한 주석입니다.

4. 상호 운용성 고려사항

4.1. 문자열 인스턴스의 검증

nul 문자(\u0000)는 JSON 문자열에서 유효하다는 점에 유의해야 합니다. 검증할 인스턴스는 기본 프로그래밍 언어가 이러한 데이터를 처리할 수 있는지와 관계없이 이 문자를 포함하는 문자열 값을 가질 수 있습니다.

4.2. 숫자 인스턴스의 검증

JSON 명세는 임의 정밀도의 숫자를 허용하며, JSON Schema는 그러한 경계를 추가하지 않습니다. 이는 JSON Schema가 처리하는 숫자 인스턴스가 기본 프로그래밍 언어가 이러한 데이터를 처리할 수 있는지와 관계없이 임의로 크거나 그리고/또는 임의로 긴 소수 부분을 가질 수 있음을 의미합니다.

4.3. 정규 표현식

정규 표현식을 사용하거나 인스턴스 값을 정규 표현식으로 제한하는 키워드는 JSON Schema Core [json-schema] 명세의 정규 표현식에 대한 상호 운용성 고려사항의 적용을 받습니다.

5. 메타 스키마

기본 JSON Schema 방언 메타 스키마의 현재 URI는 https://json-schema.org/draft/2020-12/schema입니다. 스키마 작성자의 편의를 위해 이 메타 스키마는 이 명세와 JSON Schema Core 명세에 정의된 모든 어휘와, 전환 기간 동안 예약된 두 개의 이전 키워드로 구성된 방언을 설명합니다. 개별 어휘 및 어휘 메타 스키마 URI는 아래 각 절에 제시됩니다. 특정 어휘는 지원이 선택 사항이며, 이는 관련 절에서 자세히 설명됩니다.

오류를 수정하기 위해 명세 초안 사이에 갱신된 어휘 및 메타 스키마 URI가 게시될 수 있습니다(MAY). 구현은 이 명세 초안 이후 및 다음 명세 초안 이전 날짜의 URI를 여기 나열된 것과 동일한 구문 및 의미를 나타내는 것으로 간주하는 것이 좋습니다(SHOULD).

6. 구조적 검증을 위한 어휘

스키마의 검증 키워드는 인스턴스의 성공적인 검증을 위한 요구사항을 부과합니다. 이러한 키워드는 모두 주석 동작이 없는 단언입니다.

"$vocabulary"를 사용하지 않는 메타 스키마는 이 어휘의 URI가 true 값으로 존재하는 것처럼 이 어휘를 요구하는 것으로 간주하는 것이 좋습니다(SHOULD).

Validation 어휘로 알려진 이 어휘의 현재 URI는 다음과 같습니다. <https://json-schema.org/draft/2020-12/vocab/validation>.

대응하는 메타 스키마의 현재 URI는 다음과 같습니다. https://json-schema.org/draft/2020-12/meta/validation.

6.1. 모든 인스턴스 타입을 위한 검증 키워드

6.1.1. type

이 키워드의 값은 문자열 또는 배열이어야 합니다(MUST). 배열인 경우 배열의 요소는 문자열이어야 하며(MUST), 고유해야 합니다(MUST).

문자열 값은 여섯 가지 원시 타입 ("null", "boolean", "object", "array", "number", "string") 중 하나이거나, 소수 부분이 0인 모든 숫자와 일치하는 "integer"여야 합니다(MUST).

"type"의 값이 문자열이면, 인스턴스의 타입이 해당 문자열 값이 나타내는 타입과 일치할 때 인스턴스는 성공적으로 검증됩니다. "type"의 값이 배열이면, 인스턴스의 타입이 배열 내 문자열들이 나타내는 타입 중 하나와 일치할 때 인스턴스는 성공적으로 검증됩니다.

6.1.2. enum

이 키워드의 값은 배열이어야 합니다(MUST). 이 배열은 적어도 하나의 요소를 가지는 것이 좋습니다(SHOULD). 배열의 요소는 고유한 것이 좋습니다(SHOULD).

인스턴스의 값이 이 키워드의 배열 값에 있는 요소 중 하나와 같다면, 인스턴스는 이 키워드에 대해 성공적으로 검증됩니다.

배열의 요소는 null을 포함하여 어떤 타입일 수도 있습니다.

6.1.3. const

이 키워드의 값은 null을 포함하여 어떤 타입일 수도 있습니다(MAY).

이 키워드의 사용은 단일 값을 갖는 "enum" (6.1.2절)과 기능적으로 동등합니다.

인스턴스의 값이 키워드의 값과 같다면, 인스턴스는 이 키워드에 대해 성공적으로 검증됩니다.

6.2. 숫자 인스턴스(number 및 integer)를 위한 검증 키워드

6.2.1. multipleOf

"multipleOf"의 값은 숫자여야 하며(MUST), 0보다 엄격하게 커야 합니다.

숫자 인스턴스는 이 키워드의 값으로 나누었을 때 결과가 정수인 경우에만 유효합니다.

6.2.2. maximum

"maximum"의 값은 숫자여야 하며(MUST), 숫자 인스턴스에 대한 포함 상한을 나타냅니다.

인스턴스가 숫자인 경우, 이 키워드는 인스턴스가 "maximum"보다 작거나 정확히 같을 때만 검증됩니다.

6.2.3. exclusiveMaximum

"exclusiveMaximum"의 값은 숫자여야 하며(MUST), 숫자 인스턴스에 대한 배타적 상한을 나타냅니다.

인스턴스가 숫자인 경우, 인스턴스는 "exclusiveMaximum"보다 엄격하게 작은(같지 않은) 값을 가질 때만 유효합니다.

6.2.4. minimum

"minimum"의 값은 숫자여야 하며(MUST), 숫자 인스턴스에 대한 포함 하한을 나타냅니다.

인스턴스가 숫자인 경우, 이 키워드는 인스턴스가 "minimum"보다 크거나 정확히 같을 때만 검증됩니다.

6.2.5. exclusiveMinimum

"exclusiveMinimum"의 값은 숫자여야 하며(MUST), 숫자 인스턴스에 대한 배타적 하한을 나타냅니다.

인스턴스가 숫자인 경우, 인스턴스는 "exclusiveMinimum"보다 엄격하게 큰(같지 않은) 값을 가질 때만 유효합니다.

6.3. 문자열을 위한 검증 키워드

6.3.1. maxLength

이 키워드의 값은 음이 아닌 정수여야 합니다(MUST).

문자열 인스턴스의 길이가 이 키워드의 값보다 작거나 같다면, 해당 인스턴스는 이 키워드에 대해 유효합니다.

문자열 인스턴스의 길이는 RFC 8259 [RFC8259]에서 정의한 문자 수로 정의됩니다.

6.3.2. minLength

이 키워드의 값은 음이 아닌 정수여야 합니다(MUST).

문자열 인스턴스의 길이가 이 키워드의 값보다 크거나 같다면, 해당 인스턴스는 이 키워드에 대해 유효합니다.

문자열 인스턴스의 길이는 RFC 8259 [RFC8259]에서 정의한 문자 수로 정의됩니다.

이 키워드를 생략하면 값이 0인 것과 동일하게 동작합니다.

6.3.3. pattern

이 키워드의 값은 문자열이어야 합니다(MUST). 이 문자열은 ECMA-262 정규 표현식 방언에 따라 유효한 정규 표현식인 것이 좋습니다(SHOULD).

정규 표현식이 인스턴스와 성공적으로 일치하면 문자열 인스턴스는 유효한 것으로 간주됩니다. 기억하십시오: 정규 표현식은 암묵적으로 고정(anchor)되지 않습니다.

6.4. 배열을 위한 검증 키워드

6.4.1. maxItems

이 키워드의 값은 음이 아닌 정수여야 합니다(MUST).

배열 인스턴스의 크기가 이 키워드의 값보다 작거나 같다면, 해당 인스턴스는 "maxItems"에 대해 유효합니다.

6.4.2. minItems

이 키워드의 값은 음이 아닌 정수여야 합니다(MUST).

배열 인스턴스의 크기가 이 키워드의 값보다 크거나 같다면, 해당 인스턴스는 "minItems"에 대해 유효합니다.

이 키워드를 생략하면 값이 0인 것과 동일하게 동작합니다.

6.4.3. uniqueItems

이 키워드의 값은 불리언이어야 합니다(MUST).

이 키워드가 불리언 값 false를 가지면 인스턴스는 성공적으로 검증됩니다. 불리언 값 true를 가지면, 모든 요소가 고유한 경우 인스턴스는 성공적으로 검증됩니다.

이 키워드를 생략하면 값이 false인 것과 동일하게 동작합니다.

6.4.4. maxContains

이 키워드의 값은 음이 아닌 정수여야 합니다(MUST).

"contains"가 같은 스키마 객체 안에 존재하지 않으면, 이 키워드는 효과가 없습니다.

인스턴스 배열은 인접한 "contains" [json-schema] 키워드의 주석 결과 형태에 따라 두 가지 방식으로 "maxContains"에 대해 유효합니다. 첫 번째 방식은 주석 결과가 배열이고 그 배열의 길이가 "maxContains" 값보다 작거나 같은 경우입니다. 두 번째 방식은 주석 결과가 불리언 "true"이고 인스턴스 배열 길이가 "maxContains" 값보다 작거나 같은 경우입니다.

6.4.5. minContains

이 키워드의 값은 음이 아닌 정수여야 합니다(MUST).

"contains"가 같은 스키마 객체 안에 존재하지 않으면, 이 키워드는 효과가 없습니다.

인스턴스 배열은 인접한 "contains" [json-schema] 키워드의 주석 결과 형태에 따라 두 가지 방식으로 "minContains"에 대해 유효합니다. 첫 번째 방식은 주석 결과가 배열이고 그 배열의 길이가 "minContains" 값보다 크거나 같은 경우입니다. 두 번째 방식은 주석 결과가 불리언 "true"이고 인스턴스 배열 길이가 "minContains" 값보다 크거나 같은 경우입니다.

값 0은 허용되지만, 발생 횟수의 범위를 0부터 "maxContains" 값까지로 설정하는 데만 유용합니다. 값 0은 "minContains"와 "contains"가 항상 검증을 통과하게 합니다(하지만 "maxContains" 키워드에 대해서는 여전히 검증에 실패할 수 있습니다).

이 키워드를 생략하면 값이 1인 것과 동일하게 동작합니다.

6.5. 객체를 위한 검증 키워드

6.5.1. maxProperties

이 키워드의 값은 음이 아닌 정수여야 합니다(MUST).

객체 인스턴스의 프로퍼티 수가 이 키워드의 값보다 작거나 같다면, 해당 인스턴스는 "maxProperties"에 대해 유효합니다.

6.5.2. minProperties

이 키워드의 값은 음이 아닌 정수여야 합니다(MUST).

객체 인스턴스의 프로퍼티 수가 이 키워드의 값보다 크거나 같다면, 해당 인스턴스는 "minProperties"에 대해 유효합니다.

이 키워드를 생략하면 값이 0인 것과 동일하게 동작합니다.

6.5.3. required

이 키워드의 값은 배열이어야 합니다(MUST). 이 배열의 요소가 있다면 문자열이어야 하며(MUST), 고유해야 합니다(MUST).

배열의 모든 항목이 인스턴스 내 프로퍼티의 이름이라면, 객체 인스턴스는 이 키워드에 대해 유효합니다.

이 키워드를 생략하면 빈 배열과 동일하게 동작합니다.

6.5.4. dependentRequired

이 키워드의 값은 객체여야 합니다(MUST). 이 객체 안의 프로퍼티가 있다면 배열이어야 합니다(MUST). 각 배열의 요소가 있다면 문자열이어야 하며(MUST), 고유해야 합니다(MUST).

이 키워드는 특정 다른 프로퍼티가 존재하는 경우 요구되는 프로퍼티를 지정합니다. 이들의 요구사항은 다른 프로퍼티의 존재 여부에 의존합니다.

인스턴스와 이 키워드의 값 안에 이름으로 모두 나타나는 각 이름에 대해, 대응하는 배열의 모든 항목도 인스턴스 내 프로퍼티의 이름이면 검증은 성공합니다.

이 키워드를 생략하면 빈 객체와 동일하게 동작합니다.

7. "format"을 사용하는 의미 콘텐츠를 위한 어휘

7.1. 머리말

구조적 검증만으로는 애플리케이션이 특정 값을 올바르게 활용하기에 충분하지 않을 수 있습니다. "format" 주석 키워드는 스키마 작성자가 RFC이든 다른 외부 명세이든 권위 있는 리소스에 의해 정확하게 설명되는 고정된 값 부분집합에 대한 의미 정보를 전달할 수 있도록 정의됩니다.

이 키워드의 값은 format 속성이라고 합니다. 이는 문자열이어야 합니다(MUST). format 속성은 일반적으로 주어진 인스턴스 타입 집합만 검증할 수 있습니다. 검증할 인스턴스의 타입이 이 집합에 없으면, 이 format 속성과 인스턴스에 대한 검증은 성공하는 것이 좋습니다(SHOULD). 이 절에 정의된 모든 format 속성은 문자열에 적용되지만, format 속성은 Core JSON Schema [json-schema]에 정의된 데이터 모델의 모든 인스턴스 타입에 적용되도록 지정할 수 있습니다. 이 명세의 "type" 키워드는 데이터 모델의 일부가 아닌 "integer" 타입을 정의한다는 점에 유의하십시오. 따라서 format 속성은 숫자로 제한될 수는 있지만, 특별히 정수로 제한될 수는 없습니다. 그러나 숫자 format은 값이 "integer"인 "type" 키워드와 함께 사용할 수 있거나, 숫자가 정수가 아니면 항상 통과하도록 명시적으로 정의할 수 있으며, 이는 본질적으로 정수에만 적용하는 것과 동일한 동작을 생성합니다.

Format-Annotation 어휘로 알려진 이 어휘의 현재 URI는 다음과 같습니다. <https://json-schema.org/draft/2020-12/vocab/format-annotation>. 대응하는 메타 스키마의 현재 URI는 다음과 같습니다. https://json-schema.org/draft/2020-12/meta/format-annotation. 이 어휘에 대한 지원 구현은 필수입니다(REQUIRED).

Format-Annotation 어휘 외에도, "format"을 단언으로 정의하는 사용자 정의 메타 스키마를 위한 보조 어휘를 사용할 수 있습니다. Format-Assertion 어휘의 URI는 다음과 같습니다. <https://json-schema.org/draft/2020-12/vocab/format-assertion>. 대응하는 메타 스키마의 현재 URI는 다음과 같습니다. https://json-schema.org/draft/2020-12/meta/format-assertion. Format-Assertion 어휘에 대한 지원 구현은 선택 사항입니다(OPTIONAL).

Format-Annotation 어휘와 Format-Assertion 어휘를 모두 지정하는 것은, 그 요구사항이 Format-Annotation 어휘의 상위 집합이므로 Format-Assertion 어휘만 지정하는 것과 기능적으로 동등합니다.

7.2. 구현 요구사항

"format" 키워드는 참조되는 어휘가 정의한 대로 동작합니다.

7.2.1. Format-Annotation 어휘

구현이 주석 수집을 지원한다면 format의 값은 주석으로 수집되어야 합니다(MUST). 이는 스키마 검증이 불가능하거나 불충분할 때 애플리케이션 수준 검증을 가능하게 합니다.

구현은 여전히 "format"을 주석에 더해 단언으로 취급하고, 지정된 의미에 대한 값의 부합성을 검증하려고 시도할 수 있습니다(MAY). 구현은 그러한 평가를 활성화 및 비활성화하는 옵션을 제공해야 하며(MUST), 기본적으로 비활성화되어야 합니다(MUST). 구현은 그러한 검증에 대한 지원 수준을 문서화하는 것이 좋습니다(SHOULD). Format-Annotation 어휘를 지정하고 구현에서 검증을 활성화하는 것은 Format-Assertion 어휘를 지정하는 것과 동등한 것으로 보아서는 안 됩니다. Format-Assertion 어휘가 지정되지 않았을 때 구현은 전체 검증 지원을 제공할 필요가 없기 때문입니다.

구현이 단언 동작으로 구성된 경우, 구현은 다음을 수행합니다.

  • 아래에 정의된 각 format 속성에 대해 구현별 최선 노력 검증을 제공하는 것이 좋습니다(SHOULD).
  • 일부 또는 모든 format 속성의 검증을 항상 true라는 검증 결과를 생성하는 no-op으로 구현하도록 선택할 수 있습니다(MAY).

이는 일부 또는 모든 format 속성에 대해 검증을 전혀 제공하지 않는 경우를 포함하여 검증 수준이 매우 다양한 현재 구현 현실과 일치합니다. 또한 주석 동작에만 의존하고 애플리케이션에서 의미 검증을 수행하도록 장려하기 위해 설계되었으며, 이것이 권장되는 모범 사례입니다.

7.2.2. Format-Assertion 어휘

Format-Assertion 어휘가 true 값으로 선언되면, 구현은 이 명세에서 정의한 모든 format에 대해 전체 검증 지원을 제공해야 합니다(MUST). 전체 검증 지원을 제공할 수 없는 구현은 스키마 처리를 거부해야 합니다(MUST).

Format-Assertion 어휘를 지원하는 구현은 다음을 수행합니다.

  • 구현이 주석 수집을 지원한다면 "format"을 여전히 주석으로 수집해야 합니다(MUST).
  • "format"을 단언으로 평가해야 합니다(MUST).
  • 이 명세에 정의된 모든 format 속성과, 인식하는 모든 추가 format 속성에 대해 구문적 검증을 구현해야 합니다(MUST). 이때 올바른 타입의 가능한 인스턴스 값 중 검증에 실패할 값이 존재해야 합니다.

format 속성의 최소 검증 요구사항은 많은 속성에 관련된 복잡성 때문에 의도적으로 모호하고 허용적으로 되어 있습니다. 특히 이 요구사항은 구문 검사로 제한된다는 점에 유의하십시오. 구현이 이메일을 보내거나, URL에 연결을 시도하거나, format 인스턴스가 식별하는 엔티티의 존재를 확인할 것으로 기대해서는 안 됩니다. date-time과 같은 단순한 format의 경우 구문 검증이 철저할 것으로 기대됩니다. 이메일 주소와 같은 복잡한 format은 다양한 표준과 시간이 지나며 이루어진 수많은 조정이 뒤섞인 것이며, 값을 사용하는 다른 애플리케이션에 의해 제한될 수도 있고 아닐 수도 있는 모호하거나 오래된 규칙이 있으므로 최소 검증으로 충분합니다. 예를 들어, "@"를 포함하지 않는 인스턴스 문자열은 명백히 유효한 이메일 주소가 아니며, 7비트 ASCII 범위를 벗어난 문자를 포함하는 "email" 또는 "hostname"도 마찬가지로 명백히 유효하지 않습니다.

구현은 각 format에 대해 공통 파싱 라이브러리 또는 잘 알려진 정규 표현식을 사용하는 것이 권장됩니다(RECOMMENDED). 구현은 각 format 속성이 어떻게, 어느 정도까지 검증되는지 명확히 문서화하는 것이 좋습니다(SHOULD).

표준 Core 및 Validation 메타 스키마 (5절)는 "$vocabulary" 키워드에 이 어휘를 false 값으로 포함합니다. 기본적으로 구현은 이 키워드를 단언으로 지원할 필요가 없기 때문입니다. format 어휘를 true 값으로 지원하면 코드 크기와 경우에 따라 실행 시간이 크게 증가하는 것으로 이해되며, 모든 구현에 적합하지는 않습니다.

7.2.3. 사용자 정의 format 속성

구현은 사용자 정의 format 속성을 지원할 수 있습니다(MAY). 당사자 간의 합의가 없는 한, 스키마 작성자는 피어 구현이 그러한 사용자 정의 format 속성을 지원할 것으로 기대해서는 안 됩니다(SHALL NOT). 구현은 알 수 없는 format을 주석으로 수집하는 데 실패해서는 안 됩니다(MUST NOT). Format-Assertion 어휘가 지정된 경우, 구현은 알 수 없는 format을 만나면 실패해야 합니다(MUST).

어휘는 키워드에 대해 서로 다른 값 집합을 구체적으로 선언하는 것을 지원하지 않습니다. 이러한 한계와 이 키워드의 역사적으로 고르지 못한 구현으로 인해, 상호 운용성이 필요하다면 추가 format 속성보다 사용자 정의 어휘에 추가 키워드를 정의하는 것이 권장됩니다(RECOMMENDED).

7.3. 정의된 형식

7.3.1. 날짜, 시간 및 기간

이러한 속성은 문자열 인스턴스에 적용됩니다.

날짜 및 시간 format 이름은 RFC 3339, 5.6절 [RFC3339]에서 파생됩니다. duration format은 RFC 3339의 부록 A에 제시된 ISO 8601 ABNF에서 가져옵니다.

format을 지원하는 구현은 다음 속성에 대한 지원을 구현하는 것이 좋습니다(SHOULD).

date-time:
문자열 인스턴스가 위에서 참조한 "date-time" ABNF 규칙에 따른 유효한 표현이면, 이 속성에 대해 유효합니다.
date:
문자열 인스턴스가 위에서 참조한 "full-date" ABNF 규칙에 따른 유효한 표현이면, 이 속성에 대해 유효합니다.
time:
문자열 인스턴스가 위에서 참조한 "full-time" ABNF 규칙에 따른 유효한 표현이면, 이 속성에 대해 유효합니다.
duration:
문자열 인스턴스가 위에서 참조한 "duration" ABNF 규칙에 따른 유효한 표현이면, 이 속성에 대해 유효합니다.

구현은 해당 RFC의 어디에서든 정의된 다른 format 이름을 사용하여 추가 속성을 지원할 수 있습니다(MAY). "full-date" 또는 "full-time"이 구현되면, 대응하는 축약 형식("date" 또는 "time")도 각각 구현되어야 하며(MUST), 동일하게 동작해야 합니다(MUST). 구현은 해당 format의 규칙에 따라 검증하지 않는 한 RFC 3339 format과 일치하는 이름의 확장 속성을 정의해서는 안 됩니다(SHOULD NOT). 현재 모든 RFC 3339 format을 지원할 필요성에 대한 합의는 없습니다. 따라서 네임스페이스를 예약하는 이러한 접근 방식은 전체 집합에 전념하지 않고도 실험을 장려할 것입니다. format 구현 요구사항이 전반적으로 더 유연해지거나, 이러한 것들이 완전히 지정된 속성으로 승격되거나 제거될 가능성이 있습니다.

7.3.2. 이메일 주소

이러한 속성은 문자열 인스턴스에 적용됩니다.

문자열 인스턴스가 다음과 같이 유효한 인터넷 이메일 주소라면, 이 속성들에 대해 유효합니다.

email:
RFC 5321, 4.1.2절 [RFC5321]의 "Mailbox" ABNF 규칙에 정의된 대로입니다.
idn-email:
RFC 6531, 3.3절 [RFC6531]의 확장 "Mailbox" ABNF 규칙에 정의된 대로입니다.

"email" 속성에 대해 유효한 모든 문자열은 "idn-email" 속성에 대해서도 유효하다는 점에 유의하십시오.

7.3.3. 호스트명

이러한 속성은 문자열 인스턴스에 적용됩니다.

문자열 인스턴스가 다음과 같이 인터넷 호스트명에 대한 유효한 표현이면, 이 속성들에 대해 유효합니다.

hostname:
RFC 1123, 2.1절 [RFC1123]에 정의된 대로이며, RFC 5891, 4.4절 [RFC5891]에 지정된 Punycode 알고리즘을 사용하여 생성된 호스트 이름을 포함합니다.
idn-hostname:
hostname의 경우처럼 RFC 1123에 정의된 것이거나, RFC 5890, 2.3.2.3절 [RFC5890]에 정의된 국제화 호스트명입니다.

"hostname" 속성에 대해 유효한 모든 문자열은 "idn-hostname" 속성에 대해서도 유효하다는 점에 유의하십시오.

7.3.4. IP 주소

이러한 속성은 문자열 인스턴스에 적용됩니다.

문자열 인스턴스가 다음과 같이 IP 주소의 유효한 표현이면, 이 속성들에 대해 유효합니다.

ipv4:
RFC 2673, 3.2절 [RFC2673]에 정의된 "dotted-quad" ABNF 구문에 따른 IPv4 주소입니다.
ipv6:
RFC 4291, 2.2절 [RFC4291]에 정의된 IPv6 주소입니다.

7.3.5. 리소스 식별자

이러한 속성은 문자열 인스턴스에 적용됩니다.

uri:
문자열 인스턴스가 [RFC3986]에 따른 유효한 URI이면, 이 속성에 대해 유효합니다.
uri-reference:
문자열 인스턴스가 [RFC3986]에 따른 유효한 URI Reference(URI 또는 relative-reference)이면, 이 속성에 대해 유효합니다.
iri:
문자열 인스턴스가 [RFC3987]에 따른 유효한 IRI이면, 이 속성에 대해 유효합니다.
iri-reference:
문자열 인스턴스가 [RFC3987]에 따른 유효한 IRI Reference(IRI 또는 relative-reference)이면, 이 속성에 대해 유효합니다.
uuid:
문자열 인스턴스가 [RFC4122]에 따른 UUID의 유효한 문자열 표현이면, 이 속성에 대해 유효합니다.

모든 유효한 URI는 유효한 IRI이며, 모든 유효한 URI Reference도 유효한 IRI Reference라는 점에 유의하십시오.

또한 "uuid" format은 URN의 UUID가 아니라 일반 UUID를 위한 것임에 유의하십시오. 예시는 "f81d4fae-7dec-11d0-a765-00a0c91e6bf6"입니다. URN으로서의 UUID에는 "uri" format을 사용하고, URI 스킴과 URN 네임스페이스를 나타내기 위해 "^urn:uuid:"의 "pattern" 정규 표현식을 사용하십시오.

7.3.6. uri-template

이 속성은 문자열 인스턴스에 적용됩니다.

문자열 인스턴스가 [RFC6570]에 따른 유효한 URI Template(어느 수준이든)이면, 이 속성에 대해 유효합니다.

URI Template은 IRI에 사용될 수 있으며, 별도의 IRI Template 명세는 없다는 점에 유의하십시오.

7.3.7. JSON 포인터

이러한 속성은 문자열 인스턴스에 적용됩니다.

json-pointer:
문자열 인스턴스가 RFC 6901, 5절 [RFC6901]에 따른 JSON Pointer의 유효한 JSON 문자열 표현이면, 이 속성에 대해 유효합니다.
relative-json-pointer:
문자열 인스턴스가 유효한 Relative JSON Pointer [relative-json-pointer]이면, 이 속성에 대해 유효합니다.

절대 및 상대 JSON Pointer를 모두 허용하려면 "anyOf" 또는 "oneOf"를 사용하여 어느 format이든 지원함을 나타내십시오.

7.3.8. regex

이 속성은 문자열 인스턴스에 적용됩니다.

ECMA-262 [ecma262] 정규 표현식 방언에 따라 유효한 것이 좋은(SHOULD) 정규 표현식입니다.

format을 검증하는 구현은 이 명세의 정규 표현식 (4.3절) 절에 정의된 ECMA-262의 부분집합을 적어도 수용해야 하며(MUST), 모든 유효한 ECMA-262 표현식을 수용하는 것이 좋습니다(SHOULD).

8. 문자열로 인코딩된 데이터의 내용을 위한 어휘

8.1. 머리말

이 절에 정의된 주석은 인스턴스가 JSON 문자열로 인코딩된 비 JSON 데이터를 포함함을 나타냅니다.

이러한 프로퍼티는 JSON 데이터를 풍부한 멀티미디어 문서로 해석하는 데 필요한 추가 정보를 제공합니다. 콘텐츠의 타입, 인코딩 방식, 그리고/또는 검증될 수 있는 방식을 설명합니다. 이들은 검증 단언으로 동작하지 않습니다. 잘못 형성된 문자열 인코딩 문서가 포함하는 인스턴스를 유효하지 않은 것으로 간주하게 해서는 안 됩니다(MUST NOT).

"$vocabulary"를 사용하지 않는 메타 스키마는 이 어휘의 URI가 true 값으로 존재하는 것처럼 이 어휘를 요구하는 것으로 간주하는 것이 좋습니다(SHOULD).

Content 어휘로 알려진 이 어휘의 현재 URI는 다음과 같습니다. <https://json-schema.org/draft/2020-12/vocab/content>.

대응하는 메타 스키마의 현재 URI는 다음과 같습니다. https://json-schema.org/draft/2020-12/meta/content.

8.2. 구현 요구사항

보안 및 성능 문제와 가능한 콘텐츠 타입의 개방적인 특성 때문에, 구현은 기본적으로 문자열 내용을 자동으로 디코딩, 파싱, 그리고/또는 검증해서는 안 됩니다(MUST NOT). 이는 포함하는 문서를 처리한 소비자와 다른 소비자가 처리하도록 의도된 임베디드 문서의 사용 사례도 추가로 지원합니다.

이 절의 모든 키워드는 문자열에만 적용되며, 다른 데이터 타입에는 효과가 없습니다.

구현은 문자열 내용을 자동으로 디코딩, 파싱, 그리고/또는 검증하는 기능을 제공할 수 있습니다(MAY). 그러나 이러한 작업을 기본적으로 수행해서는 안 되며(MUST NOT), 각 문자열 인코딩 문서의 검증 결과를 둘러싼 문서와 별도로 제공해야 합니다(MUST). 이 프로세스는 원래 스키마에 대해 인스턴스를 완전히 평가한 뒤, 주석을 사용하여 각 문자열 인코딩 문서를 디코딩, 파싱, 그리고/또는 검증하는 것과 동등한 것이 좋습니다(SHOULD). 현재로서는 이러한 자동 디코딩, 파싱 및 검증 기능에서 파싱된 데이터 및/또는 검증 결과를 수행하고 반환하는 정확한 메커니즘은 명세하지 않습니다. 그러한 기능이 널리 사용되는 것으로 입증되면, 향후 초안에서 더 철저히 명세될 수 있습니다.

이러한 키워드에 따라 인스턴스 문자열을 자동으로 처리함으로써 도입될 수 있는 취약점에 대해서는 보안 고려사항 (10절) 절도 참조하십시오.

8.3. contentEncoding

인스턴스 값이 문자열이면, 이 프로퍼티는 해당 문자열이 인코딩된 바이너리 데이터로 해석되고 이 프로퍼티가 이름으로 지정한 인코딩을 사용하여 디코딩되는 것이 좋음을 정의합니다(SHOULD).

여러 변형을 포함한 base 16, 32 및 64 인코딩을 나타내는 가능한 값은 RFC 4648 [RFC4648]에 나열되어 있습니다. 또한 RFC 2045 [RFC2045]의 6.7절 및 6.8절은 MIME에서 사용되는 인코딩을 제공합니다. 이 키워드는 바이너리 데이터를 ASCII 문자로 매핑하도록 설계된 MIME의 Content-Transfer-Encoding 헤더에서 파생되었습니다. 이는 HTTP 요청 및 응답의 콘텐츠를 인코딩(예: 압축 또는 암호화)하는 데 사용되는 HTTP의 Content-Encoding 헤더와 관련이 없습니다.

"base64"는 두 RFC 모두에 정의되어 있으므로, 문자열이 MIME 컨텍스트에서 사용되도록 특별히 의도되지 않은 한 RFC 4648의 정의를 가정하는 것이 좋습니다(SHOULD). 이러한 모든 인코딩은 7비트 ASCII 문자만으로 구성된 문자열을 생성한다는 점에 유의하십시오. 따라서 이 키워드는 그 범위를 벗어난 문자를 포함하는 문자열에는 의미가 없습니다.

이 키워드가 없지만 "contentMediaType"이 존재하는 경우, 이는 인코딩이 identity 인코딩임을 나타냅니다. 즉, 콘텐츠를 UTF-8 문자열로 표현하기 위해 변환이 필요하지 않았다는 뜻입니다.

이 프로퍼티의 값은 문자열이어야 합니다(MUST).

8.4. contentMediaType

인스턴스가 문자열이면, 이 프로퍼티는 문자열 내용의 미디어 타입을 나타냅니다. "contentEncoding"이 존재하면, 이 프로퍼티는 디코딩된 문자열을 설명합니다.

이 프로퍼티의 값은 문자열이어야 하며(MUST), RFC 2046 [RFC2046]에 정의된 미디어 타입이어야 합니다(MUST).

8.5. contentSchema

인스턴스가 문자열이고 "contentMediaType"이 존재하면, 이 프로퍼티는 문자열의 구조를 설명하는 스키마를 포함합니다.

이 키워드는 JSON Schema의 데이터 모델로 매핑될 수 있는 모든 미디어 타입과 함께 사용할 수 있습니다(MAY).

이 프로퍼티의 값은 유효한 JSON Schema여야 합니다(MUST). "contentMediaType"이 존재하지 않으면 무시되는 것이 좋습니다(SHOULD).

8.6. 예시

다음은 "contentEncoding"과 "contentMediaType"의 사용을 보여주는 예시 스키마입니다.


{
    "type": "string",
    "contentEncoding": "base64",
    "contentMediaType": "image/png"
}

이 스키마가 설명하는 인스턴스는 문자열일 것으로 예상되며, 그 값은 base64로 인코딩된 PNG 이미지로 해석될 수 있어야 합니다.

또 다른 예시입니다.


{
    "type": "string",
    "contentMediaType": "text/html"
}

이 스키마가 설명하는 인스턴스는 JSON 문자열이 디코딩된 문자 집합을 사용하여 HTML을 포함하는 문자열일 것으로 예상됩니다. RFC 8259 [RFC8259]의 8.1절에 따르면, 완전히 닫힌 시스템 외부에서는 이는 UTF-8이어야 합니다(MUST).

이 예시는 HMAC SHA-256 알고리즘을 사용하여 MAC 처리된 JWT를 설명하며, claim set 안에 "iss" 및 "exp" 필드를 요구합니다.


{
    "type": "string",
    "contentMediaType": "application/jwt",
    "contentSchema": {
        "type": "array",
        "minItems": 2,
        "prefixItems": [
            {
                "const": {
                    "typ": "JWT",
                    "alg": "HS256"
                }
            },
            {
                "type": "object",
                "required": ["iss", "exp"],
                "properties": {
                    "iss": {"type": "string"},
                    "exp": {"type": "integer"}
                }
            }
        ]
    }
}

"contentEncoding"이 나타나지 않는다는 점에 유의하십시오. "application/jwt" 미디어 타입은 base64url 인코딩을 사용하지만, 이는 미디어 타입에 의해 정의되며, JWT 문자열이 두 개의 JSON 데이터 구조 목록으로 디코딩되는 방식을 결정합니다. 첫 번째는 헤더이고, 그 다음은 페이로드입니다. JWT 미디어 타입은 JWT가 JSON 문자열로 표현될 수 있음을 보장하므로, 추가 인코딩 또는 디코딩이 필요하지 않습니다.

9. 기본 메타데이터 주석을 위한 어휘

이러한 범용 주석 키워드는 문서화 및 사용자 인터페이스 표시 목적에 흔히 사용되는 정보를 제공합니다. 이는 포괄적인 기능 집합을 형성하도록 의도된 것이 아닙니다. 오히려 더 복잡한 주석 기반 애플리케이션을 위해 추가 어휘를 정의할 수 있습니다.

"$vocabulary"를 사용하지 않는 메타 스키마는 이 어휘의 URI가 true 값으로 존재하는 것처럼 이 어휘를 요구하는 것으로 간주하는 것이 좋습니다(SHOULD).

Meta-Data 어휘로 알려진 이 어휘의 현재 URI는 다음과 같습니다. <https://json-schema.org/draft/2020-12/vocab/meta-data>.

대응하는 메타 스키마의 현재 URI는 다음과 같습니다. https://json-schema.org/draft/2020-12/meta/meta-data.

9.1. "title" 및 "description"

이 두 키워드의 값은 모두 문자열이어야 합니다(MUST).

이 두 키워드는 이 사용자 인터페이스가 생성한 데이터에 대한 정보로 사용자 인터페이스를 꾸미는 데 사용할 수 있습니다. title은 되도록 짧고, description은 이 스키마가 설명하는 인스턴스의 목적에 대한 설명을 제공합니다.

9.2. "default"

이 키워드의 값에는 제한이 없습니다. 이 키워드의 여러 발생이 단일 하위 인스턴스에 적용될 수 있는 경우, 구현은 중복을 제거하는 것이 좋습니다(SHOULD).

이 키워드는 특정 스키마와 연결된 기본 JSON 값을 제공하는 데 사용할 수 있습니다. 기본값은 관련 스키마에 대해 유효한 것이 권장됩니다(RECOMMENDED).

9.3. "deprecated"

이 키워드의 값은 불리언이어야 합니다(MUST). 이 키워드의 여러 발생이 단일 하위 인스턴스에 적용될 수 있는 경우, 애플리케이션은 어떤 발생이든 true 값을 지정하면 인스턴스 위치를 deprecated로 간주하는 것이 좋습니다(SHOULD).

"deprecated"가 불리언 true 값을 가지면, 애플리케이션이 선언된 프로퍼티의 사용을 삼가는 것이 좋음을 나타냅니다(SHOULD). 이는 해당 프로퍼티가 향후 제거될 수 있음을 의미할 수 있습니다(MAY).

true 값의 "deprecated"를 포함하는 루트 스키마는 설명되는 전체 리소스가 향후 제거될 수 있음을 나타냅니다(MAY).

"deprecated" 키워드는 해당 키워드를 포함하는 스키마 객체가 성공적으로 적용되는 각 인스턴스 위치에 적용됩니다. 이로 인해 포함하는 배열 또는 객체는 deprecated가 아니더라도 모든 배열 항목 또는 객체 프로퍼티가 deprecated가 되는 시나리오가 발생할 수 있습니다.

이 키워드를 생략하면 값이 false인 것과 동일하게 동작합니다.

9.4. "readOnly" 및 "writeOnly"

이러한 키워드의 값은 불리언이어야 합니다(MUST). 이러한 키워드의 여러 발생이 단일 하위 인스턴스에 적용될 수 있는 경우, 어떤 발생이든 true 값을 지정하면 결과 동작은 true 값의 경우와 같은 것이 좋고(SHOULD), 그렇지 않으면 false 값의 경우와 같은 것이 좋습니다(SHOULD).

"readOnly"가 불리언 true 값을 가지면, 인스턴스의 값이 소유 권한자에 의해서만 관리되며, 애플리케이션이 이 프로퍼티의 값을 수정하려는 시도는 해당 소유 권한자에 의해 무시되거나 거부될 것으로 예상됨을 나타냅니다.

전체 문서에 대해 "readOnly"로 표시된 인스턴스 문서가 소유 권한자에게 전송되면, 권한자의 재량에 따라 무시될 수 있거나(MAY) 오류가 발생할 수 있습니다(MAY).

"writeOnly"가 불리언 true 값을 가지면, 인스턴스가 소유 권한자로부터 검색될 때 해당 값이 절대 존재하지 않음을 나타냅니다. 문서(또는 그것이 나타내는 리소스)를 갱신하거나 생성하기 위해 소유 권한자에게 전송될 때는 존재할 수 있지만, 인스턴스의 어떤 갱신된 버전이나 새로 생성된 버전에도 포함되지 않습니다.

전체 문서에 대해 "writeOnly"로 표시된 인스턴스 문서는 어떤 종류의 빈 문서로 반환될 수 있거나(MAY), 검색 시 오류를 발생시킬 수 있거나(MAY), 권한자의 재량에 따라 검색 요청이 무시될 수 있습니다.

예를 들어, "readOnly"는 데이터베이스가 생성한 일련번호를 읽기 전용으로 표시하는 데 사용되고, "writeOnly"는 비밀번호 입력 필드를 표시하는 데 사용됩니다.

이러한 키워드는 사용자 인터페이스 인스턴스 생성을 지원하는 데 사용할 수 있습니다. 특히 애플리케이션은 write-only 필드에 대해 사용자가 입력하는 동안 입력 값을 숨기는 위젯을 사용하도록 선택할 수 있습니다(MAY).

이러한 키워드를 생략하면 값이 false인 것과 동일하게 동작합니다.

9.5. "examples"

이 키워드의 값은 배열이어야 합니다(MUST). 배열 안의 값에는 제한이 없습니다. 이 키워드의 여러 발생이 단일 하위 인스턴스에 적용될 수 있는 경우, 구현은 배열의 배열이 아니라 모든 값의 평탄한 배열을 제공해야 합니다(MUST).

이 키워드는 사용법을 설명하기 위한 목적으로 특정 스키마와 연결된 샘플 JSON 값을 제공하는 데 사용할 수 있습니다. 이러한 값은 관련 스키마에 대해 유효한 것이 권장됩니다(RECOMMENDED).

구현은 "default"가 존재하는 경우 그 값을 추가 예시로 사용할 수 있습니다(MAY). "examples"가 없더라도 "default"는 여전히 이러한 방식으로 사용될 수 있습니다(MAY).

10. 보안 고려사항

JSON Schema 검증은 JSON Schema Core를 위한 어휘를 정의하며, 거기에 나열된 모든 보안 고려사항과 관련됩니다.

JSON Schema 검증은 정규 표현식의 사용을 허용하며, 정규 표현식에는 수많은 서로 다른(종종 호환되지 않는) 구현이 있습니다. 일부 구현은 임의 코드의 삽입을 허용하는데, 이는 JSON Schema의 범위를 벗어나며 허용되어서는 안 됩니다(MUST NOT). 정규 표현식은 계산 비용이 매우 높도록(이른바 "catastrophic backtracking") 작성될 수도 있으며, 이로 인해 서비스 거부 공격이 발생할 수 있습니다.

"contentEncoding" 및/또는 "contentMediaType"에 기반하여 인스턴스 문자열 데이터를 검증하거나 달리 평가하는 것을 지원하는 구현은 오해의 소지가 있는 정보에 기반해 안전하지 않은 방식으로 데이터를 평가할 위험이 있습니다. 애플리케이션은 스키마와 인스턴스 사이의 관계가 확립된 경우(예: 동일한 권한자를 공유하는 경우)에만 그러한 처리를 수행함으로써 이 위험을 완화할 수 있습니다.

미디어 타입 또는 인코딩을 처리하는 것은 해당 미디어 타입 또는 인코딩의 보안 고려사항의 적용을 받습니다. 예를 들어, JSON 문자열 안에 인코딩된 JavaScript 또는 ECMAScript를 처리할 때는 RFC 4329 Scripting Media Types [RFC4329]의 보안 고려사항이 적용됩니다.

11. 참고문헌

11.1. 규범적 참고문헌

[RFC2119]
Bradner, S., "요구 수준을 나타내기 위해 RFC에서 사용하는 핵심 단어", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/info/rfc2119>.
[RFC1123]
Braden, R., Ed., "인터넷 호스트 요구사항 - 애플리케이션 및 지원", STD 3, RFC 1123, DOI 10.17487/RFC1123, , <https://www.rfc-editor.org/info/rfc1123>.
[RFC2045]
Freed, N. and N. Borenstein, "Multipurpose Internet Mail Extensions (MIME) 제1부: 인터넷 메시지 본문의 형식", RFC 2045, DOI 10.17487/RFC2045, , <https://www.rfc-editor.org/info/rfc2045>.
[RFC2046]
Freed, N. and N. Borenstein, "Multipurpose Internet Mail Extensions (MIME) 제2부: 미디어 타입", RFC 2046, DOI 10.17487/RFC2046, , <https://www.rfc-editor.org/info/rfc2046>.
[RFC2673]
Crawford, M., "도메인 이름 시스템의 바이너리 레이블", RFC 2673, DOI 10.17487/RFC2673, , <https://www.rfc-editor.org/info/rfc2673>.
[RFC3339]
Klyne, G. and C. Newman, "인터넷의 날짜와 시간: 타임스탬프", RFC 3339, DOI 10.17487/RFC3339, , <https://www.rfc-editor.org/info/rfc3339>.
[RFC3986]
Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform Resource Identifier (URI): 일반 구문", STD 66, RFC 3986, DOI 10.17487/RFC3986, , <https://www.rfc-editor.org/info/rfc3986>.
[RFC3987]
Duerst, M. and M. Suignard, "Internationalized Resource Identifiers (IRIs)", RFC 3987, DOI 10.17487/RFC3987, , <https://www.rfc-editor.org/info/rfc3987>.
[RFC4122]
Leach, P., Mealling, M., and R. Salz, "Universally Unique IDentifier (UUID) URN 네임스페이스", RFC 4122, DOI 10.17487/RFC4122, , <https://www.rfc-editor.org/info/rfc4122>.
[RFC4291]
Hinden, R. and S. Deering, "IP 버전 6 주소 지정 아키텍처", RFC 4291, DOI 10.17487/RFC4291, , <https://www.rfc-editor.org/info/rfc4291>.
[RFC4648]
Josefsson, S., "Base16, Base32 및 Base64 데이터 인코딩", RFC 4648, DOI 10.17487/RFC4648, , <https://www.rfc-editor.org/info/rfc4648>.
[RFC5321]
Klensin, J., "Simple Mail Transfer Protocol", RFC 5321, DOI 10.17487/RFC5321, , <https://www.rfc-editor.org/info/rfc5321>.
[RFC5890]
Klensin, J., "애플리케이션을 위한 국제화 도메인 이름 (IDNA): 정의 및 문서 프레임워크", RFC 5890, DOI 10.17487/RFC5890, , <https://www.rfc-editor.org/info/rfc5890>.
[RFC5891]
Klensin, J., "애플리케이션의 국제화 도메인 이름 (IDNA): 프로토콜", RFC 5891, DOI 10.17487/RFC5891, , <https://www.rfc-editor.org/info/rfc5891>.
[RFC6570]
Gregorio, J., Fielding, R., Hadley, M., Nottingham, M., and D. Orchard, "URI Template", RFC 6570, DOI 10.17487/RFC6570, , <https://www.rfc-editor.org/info/rfc6570>.
[RFC6531]
Yao, J. and W. Mao, "국제화 이메일을 위한 SMTP 확장", RFC 6531, DOI 10.17487/RFC6531, , <https://www.rfc-editor.org/info/rfc6531>.
[RFC6901]
Bryan, P., Ed., Zyp, K., and M. Nottingham, Ed., "JavaScript Object Notation (JSON) Pointer", RFC 6901, DOI 10.17487/RFC6901, , <https://www.rfc-editor.org/info/rfc6901>.
[RFC8259]
Bray, T., Ed., "JavaScript Object Notation (JSON) 데이터 교환 형식", STD 90, RFC 8259, DOI 10.17487/RFC8259, , <https://www.rfc-editor.org/info/rfc8259>.
[ecma262]
"ECMA-262, 제11판 명세", , <https://262.ecma-international.org/5.1/>.
[relative-json-pointer]
Luff, G., Andrews, H., and B. Hutton, Ed., "Relative JSON Pointers", 진행 중인 작업, Internet-Draft, draft-handrews-relative-json-pointer-01, , <https://datatracker.ietf.org/doc/html/draft-handrews-relative-json-pointer-01>.
[json-schema]
Wright, A., Andrews, H., Hutton, B., and G. Dennis, "JSON Schema: JSON 문서를 설명하기 위한 미디어 타입", 진행 중인 작업, Internet-Draft, draft-bhutton-json-schema-01, , <https://datatracker.ietf.org/doc/html/draft-bhutton-json-schema-01>.

11.2. 정보성 참고문헌

[RFC4329]
Hoehrmann, B., "스크립팅 미디어 타입", RFC 4329, DOI 10.17487/RFC4329, , <https://www.rfc-editor.org/info/rfc4329>.

부록 A. Validation에서 Core로 이동된 키워드

이 초안부터 여러 키워드가 이 문서에서 Core 명세 [json-schema]로 이동되었으며, 일부 경우에는 이름 변경 또는 다른 변경이 있었습니다. 이는 다음의 이전 검증 키워드에 영향을 줍니다.

"definitions"
"$ref"와 맞추고 입력하기 더 짧게 하기 위해 "$defs"로 이름이 변경되었습니다. 스키마 어휘 작성자는 여전히 이전 이름을 사용하는 스키마를 무효화하지 않기 위해 다른 동작을 가진 "definitions" 키워드를 정의해서는 안 됩니다(SHOULD NOT). "definitions"는 이 문서가 참조하는 단일 어휘 메타 스키마에는 없지만, 기본 메타 스키마에는 계속 존재하며, 구현은 해당 메타 스키마가 사용될 때 "$defs"와 "definitions"가 동일한 동작을 가진다고 가정하는 것이 좋습니다(SHOULD).
"allOf", "anyOf", "oneOf", "not", "if", "then", "else", "items", "additionalItems", "contains", "propertyNames", "properties", "patternProperties", "additionalProperties"
이 모든 키워드는 인스턴스에 하위 스키마를 적용하고 그 결과를 결합하며, 자체적으로 어떤 조건도 단언하지 않습니다. 단언 키워드가 없으면, 이러한 applicator는 false 불리언 스키마를 사용하거나 true 불리언 스키마(또는 동등한 스키마 객체)의 결과를 반전함으로써만 단언 실패를 일으킬 수 있습니다. 이러한 이유로, validation, hyper-schema 및 확장 어휘가 모두 기반으로 삼을 수 있는 일반 메커니즘으로 정의하는 것이 더 적절합니다.
"dependencies"
이 키워드는 두 가지 서로 다른 동작 모드를 가지고 있었기 때문에 구현하고 추론하기가 비교적 어려웠습니다. 스키마 형태는 Core로 이동되었고 applicator 어휘의 일부로 "dependentSchemas"로 이름이 변경되었습니다. 이는 "properties"와 유사하지만, 프로퍼티 값에 하위 스키마를 적용하는 대신 해당 프로퍼티를 포함하는 객체에 적용합니다. 프로퍼티 이름 배열 형태는 여기 유지되며 "dependentRequired"로 이름이 변경되었습니다. 이는 "required" 단언 키워드의 조건부 사용을 위한 단축 표현인 단언이기 때문입니다.

부록 B. 감사의 말

JSON Schema의 초기 초안 작업에 대해 Gary Court, Francis Galiegue, Kris Zyp, Geraint Luff에게 감사드립니다.

문서에 제출 및 패치를 해 준 Jason Desrosiers, Daniel Perrett, Erik Wilde, Evgeny Poberezkin, Brad Bowman, Gowry Sankar, Donald Pipowitch, Dave Finlay, Denis Laxalde, Phil Sturgeon, Shawn Silverman, Karen Etheridge에게 감사드립니다.

부록 C. 변경 로그

이 절은 Internet-Draft 상태를 벗어나기 전에 제거될 예정입니다.

draft-bhutton-json-schema-validation-01
  • "minContains" 키워드 설명을 개선하고 명확히 함
  • "production" 사용을 제거하고 "ABNF rule"을 사용하도록 함
draft-bhutton-json-schema-validation-00
  • email format RFC 참조를 5322가 아니라 5321로 수정
  • "contentEncoding" 값의 집합과 의미를 명확히 함
  • 정규 표현식 지원에 대해 ECMA-262 제11판을 참조
  • "format"을 주석 전용 어휘와 단언 어휘로 분리
  • 배열에 적용될 때의 "deprecated"를 명확히 함
draft-handrews-json-schema-validation-02
  • 키워드를 공식 어휘로 그룹화
  • "format" 구현 요구사항을 어휘 관점에서 갱신
  • 기본적으로 "format"은 검증되어서는 안 되지만, 검증은 활성화될 수 있음
  • 어휘 선언을 사용하여 "format" 검증을 요구할 수 있음
  • "definitions"를 "$defs"로 Core 명세로 이동
  • applicator 키워드를 Core 명세로 이동
  • "dependencies"의 배열 형태를 "dependentRequired"로 이름 변경하고, 스키마 형태를 Core 명세로 이동
  • 모든 "content*" 키워드를 단언이 아니라 주석으로 명세
  • 문자열 인코딩 문서에 스키마를 적용할 수 있도록 "contentSchema" 추가
  • "contentEncoding"에서 RFC 4648 인코딩도 허용
  • "minContains" 및 "maxContains" 추가
  • "hostname" 및 "idn-hostname"에 대한 RFC 참조 갱신
  • "uuid" 및 "duration" format 추가
draft-handrews-json-schema-validation-01
  • 이 초안은 기능 변경 없이 순수하게 명확화만 수행
  • "not" 및 유사한 경우 아래에서 주석을 무시하는 일반 원칙을 제공
  • "if"/"then"/"else" 검증 상호작용을 명확히 함
  • 주석에 대한 "if"/"then"/"else" 동작을 명확히 함
  • 사소한 형식 지정 및 상호 참조 개선
draft-handrews-json-schema-validation-00
  • "if"/"then"/"else" 추가
  • Core 명세에 따라 키워드를 단언 또는 주석으로 분류
  • 향후 "dependencies"를 제거할 가능성을 경고
  • 가독성을 위해 검증 키워드를 하위 절로 그룹화
  • "readOnly"를 hyper-schema에서 validation meta-data로 이동
  • "writeOnly" 추가
  • 이전 hyper-schema "media" 키워드를 포함한 문자열 인코딩 미디어 절 추가
  • "regex" format 복원(제거는 의도하지 않은 것이었음)
  • "date" 및 "time" format 추가, 추가 RFC 3339 format 이름 예약
  • I18N format: "iri", "iri-reference", "idn-hostname", "idn-email"
  • "json-pointer" format이 URI fragment가 아니라 문자열 인코딩을 의미함을 명확히 함
  • "minimum" 및 "exclusiveMinimum"의 의미를 뒤집던 오타 수정
  • format 구문 참조를 규범적 참고문헌으로 이동
  • JSON은 규범적 요구사항임
draft-wright-json-schema-validation-01
  • 전체 단어를 사용하는 하이픈 연결 format 이름으로 표준화 ("uriref"가 "uri-reference"가 됨)
  • "uri-template" 및 "json-pointer" format 추가
  • "exclusiveMaximum"/"exclusiveMinimum"을 "maximum"/"minimum"의 불리언 수정자에서 독립적인 숫자 필드로 변경
  • additionalItems/items를 두 절로 분리
  • properties/patternProperties/additionalProperties 정의를 재작업
  • "examples" 키워드 추가
  • "contains" 키워드 추가
  • 빈 "required" 및 "dependencies" 배열 허용
  • "type"의 원시 타입 참조 수정
  • "const" 키워드 추가
  • "propertyNames" 키워드 추가
draft-wright-json-schema-validation-00
  • 추가 보안 고려사항 추가
  • "latest version" 메타 스키마에 대한 참조를 제거하고, 번호가 매겨진 버전을 사용
  • 간결성을 위해 많은 키워드 정의를 다시 표현
  • 상대 URI 참조도 허용하는 "uriref" format 추가
draft-fge-json-schema-validation-00
  • 초기 초안.
  • draft v3에서 복구.
  • "required" 키워드를 재정의.
  • "extends", "disallow" 제거
  • "anyOf", "allOf", "oneOf", "not", "definitions", "minProperties", "maxProperties" 추가.
  • "dependencies" 멤버 값은 더 이상 단일 문자열일 수 없으며, 프로퍼티 의존성 배열에는 적어도 하나의 요소가 필요함.
  • "divisibleBy"를 "multipleOf"로 이름 변경.
  • "type" 배열은 더 이상 스키마를 가질 수 없으며, 가능한 값에서 "any" 제거.
  • "format" 절을 재작업하고 지원을 선택 사항으로 함.
  • "format": "phone", "style", "color" 속성을 제거하고, "ip-address"를 "ipv4"로 이름 변경하며, 모든 속성에 대한 참조 추가.
  • 배열/객체 인스턴스에 대한 스키마를 계산하는 알고리즘 제공.
  • 상호 운용성 고려사항 추가.

저자 주소

Austin Wright (편집자)
Henry Andrews (편집자)
Ben Hutton (편집자)
Postman