OpenAPI 명세서 v3.2.0

버전 3.2.0

이 문서에 대한 자세한 정보
현재 버전:
https://spec.openapis.org/oas/v3.2.0.html
최신 공개 버전:
https://spec.openapis.org/oas/latest.html
최신 편집자 초안:
https://github.com/OAI/OpenAPI-Specification/
편집자:
Henry Andrews
Jeremy Whitlock
Karen Etheridge
Lorna Mitchell
Marsh Gardiner
Miguel Quintero
Mike Kistler
Ralf Handl
Vincent Biret
이전 편집자:
Ron Ratovsky
Darrel Miller
Mike Ralphson
Uri Sarid
Jason Harmon
Tony Tam
다른 버전:
https://spec.openapis.org/oas/v3.1.2.html
https://spec.openapis.org/oas/v3.1.1.html
https://spec.openapis.org/oas/v3.1.0.html
https://spec.openapis.org/oas/v3.0.4.html
https://spec.openapis.org/oas/v3.0.3.html
https://spec.openapis.org/oas/v3.0.2.html
https://spec.openapis.org/oas/v3.0.1.html
https://spec.openapis.org/oas/v3.0.0.html
https://spec.openapis.org/oas/v2.0.html
참여하기
GitHub OAI/OpenAPI-Specification
버그 신고하기
커밋 기록
풀 리퀘스트

OpenAPI 명세서란 무엇인가?

OpenAPI 명세서(OAS)는 HTTP API에 대한 표준화되고 프로그래밍 언어에 구애받지 않는 인터페이스 설명을 정의하며, 이를 통해 사람과 컴퓨터 모두 소스 코드나 추가 문서, 네트워크 트래픽의 확인 없이 서비스의 기능을 발견하고 이해할 수 있습니다. OpenAPI를 통해 올바르게 정의하면, 소비자는 최소한의 구현 논리만으로 원격 서비스를 이해하고 상호작용할 수 있습니다. 저수준 프로그래밍에서 인터페이스 설명이 수행한 역할과 유사하게, OpenAPI 명세서는 서비스 호출 시 추측을 없앱니다.

이 문서의 상태

이 명세서의 신뢰할 수 있는 소스는 위에 참고된 HTML 파일의 현재 버전입니다.

1. OpenAPI 명세서

1.1 버전 3.2.0

본 문서에서 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, 그리고 “OPTIONAL”이라는 키워드는 BCP 14 [RFC2119] [RFC8174]에서 설명한 대로, 대문자로 표시될 때에만 해당 의미로 해석됩니다.

본 문서는 아파치 라이선스 2.0 버전에 따라 라이선스가 부여됩니다.

2. 소개

OpenAPI 명세서(OAS)는 표준화된 언어 독립적 HTTP API 인터페이스를 정의하여, 소스 코드나 문서, 네트워크 트래픽 검사 없이 사람과 컴퓨터 모두 서비스의 기능을 발견하고 이해할 수 있게 합니다. 올바르게 정의될 경우, 소비자는 파싱 및 직렬화를 통해 HTTP 메시지를 데이터 모델과 주고받으면서 최소한의 구현 논리로 원격 서비스와 상호작용할 수 있습니다.

OpenAPI 설명 (OAD)는 이후 문서 생성 도구를 통해 API 표시, 코드 생성 도구를 통해 다양한 프로그래밍 언어로 서버 및 클라이언트를 생성하거나 테스트 도구 등 다양한 용도에 활용될 수 있습니다.

OpenAPI 사용 예시 및 추가 문서는 [OpenAPI-Learn] 페이지를 참고하시기 바랍니다.

OpenAPI Initiative가 공개한 확장 레지스트리 및 기타 명세, 그리고 본 명세서의 공식 렌더링은 spec.openapis.org에서 확인하실 수 있습니다.

2.1 버전 및 사용 중단

OpenAPI 명세서는 major.minor.patch 버전 체계를 사용합니다. 버전 문자열의 major.minor 부분(예: 3.1)은 OAS의 기능 집합을 SHALL로 표시합니다. .patch 버전은 기능 집합이 아니라 본 문서의 오류 수정이나 명확한 설명을 위한 것입니다. OAS 3.1을 지원하는 툴은 모든 OAS 3.1.* 버전과 SHOULD 호환되어야 합니다. 패치 버전은 SHOULD NOT 도구에 의해 고려되어야 하며, 예를 들어 3.1.03.1.1은 차이가 없어야 합니다.

특정 필드 또는 기능은 사용 중단됨으로 표시될 수 있습니다. 이러한 필드와 기능도 여전히 명세의 일부이며 다른 필드 및 기능처럼 사용할 수 있습니다. 그러나 OpenAPI 설명 작성자는 가능하면 새로운 필드와 기능을 사용해서 사용 중단된 항목을 대체해야 합니다.

현재로서는 이러한 요소는 다음 메이저 버전까지 OAS의 일부로 남을 것으로 예상되며, 향후 마이너 버전에서는 사용 중단된 요소의 제거 정책을 정의할 수 있습니다.

때때로, 이익이 크다고 판단될 경우 OAS의 minor 버전에서 호환되지 않는 변경이 이루어질 수 있습니다.

2.2 정의되지 않은 동작 및 구현-정의 동작

이 명세서는 특정 상황을 정의되지 않은 또는 구현-정의 동작으로 간주합니다.

정의되지 않은 동작은 일부 상황에서 명세를 위반하는 결과를 초래할 수 있으며, 이러한 모순의 검출이 불가능하거나 비현실적일 때 사용됩니다. 구현체는 MAY 과거의 불명확한 문구 등 역사적 이유로 정의되지 않은 시나리오를 지원할 수 있습니다. 이런 지원이 많은 경우 올바른 결과를 낼 수 있지만, 모든 도구에서, 그리고 미래 명세 버전에서도 작동한다는 NOT RECOMMENDED 보장이 없으니 의존하지 않는 것이 좋습니다.

구현-정의 동작은 여러 가지 다른(그러면서도 명세에 부합하는) 방법 중 구현이 하나를 선택할 수 있음을 의미합니다. 이것은 API 설명 작성자가 상호 운용성을 최대화하기 위해 RECOMMENDED 피해야 하는 모호한 요구 사항을 문서화합니다. 정의되지 않은 동작과는 달리, 모든 관련 도구가 동일한 동작을 지원한다고 그리고 그럴 경우에만 보장된다면 구현-정의 동작을 신뢰해도 안전합니다.

3. 형식

OpenAPI 명세서를 준수하는 OpenAPI 문서는 JSON 객체 자체이며, 이는 JSON 또는 YAML 형식으로 표현될 수 있습니다. 본 명세서의 예시는 간결함을 위해 YAML로 표시됩니다.

명세서의 모든 필드 이름은 대소문자-구분됩니다. 이는 맵의 키로 사용되는 모든 필드를 포함하며, 명시적으로 대소문자-구분 안함이라고 명시된 경우를 제외합니다.

OAS 객체는 이름이 선언된 고정 필드와 패턴이 선언된 패턴 필드 두 종류의 필드를 가집니다.

패턴 필드는 포함된 객체 내에서 이름이 고유해야 합니다(MUST).

참고: OpenAPI 설명은 YAML 또는 JSON 형식 모두로 API를 기술할 수 있으나, API 요청 및 응답 본문 등은 JSON 또는 YAML일 필요는 없습니다.

3.1 JSON 및 YAML 호환성

YAML과 JSON 형식 간 변환 가능성을 보존하기 위하여 RECOMMENDEDYAML version 1.2 및 [RFC9512] Section 3.4에 명시된 추가 제한사항을 권장합니다.

이전 명세서의 “JSON” 스키마 규칙 적용 권고는 이름과 달리 JSON에서 표현 불가한 일부 값을 포함할 수 있었습니다. OAD 작성자는 그런 JSON-호환 불가 YAML 값을 SHOULD NOT 의존해서는 안 됩니다.

3.2 대소문자 구분

OpenAPI 명세서의 대부분의 필드명과 값이 대소문자-구분이기 때문에, 본 문서는 대소문자-구분 없는 이름이나 값을 명시하려고 노력합니다. 다만, HTTP의 개념과 직접적으로 연결되는 필드명과 값은 본 문서에서 모든 개념을 따로 표기하지 않더라도 HTTP의 대소문자 구분 규칙을 따릅니다.

3.3 서식이 적용된 텍스트

명세서 전반에서 description 필드는 [CommonMark] 마크다운 형식을 지원한다고 명시되어 있습니다. OpenAPI 툴링에서 서식 있는 텍스트를 렌더링할 경우 최소한 [CommonMark-0.27]에서 설명한 마크다운 문법을 MUST 지원해야 합니다. 툴링은 MAY 보안 이슈 해소를 위해 일부 CommonMark 또는 확장 기능을 무시할 수 있습니다.

CommonMark 0.27이 최소 요구조건으로 설정됨에 따라, 툴링은 MAY 그 위에 확장 기능을 구현할 수 있습니다. 다만 그러한 확장 기능은 정의상 구현-정의이며 상호 운용성이 없으니, OpenAPI 설명 작성자는 기본 지원만 제공하는 도구로 확장 추가 마크다운을 렌더링하는 방식을 꼭 고려해야 합니다(SHOULD).

4. 객체 및 필드

이 섹션에서는 OpenAPI 설명 형식의 구조를 설명합니다. 이 내용이 형식에 대한 유일한 규범적 설명입니다. JSON 스키마는 정보용으로 spec.openapis.org에서 제공됩니다. 만약 JSON 스키마가 본 섹션과 다르다면, 반드시 (MUST) 이 섹션을 권위 있게 해석해야 합니다.

아래 설명에서 필드가 명시적으로 REQUIRED 또는 MUST, SHALL로 설명되지 않은 경우 OPTIONAL로 간주할 수 있습니다.

4.1 OpenAPI 객체

이 객체는 OpenAPI 설명의 루트 객체입니다.

4.1.1 고정 필드

필수 필드 외에도, components, paths, webhooks 중 적어도 하나의 필드가 반드시 (MUST) 존재해야 합니다.

필드 이름 타입 설명
openapi string REQUIRED. 이 문자열은 반드시 (MUST) OpenAPI 문서가 사용하는 OpenAPI 명세서 버전 번호여야 합니다. openapi 필드는 툴이 OpenAPI 문서를 해석할 때 사용해야 하며 (SHOULD), info.version 문자열과는 관련이 없습니다(이는 OpenAPI 문서의 버전을 설명합니다).
$self string 이 문자열은 반드시 (MUST) [RFC3986] Section 4.1에서 정의한 URI 참조 형식이어야 합니다. $self 필드는 이 문서의 자체 URI를 제공하며, [RFC3986] Section 5.1.1에 따라 기본 URI 역할도 합니다. 구현체는 반드시 (MUST) 이 필드가 존재할 때 정의된 URI를 사용하여 API 설명 URI 타겟을 식별하는 것을 지원해야 합니다. $self가 없거나 상대 URI일 때의 기본 URI 동작은 기본 URI 설정을 참조하고, $self로 참조를 해결하는 예시는 부록 F에서 확인할 수 있습니다.
info Info Object REQUIRED. API의 메타데이터를 제공합니다. 메타데이터는 필요한 경우 툴링에서 사용할 수 있습니다(MAY).
jsonSchemaDialect string 이 OAS 문서 내의 Schema Object에 포함된 $schema 키워드의 기본값입니다. 반드시 (MUST) URI 형식이어야 합니다.
servers [Server Object] 타겟 서버의 연결 정보를 제공하는 Server Object 배열입니다. servers 필드가 없거나 빈 배열이면 기본값은 Server Object 하나로 이루어진 배열이며, 그 url 값은 /입니다.
paths Paths Object API의 사용 가능한 경로와 작업(operations)을 나타냅니다.
webhooks Map[string, Path Item Object] API의 일부로 받을 수 있으며(MAY), API 소비자가 구현을 선택할 수 있는(MAY) 인커밍 웹훅 목록입니다. 이는 callbacks 기능과 밀접하게 관련되어 있으며, API 호출 이외의 요청(예: 밴드 외 등록 등)을 설명합니다. 키 이름은 각 웹훅을 참조하는 고유 문자열이며, (선택적으로 참조되는) Path Item Object는 API 제공자가 시작할 수 있는 요청과 예상 응답을 설명합니다. 예시도 제공됩니다.
components Components Object OpenAPI 설명을 위한 다양한 객체를 담는 요소입니다.
security [Security Requirement Object] API에서 사용할 수 있는 보안 매커니즘 선언입니다. 값 목록에는 사용할 수 있는 대체 Security Requirement Object들이 포함됩니다. 요청을 승인하기 위해서는 Security Requirement Object 중 하나만 만족하면 됩니다. 개별 작업(operation)은 이 정의를 재정의할 수 있습니다. 목록은 완전하지 않거나, 비어있거나, 없을 수 있습니다. 보안을 명시적으로 선택적으로 하려면, 빈 보안 요구({})를 배열에 포함할 수 있습니다.
tags [Tag Object] OpenAPI 설명에서 사용하는 태그 목록이며, 추가 메타데이터가 포함될 수 있습니다. 태그의 순서는 파싱 툴에서 그 순서를 반영할 수 있습니다. Operation Object에서 사용하는 모든 태그가 반드시 선언될 필요는 없습니다. 선언되지 않은 태그는 임의로 또는 툴의 논리에 따라 정렬될 수 있습니다(MAY). 목록의 각 태그 이름은 반드시 고유해야 합니다(MUST).
externalDocs External Documentation Object 추가적인 외부 문서입니다.

이 객체는 명세서 확장(Specification Extensions)으로 확장될 수 있습니다(MAY).

상호운용성을 보장하기 위해 참조는 $self 필드가 존재할 경우 반드시 (MUST) 타겟 문서의 $self URI를 사용해야 합니다. 구현체는 $self가 존재하더라도 리트리브 URI 등 다른 URI로 참조를 지원할 수 있습니다(MAY), 그러나 이 동작은 상호운용성이 없으며, 이에 의존하지 않는 것이 권장됩니다(NOT RECOMMENDED).

4.1.2 OpenAPI 설명 구조

OpenAPI 설명(OAD)은 API의 표면과 의미를 공식적으로 기술합니다. OAD는 단일 문서로 이루어질 수도 있고(MAY), 여러 문서가 URI 참조암시적 연결을 통해 서로 연결되는 형태일 수도 있습니다.

파싱 동작이 명확히 정의되기 위해 모든 OAD 문서는 반드시(MUST) 루트에 OpenAPI Object 또는 Schema Object가 있어야 하며, 반드시 전체 문서로 파싱되어야 합니다(아래 섹션에서 설명).

루트에 다른 Object이거나 OAD 내용과 다른 내용이 섞여 있는 문서는(MAY) 구현-정의 또는 정의되지 않은 동작을 할 수 있는데, 이는 부록 G: 파싱 및 해석 가이드에서 설명합니다. 명세 전반에서는, 특별히 명시하지 않는 한 루트에는 OpenAPI Object 또는 Schema Object가 있다고 가정합니다.

멀티 문서 OAD에서, 파싱이 시작되는 OpenAPI Object가 포함된 문서를 해당 OAD의 엔트리 문서라고 부릅니다. OAD 엔트리 문서는 openapi.json 또는 openapi.yaml로 이름을 짓는 것이 권장됩니다(RECOMMENDED).

OpenAPI Object는 다른 형식(임베딩 형식)에 내장될 수 있는데(MAY), 이는 JSON 스키마가 OAS에서 Schema Object로 내장되는 것과 유사합니다. 임베딩 형식은 내장된 내용을 어떻게 파싱할지 정의할 책임이 있으며, 임베딩 형식을 지원한다고 문서화되지 않은 OAS 구현체는 내장된 OAS 내용을 올바르게 파싱할 수 없습니다.

4.1.2.1 문서 파싱

OAD의 각 문서는 반드시(MUST) 참조 대상 탐지를 위해 완전히 파싱되어야 합니다. 이는 JSON Schema Specification Draft 2020-12의 파싱 요구사항을 포함하며, URI의 상대 참조에 관한 기본 URI에 대한 적절한 수정 사항을 적용해야 합니다. 참조 대상은 OpenAPI Object의 $self 필드, Schema Object$id, $anchor, $dynamicAnchor 키워드를 포함한 필드들로 정의됩니다.

구현체는 OAD의 가능한 일부로 제공된 모든 문서를 완전히 파싱하기 전에는 참조를 미해결 상태로 간주해서는 안 됩니다(MUST NOT).

참조를 해결할 때 문서의 해당 부분만 파싱하면 구현-정의 또는 정의되지 않은 동작이 나타날 수 있으며, 자세한 설명은 부분적 파싱에 대한 경고부록 G를 참고하세요.

4.1.2.2 API 설명 URI에서의 상대 참조

OpenAPI 설명 내에서 사용되는 참조 URI나 외부 문서, 라이선스와 같은 보조 정보 대상 URI들은 식별자로 해결되며, 본 명세에서는 URI로 설명됩니다(API URL과는 다릅니다). 일부 URI 필드는 역사적으로 url이라는 이름을 가졌지만, 설명 텍스트에는 올바른 "URI" 용어가 사용됩니다.

문서 파싱에서 언급했듯, 여러 필드들로 OpenAPI 문서 또는 Schema Object와 URI가 연결될 수 있으며, 이는 문서나 스키마의 실제 위치와 일치하지 않을 수 있습니다. 이렇게 하면 로컬 파일시스템, 제한된 네트워크 등 다양한 배포 환경에서 동일한 참조를 사용할 수 있게 됩니다.

달리 명시되지 않은 한, URI 필드는 모두 [RFC3986] Section 4.2에서 정의한 대로 상대 참조가 가능해야 합니다(MAY).

4.1.2.2.1 기본 URI 설정

상대 URI 참조는 반드시 (MUST) [RFC3986] Section 5.1.1~5.1.4 및, Schema Object의 경우 JSON Schema draft 2020-12 Section 8.2에 따라 적합한 기본 URI로 해결되어야 하며, 부록 F: 기본 URI 결정 및 참조 해석 예시의 예시를 참고하세요.

$self가 상대 URI 참조라면, 반드시 (MUST) [RFC3986] Section 5.1.2~5.1.4에서 다음 가능한 기본 URI 소스에 대해 먼저 해결한 후, 다른 상대 참조를 위한 해결에 사용해야 합니다.

OpenAPI Object의 $self나 Schema Object의 $id가 없거나 상대 URI일 때 가장 흔히 쓰이는 기본 URI 소스는 리트리브 URI입니다. 구현체가 문서 리트리브를 지원할 수 있지만(MAY), 자세한 사항은 보안 고려사항을 참조하세요. 리트리브가 지원되더라도, 네트워크 구성 및 서버 미존재(서버가 구 버전만 제공 등)로 인해 불가능할 수 있고, 성능 문제가 생길 수도 있습니다. 따라서 모든 구현체는 사용자가 원하는 리트리브 URI와 함께 문서를 제공하여 참조가 실제 리트리브처럼 해결되도록 반드시 허용하는 것이 바람직합니다(SHOULD).

4.1.2.2.2 URI 조각 해결

URI에 프래그먼트 식별자가 포함된 경우, 해당 프래그먼트는 참조된 문서의 프래그먼트 해석 방식에 따라 해결되어야 합니다. 참조된 문서가 JSON 또는 YAML 형식이면, 프래그먼트 식별자는 반드시(SHOULD) [RFC6901]의 JSON Pointer로 해석해야 합니다.

4.1.2.2.3 CommonMark 필드 내의 상대 URI 참조

CommonMark 하이퍼링크 내부의 상대 참조는 렌더링 컨텍스트에서 해결되며, 이는 API 설명의 컨텍스트와 다를 수 있습니다.

4.1.2.3 암시적 연결 해결

이 명세의 여러 기능은 URI를 기반으로 하지 않는 연결을 OAD 내의 다른 부분에 대해 해결해야 합니다.

단일 문서 OAD에서는 이러한 연결이 명확하게 해결되지만, 다중 문서 OAD에서의 해결 과정은 본 섹션에 설명된 제약 내에서 구현-정의입니다. 경우에 따라, URI 기반 대안이 명확하게 제공될 수 있으며, 상호 운용성을 최대화하려면 이 대안을 사용하는 것이 권장됩니다(RECOMMENDED).

참조(비엔트리) 문서에서 Components ObjectTag Object 이름을 해결할 때, 툴이 현재 문서가 아니라 엔트리 문서에서 해결하도록 하는 것이 권장됩니다(RECOMMENDED). Operation ObjectoperationId로 기반해 해결하려면 모든 문서에서 파싱된 Operation Object를 고려해야 합니다(RECOMMENDED).

암시적 연결 해석에서는 URI 해석 방식이나 타겟 범위가 절대적으로 변경되지 않습니다.

상세 내용 및 암시적 연결을 사용하는 객체와 필드 목록은 부록 G: 파싱 및 해석 가이드를 참조하세요.

4.2 정보 객체

이 객체는 API에 대한 메타데이터를 제공합니다. 메타데이터는 필요에 따라 클라이언트에서도 사용할 수 있으며(MAY), 편의를 위해 편집 또는 문서 생성 툴에서도 표시될 수 있습니다(MAY).

4.2.1 고정 필드

필드 이름 타입 설명
title string REQUIRED. API의 제목입니다.
summary string API의 간략한 요약입니다.
description string API의 설명입니다. [CommonMark] 문법을 사용해 풍부한 텍스트로 나타낼 수 있습니다(MAY).
termsOfService string API 서비스 약관(URI)입니다. 반드시 URI 형식이어야 합니다(MUST).
contact Contact Object API의 공개 연락처 정보입니다.
license License Object 공개 API의 라이선스 정보입니다.
version string REQUIRED. OpenAPI 문서의 버전(이는 OpenAPI 명세 버전이나, 기술되는 API의 버전 또는 OpenAPI 설명의 버전과 구별됨)입니다.

이 객체는 명세서 확장(Specification Extensions)으로 확장될 수 있습니다(MAY).

4.2.2 정보 객체 예시

title: 예제 반려동물 가게 
summary: 반려동물 가게 관리자.
description:  예시는 반려동물 가게용 서버입니다.
termsOfService: https://example.com/terms/
contact:
  name: API 지원
  url: https://www.example.com/support
  email: support@example.com
license:
  name: Apache 2.0
  url: https://www.apache.org/licenses/LICENSE-2.0.html
version: 1.0.1

4.3 연락처 객체

공개된 API의 연락처 정보입니다.

4.3.1 고정 필드

필드 이름 유형 설명
name string 연락처 개인/조직의 식별 이름입니다.
url string 연락처 정보의 URI입니다. 이 값은 반드시 (MUST) URI 형식이어야 합니다.
email string 연락처 개인/조직의 이메일 주소입니다. 이 값은 반드시 (MUST) 이메일 주소 형식이어야 합니다.

이 객체는 MAY 명세서 확장으로 확장될 수 있습니다.

4.3.2 연락처 객체 예시

name: API Support
url: https://www.example.com/support
email: support@example.com

4.4 라이선스 객체

공개된 API의 라이선스 정보입니다.

4.4.1 고정 필드

필드 이름 유형 설명
name string REQUIRED. API에 사용되는 라이선스 이름입니다.
identifier string API에 대한 [SPDX-Licenses] 표현입니다. identifier 필드는 url 필드와 상호 배타적입니다.
url string API에 사용되는 라이선스의 URI입니다. 이 값은 반드시 (MUST) URI 형식이어야 합니다. url 필드는 identifier 필드와 상호 배타적입니다.

이 객체는 MAY 명세서 확장으로 확장될 수 있습니다.

4.4.2 라이선스 객체 예시

name: Apache 2.0
identifier: Apache-2.0

4.5 서버 객체

서버를 나타내는 객체입니다.

4.5.1 고정 필드

필드 이름 유형 설명
url string REQUIRED. 대상 호스트의 URL입니다. 이 URL은 Server Variables를 지원하며, 서버 객체를 포함하는 문서가 제공되는 위치를 기준으로 호스트 위치가 상대적임을 나타내기 위해 상대적일 수 있습니다. 쿼리 및 프래그먼트는 이 URL의 일부가 되어서는 안 됩니다(MUST NOT). 변수 치환은 변수명이 {중괄호}로 표기될 때 수행됩니다.
description string URL이 지정하는 호스트를 설명하는 선택적 문자열입니다. [CommonMark] 문법을 사용하여 서식 있는 텍스트로 표현할 수 있습니다(MAY).
name string URL이 지정하는 호스트를 참조하기 위한 선택적 고유 문자열입니다.
variables Map[string, Server Variable Object] 변수 이름과 그 값 사이의 맵입니다. 값은 서버의 URL 템플릿에서 치환에 사용됩니다.

이 객체는 MAY 명세서 확장으로 확장될 수 있습니다.

4.5.2 API URL에서의 상대 참조

API 엔드포인트는 정의상 위치로 접근되며, 본 명세에서는 이를 URLs로 설명합니다.

달리 명시되지 않는 한, URL인 모든 필드는 [RFC3986] Section 4.2에 정의된 대로 상대 참조일 수 있습니다(MAY).

API는 OpenAPI 문서와 별개의 엔터티이므로, OpenAPI 문서에 대한 RFC3986의 기본 URI 규칙은 적용되지 않습니다. 달리 명시되지 않는 한, 상대 참조는 Server Object에 정의된 URL을 기본 URL로 사용하여 해결됩니다. 이 기본 URL들도 참조 문서에 대해 상대적일 수 있다는 점에 유의하세요(MAY).

4.5.2.1 API 기본 URL 결정 예시

다음 OpenAPI 문서의 검색 URI가 https://device1.example.com라고 가정합니다:

openapi: 3.2.0
$self: https://apidescriptions.example.com/foo
info:
  title: Example API
  version: 1.0
servers:
- url: .
  description: The production API on this device
- url: ./test
  description: The test API on this device

API URL의 경우 OpenAPI 문서를 식별하는 $self 필드는 무시되고 대신 검색 URI가 사용됩니다. 이로 인해 정규화된 프로덕션 URL은 https://device1.example.com이 되고, 정규화된 테스트 URL은 https://device1.example.com/test이 됩니다.

4.5.3 서버 객체 예시

단일 서버는 다음과 같이 기술됩니다:

url: https://development.gigantic-server.com/v1
description: Development server
name: dev

다음은 예를 들어 OpenAPI 객체의 servers에서 여러 서버를 기술하는 방법을 보여줍니다:

servers:
  - url: https://development.gigantic-server.com/v1
    description: Development server
    name: dev
  - url: https://staging.gigantic-server.com/v1
    description: Staging server
    name: staging
  - url: https://api.gigantic-server.com/v1
    description: Production server
    name: prod

다음은 서버 구성에서 변수를 사용하는 방법을 보여줍니다:

servers:
  - url: https://{username}.gigantic-server.com:{port}/{basePath}
    description: The production API server
    name: prod
    variables:
      username:
        # note! no enum here means it is an open value
        default: demo
        description: A user-specific subdomain. Use `demo` for a free sandbox environment.
      port:
        enum:
          - '8443'
          - '443'
        default: '8443'
      basePath:
        # open meaning there is the opportunity to use special base paths as assigned by the provider, default is "v2"
        default: v2

4.6 서버 변수 객체

서버 URL 템플릿 치환을 위한 서버 변수를 나타내는 객체입니다.

서버 URL 템플릿은 다음 [ABNF] 문법으로 정의됩니다.

server-url-template  = 1*( literals / server-variable )
server-variable      = "{" server-variable-name "}"
server-variable-name = 1*( %x00-7A / %x7C / %x7E-10FFFF ) ; every Unicode character except { and }

literals       = 1*( %x21 / %x23-24 / %x26-3B / %x3D / %x3F-5B
               / %x5D / %x5F / %x61-7A / %x7E / ucschar / iprivate
               / pct-encoded)
                    ; any Unicode character except: CTL, SP,
                    ;  DQUOTE, "%" (aside from pct-encoded),
                    ;  "<", ">", "\", "^", "`", "{", "|", "}"
pct-encoded    =  "%" HEXDIG HEXDIG
ucschar        =  %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF
               /  %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD
               /  %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD
               /  %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD
               /  %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD
               /  %xD0000-DFFFD / %xE1000-EFFFD
iprivate       =  %xE000-F8FF / %xF0000-FFFFD / %x100000-10FFFD

여기서 literals, pct-encoded, ucschariprivate 정의는 [RFC6570]에서 가져온 것이며, literals에 대한 수정 사항은 Errata 6937를 포함합니다.

각 서버 변수는 URL 템플릿에 두 번 이상 나타나서는 안 됩니다(MUST NOT).

전체 요청 URL 구성에 대한 안내는 경로 객체를 참조하세요.

4.6.1 고정 필드

필드 이름 유형 설명
enum [string] 치환 옵션이 제한된 집합인 경우 사용할 문자열 값들의 열거입니다. 이 배열은 비어 있어서는 안 됩니다(MUST NOT).
default string REQUIRED. 치환에 사용할 기본 값입니다. 대체 값이 제공되지 않으면 이 값이 전송되어야 합니다(SHALL). enum가 정의된 경우, 이 값은 반드시 열거값 중 하나여야 합니다(MUST). 이 동작은 데이터를 삽입하는 것이 아니라 수신자의 동작을 문서화하는 Schema Objectdefault 키워드와는 다릅니다.
description string 서버 변수에 대한 선택적 설명입니다. [CommonMark] 문법을 사용하여 서식 있는 텍스트로 표현할 수 있습니다(MAY).

이 객체는 MAY 명세서 확장으로 확장될 수 있습니다.

4.7 컴포넌트 객체

OAS의 여러 측면에 대한 재사용 가능한 객체 집합을 보관합니다. Components Object 내에 정의된 모든 객체는 Components Object 외부에서 명시적으로 참조되지 않는 한 API에 영향을 주지 않습니다.

4.7.1 고정 필드

필드 이름 유형 설명
schemas Map[string, 스키마 객체] 재사용 가능한 스키마 객체를 담는 객체입니다.
responses Map[string, 응답 객체 | 참조 객체] 재사용 가능한 응답 객체를 담는 객체입니다.
parameters Map[string, 파라미터 객체 | 참조 객체] 재사용 가능한 파라미터 객체를 담는 객체입니다.
examples Map[string, 예시 객체 | 참조 객체] 재사용 가능한 예시 객체를 담는 객체입니다.
requestBodies Map[string, 요청 본문 객체 | 참조 객체] 재사용 가능한 요청 본문 객체를 담는 객체입니다.
headers Map[string, 헤더 객체 | 참조 객체] 재사용 가능한 헤더 객체를 담는 객체입니다.
securitySchemes Map[string, 보안 스킴 객체 | 참조 객체] 재사용 가능한 보안 스킴 객체를 담는 객체입니다.
links Map[string, 링크 객체 | 참조 객체] 재사용 가능한 링크 객체를 담는 객체입니다.
callbacks Map[string, 콜백 객체 | 참조 객체] 재사용 가능한 콜백 객체를 담는 객체입니다.
pathItems Map[string, 경로 항목 객체] 재사용 가능한 경로 항목 객체를 담는 객체입니다.
mediaTypes Map[string, 미디어 타입 객체 | 참조 객체] 재사용 가능한 미디어 타입 객체를 담는 객체입니다.

이 객체는 MAY 명세서 확장으로 확장될 수 있습니다.

위에 선언된 모든 고정 필드는 키로 정규 표현식 ^[a-zA-Z0-9\.\-_]+$에 일치하는 이름을 사용해야 합니다(MUST).

필드 이름 예시:

User
User_1
User_Name
user-name
my.org.User

4.7.2 컴포넌트 객체 예시

components:
  schemas:
    GeneralError:
      type: object
      properties:
        code:
          type: integer
          format: int32
        message:
          type: string
    Category:
      type: object
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
    Tag:
      type: object
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
  parameters:
    skipParam:
      name: skip
      in: query
      description: number of items to skip
      required: true
      schema:
        type: integer
        format: int32
    limitParam:
      name: limit
      in: query
      description: max records to return
      required: true
      schema:
        type: integer
        format: int32
  responses:
    NotFound:
      description: Entity not found.
    IllegalInput:
      description: Illegal input for operation.
    GeneralError:
      description: General Error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/GeneralError'
  securitySchemes:
    api_key:
      type: apiKey
      name: api-key
      in: header
    petstore_auth:
      type: oauth2
      flows:
        implicit:
          authorizationUrl: https://example.org/api/oauth/dialog
          scopes:
            write:pets: modify pets in your account
            read:pets: read your pets

4.8 경로 객체

개별 엔드포인트와 그 오퍼레이션으로의 상대 경로를 보관합니다. 이 경로는 전체 URL을 구성하기 위해 Server Object의 URL에 추가됩니다. 보안 접근 제어 목록(Access Control List (ACL) 제약) 때문에 Paths Object는 MAY 비어 있을 수 있습니다.

4.8.1 패턴 필드

필드 패턴 유형 설명
/{path} Path Item Object 개별 엔드포인트로의 상대 경로입니다. 필드 이름은 반드시(MUST) 슬래시(/)로 시작해야 합니다. Server Objecturl 필드에서 얻은 URL은 해석되고 템플릿 변수가 치환된 다음, 전체 URL을 구성하기 위해 이 경로가 덧붙여집니다 (상대 URL 해석은 적용되지 않음). 경로 템플릿 사용이 허용됩니다. URL 매칭 시에는 구체적인(템플릿이 없는) 경로가 템플릿 경로보다 먼저 매칭됩니다. 동일한 계층 구조를 가지면서 템플릿 이름만 다른 템플릿 경로는 동일하므로 존재해서는 안 됩니다(MUST NOT). 모호한 매칭이 발생하는 경우 어떤 것을 사용할지는 툴링에 따라 결정됩니다.

이 객체는 MAY Specification Extensions로 확장될 수 있습니다.

4.8.2 경로 템플릿

경로 템플릿이란 중괄호({})로 구분된 템플릿 표현식을 사용하여 URL 경로의 일부를 경로 파라미터로 대체 가능하게 표시하는 것을 의미합니다.

경로 내의 각 템플릿 표현식은 Path Item 자체 및/또는 해당 Path Item의 각 Operation에 포함된 경로 파라미터에 대응해야 합니다(MUST). 단, 경로 항목이 ACL 제약 등으로 비어 있는 경우에는 매칭되는 경로 파라미터가 필요하지 않을 수 있습니다.

이러한 경로 파라미터의 값은 [RFC3986]의 Section 3에 설명된 "일반 문법" 문자를 이스케이프하지 않은 상태로 포함해서는 안 됩니다(MUST NOT). 즉 슬래시(/), 물음표(?), 해시(#) 등을 포함할 수 없습니다. 문자 이스케이프에 대한 추가 지침은 URL 퍼센트 인코딩을 참조하세요.

경로 템플릿은 다음의 [ABNF] 문법으로 정의됩니다

path-template                  = "/" *( path-segment "/" ) [ path-segment ]
path-segment                   = 1*( path-literal / template-expression )
path-literal                   = 1*pchar
template-expression            = "{" template-expression-param-name "}"
template-expression-param-name = 1*( %x00-7A / %x7C / %x7E-10FFFF ) ; every Unicode character except { and }

pchar               = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved          = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded         = "%" HEXDIG HEXDIG
sub-delims          = "!" / "$" / "&" / "'" / "(" / ")"
                    / "*" / "+" / "," / ";" / "="

여기서 pchar, unreserved, pct-encoded, sub-delims 정의는 [RFC3986]에서 가져온 것입니다. path-templateRFC 3986, section 3.3에서 직접 파생되었습니다.

각 템플릿 표현식은 단일 경로 템플릿 내에서 두 번 이상 나타나서는 안 됩니다(MUST NOT).

추가 지침은 부록 C: RFC6570 기반 직렬화 사용을 참조하세요.

4.8.2.1 경로 템플릿 매칭

다음 경로들을 가정하면, 구체적 정의인 /pets/mine가 사용될 경우 먼저 매칭됩니다:

  /pets/{petId}
  /pets/mine

다음 경로들은 동일하다고 간주되어 무효입니다:

  /pets/{petId}
  /pets/{name}

다음과 같은 경우 모호한 해석이 발생할 수 있습니다:

  /{entity}/me
  /books/{id}

4.8.3 경로 객체 예시

/pets:
  get:
    description: 사용자가 접근할 수 있는 시스템의 모든 반려동물을 반환합니다.
    responses:
      '200':
        description: 반려동물 목록입니다.
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/pet'

4.9 경로 항목 객체

단일 경로에서 사용할 수 있는 오퍼레이션을 설명합니다. Path Item은 접근 제어 목록(ACL 제약) 때문에 비어 있을 수 있습니다(MAY). 경로 자체는 문서 뷰어에 노출되지만 어떤 오퍼레이션과 파라미터가 사용 가능한지는 알 수 없게 됩니다.

4.9.1 고정 필드

필드 이름 유형 설명
$ref string 이 경로 항목의 참조 정의를 허용합니다. 값은 반드시(MUST) URI 형식이어야 하며, 참조된 구조는 반드시(MUST) Path Item Object 형식이어야 합니다. 정의된 객체와 참조된 객체 둘 다에 Path Item Object 필드가 나타나는 경우 동작은 정의되지 않습니다. 상대 참조 해석 규칙을 참조하세요.

참고: 향후 명세 버전에서는 인접한 속성과 함께 사용되는 $ref의 동작이 Reference Object의 동작과 더 일치하도록 변경될 가능성이 있습니다.
summary string 이 경로의 모든 오퍼레이션에 적용되는 선택적 요약 문자열입니다.
description string 이 경로의 모든 오퍼레이션에 적용되는 선택적 설명 문자열입니다. [CommonMark] 문법을 사용하여 서식 있는 텍스트로 표현할 수 있습니다(MAY).
get Operation Object 이 경로에 대한 GET 오퍼레이션 정의입니다.
put Operation Object 이 경로에 대한 PUT 오퍼레이션 정의입니다.
post Operation Object 이 경로에 대한 POST 오퍼레이션 정의입니다.
delete Operation Object 이 경로에 대한 DELETE 오퍼레이션 정의입니다.
options Operation Object 이 경로에 대한 OPTIONS 오퍼레이션 정의입니다.
head Operation Object 이 경로에 대한 HEAD 오퍼레이션 정의입니다.
patch Operation Object 이 경로에 대한 PATCH 오퍼레이션 정의입니다.
trace Operation Object 이 경로에 대한 TRACE 오퍼레이션 정의입니다.
query Operation Object 이 경로에 대한 QUERY 오퍼레이션 정의입니다. 이는 최신 IETF 초안(작성 시점의 draft-ietf-httpbis-safe-method-w-body-08 또는 그 RFC 후속 문서)에 정의된 바와 같습니다.
additionalOperations Map[string, Operation Object] 이 경로에 대한 추가 오퍼레이션의 맵입니다. 맵 키는 요청에서 전송될 HTTP 메서드이며 그 대/소문자를 그대로 사용합니다. 이 맵은 다른 고정 필드로 정의될 수 있는 메서드에 대한 항목을 포함해서는 안 됩니다(MUST NOT) (예: post 필드가 해당 메서드에 사용되므로 POST 항목을 포함하면 안 됨).
servers [Server Object] 이 경로의 모든 오퍼레이션을 서비스하기 위한 대체 servers 배열입니다. 만약 OpenAPI Object 수준에서 servers 배열이 지정되어 있으면, 이 값으로 대체됩니다.
parameters [Parameter Object | Reference Object] 이 경로 아래에 설명된 모든 오퍼레이션에 적용 가능한 파라미터 목록입니다. 이러한 파라미터는 오퍼레이션 수준에서 재정의할 수는 있지만 제거할 수는 없습니다. 목록은 중복 파라미터를 포함해서는 안 됩니다(MUST NOT). 고유한 파라미터는 이름위치의 조합으로 정의됩니다. 목록은 Reference Object를 사용하여 OpenAPI Object의 components.parameters에 정의된 파라미터를 참조할 수 있습니다.

이 객체는 MAY Specification Extensions로 확장될 수 있습니다.

4.9.2 경로 항목 객체 예시

get:
  description: ID에 따라 반려동물을 반환합니다.
  summary: ID로 반려동물 찾기
  operationId: getPetsById
  responses:
    '200':
      description: 반려동물 응답
      content:
        '*/*':
          schema:
            type: array
            items:
              $ref: '#/components/schemas/Pet'
    default:
      description: 오류 페이로드
      content:
        text/html:
          schema:
            $ref: '#/components/schemas/ErrorModel'
parameters:
  - name: id
    in: path
    description: 사용할 반려동물의 ID
    required: true
    schema:
      type: array
      items:
        type: string
    style: simple
additionalOperations:
  COPY:
    description: ID에 따라 반려동물 정보를 복사합니다.
    summary: ID로 반려동물 복사
    operationId: copyPetsById
    responses:
      '200':
        description: 반려동물 응답
        content:
          '*/*':
            schema:
              type: array
              items:
                $ref: '#/components/schemas/Pet'
      default:
        description: 오류 페이로드
        content:
          text/html:
            schema:
              $ref: '#/components/schemas/ErrorModel'

4.10 오퍼레이션 객체

경로에서의 단일 API 오퍼레이션을 설명합니다.

4.10.1 고정 필드

필드 이름 유형 설명
tags [string] API 문서 제어를 위한 태그 목록입니다. 태그는 리소스 또는 기타 분류자에 따라 오퍼레이션을 논리적으로 그룹화하는 데 사용될 수 있습니다.
summary string 오퍼레이션이 수행하는 작업에 대한 간단한 요약입니다.
description string 오퍼레이션 동작에 대한 자세한 설명입니다. [CommonMark] 문법을 사용하여 서식 있는 텍스트로 표현할 수 있습니다(MAY).
externalDocs External Documentation Object 이 오퍼레이션에 대한 추가 외부 문서입니다.
operationId string 오퍼레이션을 식별하는 고유 문자열입니다. 이 id는 API에 설명된 모든 오퍼레이션 사이에서 고유해야 합니다(MUST). operationId 값은 대/소문자 구분입니다. 툴과 라이브러리는 오퍼레이션을 고유하게 식별하기 위해 operationId를 사용할 수 있으므로 일반적인 프로그래밍 명명 규칙을 따르는 것이 권장됩니다(RECOMMENDED).
parameters [Parameter Object | Reference Object] 이 오퍼레이션에 적용되는 파라미터 목록입니다. 파라미터가 이미 Path Item에 정의되어 있으면 새 정의가 이를 재정의하지만 제거할 수는 없습니다. 목록은 중복 파라미터를 포함해서는 안 됩니다(MUST NOT). 고유한 파라미터는 이름위치의 조합으로 정의됩니다. 목록은 Reference Object를 사용하여 OpenAPI Object의 components.parameters에 정의된 파라미터를 링크할 수 있습니다.
requestBody Request Body Object | Reference Object 이 오퍼레이션에 적용되는 요청 본문입니다. requestBody는 HTTP 명세에서 요청 본문에 대해 명시적 의미가 정의된 HTTP 메서드에서 완전히 지원됩니다. 그 외의 경우(예: GET 및 DELETE와 같이 메시지 콘텐츠가 권장되지 않는 경우) requestBody 사용은 허용되지만 잘 정의된 의미가 없으므로 가능한 한 피하는 것이 좋습니다(SHOULD).
responses Responses Object 이 오퍼레이션을 실행한 결과로 반환될 가능성이 있는 응답 목록입니다.
callbacks Map[string, Callback Object | Reference Object] 부모 오퍼레이션과 관련된 잠재적 아웃오브밴드(callback)들의 맵입니다. 키는 Callback Object의 고유 식별자이며, 맵의 각 값은 API 제공자가 시작할 수 있는 요청과 예상 응답을 설명하는 Callback Object입니다.
deprecated boolean 이 오퍼레이션이 더 이상 권장되지 않음을 선언합니다. 소비자는 선언된 오퍼레이션의 사용을 자제해야 합니다(SHOULD). 기본값은 false입니다.
security [Security Requirement Object] 이 오퍼레이션에 사용할 수 있는 보안 메커니즘을 선언합니다. 값 목록에는 사용할 수 있는 대체 Security Requirement Object들이 포함됩니다. 요청을 승인하려면 Security Requirement Object 중 하나만 충족하면 됩니다. 보안을 선택적으로 만들려면 배열에 빈 보안 요구({})를 포함할 수 있습니다. 이 정의는 상위 수준의 security를 재정의합니다. 상위 수준의 보안 선언을 제거하려면 빈 배열을 사용할 수 있습니다.
servers [Server Object] 이 오퍼레이션을 서비스하기 위한 대체 servers 배열입니다. Path Item ObjectOpenAPI Object 수준에서 servers 배열이 지정되어 있으면, 이 값으로 대체됩니다.

이 객체는 MAY Specification Extensions로 확장될 수 있습니다.

4.10.2 오퍼레이션 객체 예시

tags:
  - pet
summary: 폼 데이터를 사용하여 저장소의 반려동물을 업데이트합니다.
operationId: updatePetWithForm
parameters:
  - name: petId
    in: path
    description: 업데이트할 반려동물의 ID
    required: true
    schema:
      type: string
requestBody:
  content:
    application/x-www-form-urlencoded:
      schema:
        type: object
        properties:
          name:
            description: 업데이트할 반려동물의 이름
            type: string
          status:
            description: 업데이트할 반려동물의 상태
            type: string
        required:
          - status
responses:
  '200':
    description: 반려동물이 업데이트되었습니다.
    content:
      application/json: {}
      application/xml: {}
  '405':
    description: 허용되지 않는 메서드
    content:
      application/json: {}
      application/xml: {}
security:
  - petstore_auth:
      - write:pets
      - read:pets

4.11 외부 문서 객체

확장된 문서화를 위해 외부 리소스를 참조할 수 있게 합니다.

4.11.1 고정 필드

Field Name Type Description
description string 대상 문서에 대한 설명입니다. [CommonMark] 문법을 사용하여 서식 있는 텍스트로 표현할 수 있습니다(MAY).
url string REQUIRED. 대상 문서의 URI입니다. 이 값은 반드시 (MUST) URI 형식이어야 합니다.

이 객체는 MAY Specification Extensions로 확장될 수 있습니다.

4.11.2 외부 문서 객체 예시

description: Find more info here
url: https://example.com

4.12 파라미터 객체

단일 오퍼레이션 파라미터를 설명합니다.

고유한 파라미터는 namelocation의 조합으로 정의됩니다.

퍼센트 인코딩 관련 세부 사항(및 application/x-www-form-urlencoded 쿼리 문자열 형식과의 상호 작용)에 관해서는 부록 E를 참조하세요.

4.12.1 파라미터 위치

in 필드로 지정할 수 있는 파라미터 위치는 다섯 가지입니다:

  • path - Path Templating과 함께 사용되며, 파라미터 값은 실제로 오퍼레이션의 URL의 일부입니다. 여기에는 API의 호스트나 기본 경로는 포함되지 않습니다. 예를 들어 /items/{itemId}에서 경로 파라미터는 itemId입니다.
  • query - URL에 추가되는 파라미터입니다. 예: /items?id=###에서 쿼리 파라미터는 id입니다; MUST NOT 같은 오퍼레이션(또는 해당 오퍼레이션의 path-item)에 in: "querystring" 파라미터와 함께 나타나서는 안 됩니다.
  • querystring - 전체 URL 쿼리 문자열을 값으로 취급하는 파라미터로, content 필드를 사용하여 지정해야 하며, 보통 미디어 타입 application/x-www-form-urlencoded와 함께 Encoding Objects를 사용하여 요청 본문과 동일한 방식으로 처리됩니다; MUST NOT 여러 번 나타나서는 안 되며, 어떤 경우에도 동일 오퍼레이션(또는 해당 오퍼레이션의 path-item)에 있는 in: "query" 파라미터와 함께 나타나서는 안 됩니다.
  • header - 요청의 일부로 예상되는 커스텀 헤더입니다. [RFC9110] Section 5.1에 따르면 헤더 이름은 대소문자 구분이 없습니다.
  • cookie - 특정 쿠키 값을 API로 전달하는 데 사용됩니다.

4.12.2 고정 필드

파라미터 직렬화 규칙은 두 가지 방식 중 하나로 지정됩니다. Parameter Objects는 content 필드 또는 schema 필드 중 하나를 반드시 포함해야 하며, 둘을 동시에 가질 수 없습니다(MUST). 다양한 타입의 값을 문자열 표현으로 변환하는 것에 관해서는 부록 B를 참고하세요.

4.12.2.1 공통 고정 필드

이들 필드는 content 또는 schema와 함께 모두 사용할 수 있습니다(MAY).

exampleexamples 필드는 상호 배타적입니다; 검증 요구사항에 대한 지침은 Working with Examples를 참조하세요.

Field Name Type Description
name string REQUIRED. 파라미터의 이름입니다. 파라미터 이름은 대소문자 구분됩니다.
  • If in is "path", the name field MUST correspond to a single template expression occurring within the path field in the Paths Object. See Path Templating for further information.
  • If in is "header" and the name field is "Accept", "Content-Type" or "Authorization", the parameter definition SHALL be ignored.
  • If in is "querystring", or for certain combinations of style and explode, the value of name is not used in the parameter serialization.
  • For all other cases, the name corresponds to the parameter name used by the in field.
in string REQUIRED. 파라미터의 위치입니다. 가능한 값은 "query", "querystring", "header", "path" 또는 "cookie"입니다.
description string 파라미터에 대한 간단한 설명입니다. 사용 예시를 포함할 수 있습니다. [CommonMark] 문법을 사용하여 서식 있는 텍스트로 표현할 수 있습니다(MAY).
required boolean 이 파라미터가 필수인지 여부를 결정합니다. 파라미터 위치가 path인 경우 이 필드는 REQUIRED이며 그 값은 반드시(MUST) true여야 합니다. 그렇지 않은 경우 이 필드는 포함될 수 있으며 기본값은 false입니다.
deprecated boolean 파라미터가 더 이상 권장되지 않음을 지정하며, 사용 중단 전환을 권장합니다(SHOULD). 기본값은 false입니다.
allowEmptyValue boolean 값이 true인 경우, 클라이언트는 생략될 수 있는 파라미터 대신 길이 0의 문자열을 전달할 수 있으며, 서버는 이를 파라미터가 사용되지 않은 것으로 해석해야 합니다(SHOULD). 기본값은 false입니다. 만약 style가 사용되고, 직렬화가 불가능한 경우라면 allowEmptyValue의 값은 무시되어야 합니다(SHALL). 이 필드와 파라미터의 Schema Object 간의 상호작용은 구현-정의입니다. 이 필드는 query 파라미터에만 유효합니다.

Deprecated: 이 필드의 사용은 권장되지 않습니다(NOT RECOMMENDED)이며 향후 개정에서 제거될 가능성이 높습니다.
example Any 파라미터의 예시 값; Working With Examples를 참조하세요.
examples Map[ string, Example Object | Reference Object] 파라미터의 예시 값들; Working With Examples를 참조하세요.

이 객체는 MAY Specification Extensions로 확장될 수 있습니다.

참고: "Cookie"name으로 사용하면서 in"header"인 것은 금지되지 않지만, 그렇게 정의된 쿠키 파라미터의 효과는 정의되지 않습니다; 대신 in: "cookie"를 사용하세요.

4.12.2.2 schema 와 함께 사용하는 고정 필드

단순한 시나리오의 경우, schemastyle로 파라미터의 구조와 문법을 설명할 수 있습니다.

이 필드들은 in: "querystring"와 함께 사용해서는 안 됩니다(MUST NOT).

in: "header" 또는 in: "cookie", style: "cookie"schema가 있는 파라미터의 경우 주의가 필요합니다:

  • 이 값들을 직렬화할 때 URI 퍼센트 인코딩을 적용해서는 안 됩니다(MUST NOT).
  • 이 파라미터를 파싱할 때 보이는 퍼센트 인코딩을 디코드해서는 안 됩니다(MUST NOT).
  • 자동으로 인코딩/디코딩 단계를 수행하는 RFC6570 구현을 사용하는 경우, 사용 전 그 단계를 되돌려야 합니다(MUST).

이런 경우 구현체는 값을 변경하거나 인용/이스케이프하려고 시도하기보다는 있는 그대로 전달해야 합니다(MUST), 헤더의 인용 규칙과 쿠키의 이스케이프 관례가 매우 다양하기 때문입니다. 인용 및 이스케이프에 대한 안내는 부록 D를 참조하세요.

Field Name Type Description
style string 파라미터 값의 타입에 따라 값이 어떻게 직렬화되는지를 설명합니다. in의 값에 따른 기본값: "query"의 경우 "form", "path"의 경우 "simple", "header"의 경우 "simple", "cookie"의 경우 "form"입니다(호환성 이유로; in: "cookie"와 함께 style: "cookie" 사용을 권장합니다; 자세한 내용은 부록 D 참조).
explode boolean 이 값이 true이면 array 또는 object 타입의 파라미터 값은 배열의 각 값이나 맵의 각 키-값 쌍에 대해 별도의 파라미터를 생성합니다. 다른 타입의 파라미터나 style"deepObject"인 경우에는 이 필드가 영향을 미치지 않습니다. style"form" 또는 "cookie"인 경우 기본값은 true입니다. 다른 스타일의 기본값은 false입니다.
allowReserved boolean 이 값이 true이면 파라미터 값은 RFC6570의 예약 확장(reserved expansion)을 사용하여 직렬화됩니다([RFC6570] 참조), 이는 RFC3986의 예약 문자 집합과 퍼센트 인코딩된 3문자 시퀀스가 그대로 통과되도록 허용합니다. 기본값은 false입니다. 이 필드는 자동으로 퍼센트 인코딩을 수행하는 instyle 조합에만 적용됩니다.
schema Schema Object 파라미터에 사용되는 타입을 정의하는 스키마입니다.

추가 지침은 부록 C: RFC6570 기반 직렬화 사용을 참조하세요.

4.12.2.3 content 와 함께 사용하는 고정 필드

보다 복잡한 시나리오에서는 content 필드가 파라미터의 미디어 타입과 스키마를 정의하고 사용 예시를 제공할 수 있습니다.

in: "querystring"application/x-www-form-urlencoded와 함께 사용할 때는 Encoding the x-www-form-urlencoded Media Type를 참조하세요.

Field Name Type Description
content Map[string, Media Type Object | Reference Object] 파라미터에 대한 표현(representations)을 포함하는 맵입니다. 키는 미디어 타입이고 값이 그것을 설명합니다. 맵은 항목을 하나만 포함해야 합니다(MUST).

4.12.3 스타일 값

단순 파라미터를 직렬화하는 일반적인 방식을 지원하기 위해 일련의 style 값들이 정의되어 있습니다. 이 표에 나타나지 않은 조합은 허용되지 않습니다.

style type in Comments
matrix primitive, array, object path Path 스타일 파라미터는 [RFC6570] Section 3.2.7에 정의되어 있습니다.
label primitive, array, object path Label 스타일 파라미터는 [RFC6570] Section 3.2.5에 정의되어 있습니다.
simple primitive, array, object path, header Simple 스타일 파라미터는 [RFC6570] Section 3.2.2에 정의되어 있습니다. 이 옵션은 OpenAPI 2.0의 collectionFormat을 대체하여 csv 값을 사용합니다.
form primitive, array, object query, cookie Form 스타일 파라미터는 [RFC6570] Section 3.2.8에 정의되어 있습니다. 이 옵션은 OpenAPI 2.0의 collectionFormat을 대체합니다( explode가 false일 때 csv, true일 때 multi).
spaceDelimited array, object query 공백으로 구분된 배열 값 또는 객체 속성/값. OpenAPI 2.0의 collectionFormat=ssv를 대체합니다.
pipeDelimited array, object query 파이프(|)로 구분된 배열 값 또는 객체 속성/값. OpenAPI 2.0의 collectionFormat=pipes를 대체합니다.
deepObject object query 스칼라 속성을 가진 객체를 폼 파라미터를 사용해 표현할 수 있게 합니다. 배열 또는 객체 속성의 표현은 정의되어 있지 않습니다(대안은 쿼리스트링 형식 지원 확장 참조).
cookie primitive, array, object cookie form과 유사하지만 [RFC6265]의 Cookie 문법 규칙을 따릅니다(예: name-value 쌍은 세미콜론과 단일 공백으로 구분됨). 퍼센트 인코딩이나 다른 이스케이프는 적용되지 않으며, 이스케이프가 필요한 데이터 값은 미리 이스케이프되어 제공되어야 합니다(MUST).

4.12.4 URL 퍼센트 인코딩

모든 API URL은 [RFC3986] 규칙을 사용하여 성공적으로 파싱되고 퍼센트-디코드되어야 합니다(MUST).

application/x-www-form-urlencoded 형식의 콘텐츠(예: Parameter Objectsin: "query"로 생성하는 쿼리 문자열 포함)는 [WHATWG-URL] 규칙을 사용하여 성공적으로 파싱되고 퍼센트-디코드되어야 합니다(MUST), 이때 비퍼센트 인코딩된 +는 공백으로 처리됩니다.

이 요구사항들은 퍼센트-디코딩 규칙 관점에서 명세되며, 이는 관련 표준 버전들 간에 일관되게 관용적입니다.

퍼센트-인코딩은 여러 곳에서 수행됩니다:

  • RFC6570 구현(또는 그 시뮬레이션)에 의해
  • Media Type Object로 직렬화된 값을 통합할 때 Parameter 또는 Encoding Objects에 의해
  • 사용자가 RFC6570의 예약 확장 프로세스에 데이터를 전달하기 전에

퍼센트 인코딩 시 가장 안전한 방법은 RFC3986의 "unreserved" 집합에 속하지 않는 모든 문자를 인코딩하는 것이며, form-urlencoded의 경우 역사적 요구사항과의 정렬을 위해 물결표(~)도 인코딩하는 것이 권장됩니다. 본 명세의 예시에서 이 접근법을 사용합니다.

form-urlencoded에서는 [WHATWG-URL]가 공백을 +로 인코딩하도록 요구하지만, %20로 인코딩하는 것도 위 요건을 충족합니다. 본 명세의 예시에서는 RFC6570의 기본(non-reserved) 폼 스타일 확장을 사용할 때는 %20을 선호하고, 그렇지 않은 경우에는 +를 사용합니다.

예약 문자는 MUST NOT 퍼센트 인코딩되어서는 안 됩니다(예: &=+form-urlencoded에서 구분자 용도로 사용). 수동 퍼센트 인코딩을 통해 데이터에 비퍼센트 인코딩 구분자를 삽입하면 구현체가 결과를 올바르게 파싱하지 못할 수 있으며 그 결과는 정의되지 않습니다. 일부 경우(예: 경로 파라미터 값에 / 삽입)는 본 명세에 의해 명시적으로 금지됩니다.

또한 참조:

  • 부록 C — RFC6570 구현 사용 또는 시뮬레이션/확장에 대한 안내
  • 부록 D — 퍼센트 인코딩과 쿠키 및 헤더/쿠키에 대한 다른 이스케이프 접근법
  • 부록 E — 퍼센트 인코딩 옵션, 호환성 및 OAS가 정의한 구분자 처리에 대한 심층 논의

4.12.5 직렬화 및 예시

이 섹션의 규칙은 Parameter 및 Header Objects 모두에 적용됩니다. 두 객체는 동일한 메커니즘을 사용합니다.

Example ObjectserializedValue 또는 externalValue 필드와 같이 직렬화된 예시를 표시할 때, 대부분의 경우 표시할 값은 관련 퍼센트 인코딩 또는 다른 인코딩/이스케이프가 적용된 값 자체이며, styleexplode 구성에 의해 생성된 모든 구분자도 포함됩니다.

이름이 직렬화 구성의 고유한 일부인 경우(예: style: "form"으로 생성되는 name=value 쌍 또는 style: "simple", explode: true 조합), 이름과 이름-값 사이의 구분자는 반드시 포함되어야 합니다(MUST).

matrixlabel 스타일은 항상 선행 구분자를 생성하며, 이는 직렬화의 유효한 부분이므로 반드시 포함되어야 합니다(MUST). style: "form"에 해당하는 RFC6570 연산자는 사용된 정확한 문법에 따라 선행 구분자를 ? 또는 &로 생성할 수 있습니다. 선행 구분자는 쿼리 문자열에서 파라미터가 발생하는 위치 및 URI 또는 application/x-www-form-urlencoded 콘텐츠 여부에 따라 적합성이 달라지므로, 개별 파라미터 또는 미디어 타입 문서의 예시에서는 이 선행 구분자를 포함해서는 안 됩니다(MUST NOT).

in: "cookie", style: "form"의 경우 &? 구분자는 절대 올바르지 않습니다. 자세한 내용은 부록 D: 헤더 및 쿠키 직렬화를 참조하세요.

헤더의 경우 직렬화의 일부로 헤더 이름을 포함해서는 안 됩니다(MUST NOT), 이는 RFC6570 유래 결과의 일부가 아니기 때문입니다. 다만 style: "simple", explode: "true"로 생성된 이름은 별도의 헤더로서가 아니라 헤더 값 내에 나타나는 형태로 포함됩니다. Set-Cookie 응답 헤더의 예시 표시를 위한 특수 규칙은 Header Object를 참조하세요.

4.12.6 스타일 예시

예를 들어 color라는 파라미터가 다음 값 중 하나를 가지는 경우, 오른쪽의 값이 Example Object의 dataValue 필드에 표시되는 값입니다:

   string -> "blue"
   array -> ["blue", "black", "brown"]
   object -> { "R": 100, "G": 200, "B": 150 }

다음 표는 Example Object의 serializedValue 필드에 표시되는 것과 같은 다양한 직렬화 예시를 보여줍니다.

  • empty는 빈 문자열을 의미하며, allowEmptyValue 필드와는 관련이 없습니다.
  • n/a로 표시된 조합의 동작은 정의되지 않습니다.
  • 이전 버전의 명세에서 empty 열을 대체한 undefined 열은 [RFC6570]의 용어와 더 잘 정렬되도록 변경된 것입니다.
  • form 및 RFC6570이 아닌 쿼리 문자열 스타일인 spaceDelimited, pipeDelimited, deepObject의 경우 여러 파라미터로부터 쿼리 문자열을 구성하는 방법에 대해서는 부록 C를, formcookie 파라미터에 대한 경고는 부록 D를 참조하세요.
  • 예시들은 위의 URL Percent-Encoding 섹션에 설명된 대로 퍼센트 인코딩되어 있습니다; 퍼센트 인코딩 문제에 대한 자세한 논의는 부록 E를 확인하세요.
style explode undefined string array object
matrix false ;color ;color=blue ;color=blue,black,brown ;color=R,100,G,200,B,150
matrix true ;color ;color=blue ;color=blue;color=black;color=brown ;R=100;G=200;B=150
label false . .blue .blue,black,brown .R,100,G,200,B,150
label true . .blue .blue.black.brown .R=100.G=200.B=150
simple false empty blue blue,black,brown R,100,G,200,B,150
simple true empty blue blue,black,brown R=100,G=200,B=150
form false color= color=blue color=blue,black,brown color=R,100,G,200,B,150
form true color= color=blue color=blue&color=black&color=brown R=100&G=200&B=150
spaceDelimited false n/a n/a color=blue%20black%20brown color=R%20100%20G%20200%20B%20150
spaceDelimited true n/a n/a n/a n/a
pipeDelimited false n/a n/a color=blue%7Cblack%7Cbrown color=R%7C100%7CG%7C200%7CB%7C150
pipeDelimited true n/a n/a n/a n/a
deepObject n/a n/a n/a n/a color%5BR%5D=100&color%5BG%5D=200&color%5BB%5D=150
cookie false color= color=blue color=blue,black,brown color=R,100,G,200,B,150
cookie true color= color=blue color=blue; color=black; color=brown R=100; G=200; B=150

4.12.7 쿼리스트링 형식 지원 확장

많은 프레임워크가 파라미터 이름에 배열 인덱스를 첨부하거나 중첩 객체의 여러 수준을 표시하는 등 복잡한 값에 대한 쿼리 문자열 구문을 정의합니다. 이러한 방식은 deepObject의 능력을 넘어서는 경우가 많습니다.

이들은 표준이 아니며 서로 충돌하는 경우가 많기 때문에 OAS는 직접적으로 이들을 지원하려고 하지 않습니다. in: "querystring"에 대해 이러한 형식을 지원하는 두 가지 방법은 다음과 같습니다:

  • contenttext/plain을 사용하고 스키마로 type: "string"을 지정하여 OpenAPI 외부에서 형식을 정의합니다. OpenAPI 관점에서는 이 형식이 단순 문자열로 보이므로 문서화 및 구성/파싱에 더 많은 작업이 필요하지만 가장 유연한 옵션입니다.
  • 미디어 타입(반드시 IANA에 등록될 필요는 없음)과 메모리 내 데이터를 직렬화된 미디어 타입으로 매핑하는 프로세스를 정의합니다. 복수 툴에서의 지원 가능성을 높이려면 해당 미디어 타입 및 프로세스를 OpenAPI Initiative의 미디어 타입 레지스트리에 등록 제출하는 것을 고려하세요.

4.12.8 파라미터 객체 예시

64비트 정수 배열을 가지는 헤더 파라미터 예시:

name: X-Token
in: header
description: token to be passed as a header
required: true
schema:
  type: array
  items:
    type: integer
    format: int64
style: simple
examples:
  Tokens:
    dataValue:
      - 12345678
      - 90099
    serializedValue: "12345678,90099"

폭발된 객체(기본값: style: "cookie")를 가지는 쿠키 파라미터 예시:

name: cookie
in: cookie
style: cookie
schema:
  type: object
  properties:
    greeting:
      type: string
    code:
      type: integer
      minimum: 0
examples:
  Object:
    description: |
        Note that the comma (,) has been pre-percent-encoded
        to "%2C" in the data, as it is forbidden in
        cookie values.  However, the exclamation point (!)
        is legal in cookies, so it can be left unencoded.
    dataValue:
      greeting: Hello%2C world!
      code: 42
    serializedValue: "greeting=Hello%2C world!; code=42"

이후의 예시들도 모두 원문 코드 블록 그대로 유지되어 있습니다.

4.13 요청 본문 객체

단일 요청 본문을 설명합니다.

4.13.1 고정 필드

Field Name Type Description
description string 요청 본문에 대한 간단한 설명입니다. 사용 예시를 포함할 수 있습니다. [CommonMark] 문법을 서식 있는 텍스트 표현에 MAY 사용할 수 있습니다.
content Map[string, Media Type Object | Reference Object] REQUIRED. 요청 본문의 콘텐츠입니다. 키는 미디어 타입 또는 media type range이며 값이 해당 타입을 설명합니다. 이 맵은 최소한 하나의 항목을 포함하는 것이 SHOULD 권장됩니다; 항목이 없으면 동작은 구현-정의입니다. 여러 키에 매치되는 요청의 경우 가장 구체적인 키만 적용됩니다. 예: "text/plain""text/*"를 덮어씁니다.
required boolean 요청에 요청 본문이 필수인지 여부를 결정합니다. 기본값은 false입니다.

이 객체는 MAY Specification Extensions로 확장될 수 있습니다.

4.13.2 요청 본문 예시

참조된 스키마 정의를 가진 요청 본문 예시입니다.

description: user to add to the system
content:
  application/json:
    schema:
      $ref: '#/components/schemas/User'
    examples:
      user:
        summary: User example
        externalValue: https://foo.bar/examples/user-example.json
  application/xml:
    schema:
      $ref: '#/components/schemas/User'
    examples:
      user:
        summary: User example in XML
        externalValue: https://foo.bar/examples/user-example.xml
  text/plain:
    examples:
      user:
        summary: User example in plain text
        externalValue: https://foo.bar/examples/user-example.txt
  '*/*':
    examples:
      user:
        summary: User example in other format
        externalValue: https://foo.bar/examples/user-example.whatever

4.14 미디어 타입 객체

각 Media Type Object는 해당 키로 식별되는 미디어 타입에 따라 구조화된 콘텐츠를 설명합니다. 여러 Media Type Object는 여러 다른 미디어 타입 중 어느 하나로 나타날 수 있는 콘텐츠를 설명하는 데 사용될 수 있습니다.

example 또는 examples가 제공된 경우, 예시는 지정된 schema와 일치하고 미디어 타입 및 그 인코딩에서 요구하는 올바른 형식이어야 합니다(SHOULD). exampleexamples 필드는 상호 배타적입니다. 비-JSON/YAML 값을 포함한 다양한 예시 지정 방식에 대한 추가 안내는 Working With Examples를 참조하세요.

4.14.1 고정 필드

Field Name Type Description
schema Schema Object 요청, 응답, 파라미터 또는 헤더의 전체 콘텐츠를 설명하는 스키마입니다.
itemSchema Schema Object 연속적 미디어 타입 내의 각 항목을 설명하는 스키마입니다.
example Any 미디어 타입의 예시입니다; Working With Examples 참조.
examples Map[ string, Example Object | Reference Object] 미디어 타입의 예시들입니다; Working With Examples 참조.
encoding Map[string, Encoding Object] 속성 이름과 해당 인코딩 정보를 매핑한 맵입니다(자세한 내용은 Encoding By Name 참조). encoding 필드는 미디어 타입이 multipart 또는 application/x-www-form-urlencoded인 경우에만 적용되어야 합니다(SHALL). 특정 속성에 대해 Encoding Object가 제공되지 않으면 기본값 문서에 명시된 동작이 적용됩니다. 이 필드는 prefixEncoding 또는 itemEncoding가 존재하면 포함되어서는 안 됩니다(MUST NOT).
prefixEncoding [Encoding Object] 위치 기반 인코딩 정보를 배열로 제공하는 필드입니다(자세한 내용은 Encoding By Position 참조). prefixEncoding는 미디어 타입이 multipart일 때만 적용되어야 합니다(SHALL). 특정 속성에 대해 Encoding Object가 제공되지 않으면 기본값 문서에 명시된 동작이 적용됩니다. 이 필드는 encoding이 존재하면 포함되어서는 안 됩니다(MUST NOT).
itemEncoding Encoding Object 여러 배열 항목에 대해 인코딩 정보를 제공하는 단일 Encoding Object입니다(자세한 내용은 Encoding By Position 참조). itemEncoding는 미디어 타입이 multipart일 때만 적용되어야 합니다(SHALL). 특정 속성에 대해 Encoding Object가 제공되지 않으면 기본값 문서에 명시된 동작이 적용됩니다. 이 필드는 encoding이 존재하면 포함되어서는 안 됩니다(MUST NOT).

이 객체는 MAY Specification Extensions로 확장될 수 있습니다.

4.14.2 미디어 타입

미디어 타입은 IANA 미디어 타입 레지스트리(IANA media types registry)에 공개적으로 등록됩니다(등록 절차는 [RFC6838]에 문서화되어 있습니다).

API는 가끔 GitHub의 application/vnd.github.v3+json과 같은 비공개 미디어 타입을 정의하거나, application/schema+json처럼 등록 전에 널리 사용되는 타입을 정의하기도 합니다.

다양한 미디어 타입과 함께 스키마를 사용하는 방법에 대한 지침은 Parsing and Serializing (해당 Schema Object 섹션)을 참조하세요.

4.14.2.1 OpenAPI 미디어 타입 레지스트리

OpenAPI Initiative는 이 명세에서 기대되는 미디어 타입 지원을 요약하고 각 미디어 타입과 연관된 섹션을 색인화하는 Media Type Registry를 운영합니다. 또한 IANA 등록(존재하는 경우) 및 각 미디어 타입과 관련된 주요 명세 문서들을 연결합니다. 이 레지스트리에 추가된 미디어 타입(확장 또는 이후 버전의 OpenAPI 명세에 추가된 것)은 이 버전의 OAS 구현체에서 MAY 지원될 수 있습니다.

4.14.3 완전 콘텐츠 vs 스트리밍 콘텐츠

schema 필드는 미디어 타입과 문맥(Request Body Object, Response Object, Parameter Object, 또는 Header Object)에 의해 정의된 전체 콘텐츠에 적용되어야 합니다(MUST). 이는 콘텐츠를 전체 메모리에 로드해야 함을 의미하므로 스트리밍 콘텐츠에 도전과제를 제기합니다. 클라이언트가 언제 읽기를 멈출지 선택하게 하는 사용 사례는 스트림의 명확한 종료가 없기 때문에 특히 까다롭습니다.

4.14.3.1 순차 미디어 타입

본 명세에서 연속적 미디어 타입(sequential media type)은 헤더, 푸터, 엔벨로프 또는 시퀀스 외의 메타데이터 없이 반복 구조로만 구성되는 모든 미디어 타입으로 정의됩니다.

다음은 연속적 미디어 타입의 예시들입니다(일부는 IANA에 등록되지 않았지만 일반적으로 사용됨):

  application/jsonl
  application/x-ndjson
  application/json-seq
  application/geo+json-seq
  text/event-stream
  multipart/mixed

위의 처음 세 가지에서는 반복 구조가 어떤 JSON 값이 됩니다. 네 번째는 application/geo+json 구조화 값을 반복하고, text/event-stream은 Server-Sent Events와 관련된 커스텀 텍스트 포맷을 반복합니다. 마지막으로 multipart/mixed는 모든 미디어 타입의 문서들을 순서대로 나열하며 때로 스트리밍됩니다. multipart 형식은 기술적으로 서문(preamble)과 후문(epilogue)을 허용하지만 RFC는 이를 무시하도록 지시하므로 본 명세는 이를 모델링하지 않습니다.

구현체는 연속적 미디어 타입을 JSON Schema 데이터 모델로 매핑할 때 값들을 동일한 순서의 배열로 간주하여 매핑을 지원해야 합니다(MUST).

스트리밍 컨텍스트에서 연속적 미디어 타입을 처리하는 방법에 대한 자세한 내용(특히 text/event-stream에 대한 특별 고려사항)은 Complete vs Streaming Content를 참고하세요. multipart 타입의 경우 Encoding By Position도 참고하세요.

4.14.3.1.1 스트리밍 순차 미디어 타입

itemSchema 필드는 연속적 미디어 타입의 스트리밍 사용 사례를 지원하기 위해 제공되며, 스트리밍 위치 기반 multipart 미디어 타입의 인코딩 메커니즘으로 itemEncoding를 제공합니다.

schema와 달리(전체 콘텐츠에 적용됨), itemSchema는 스트림의 각 항목에 독립적으로 적용되어 스트림에서 항목을 읽는 즉시 각 항목을 처리할 수 있도록 지원해야 합니다(MUST).

schemaitemSchema는 동일한 Media Type Object에서 함께 사용될 수 있습니다(MAY). 다만 이렇게 하는 것은 schema 필드 내의 items 키워드를 사용하는 것보다 큰 이점이 없는 경우가 대부분입니다.

4.14.3.2 바이너리 스트림

maxLength 키워드는 문자열 데이터(인코딩된 바이너리 데이터 포함) 또는 비인코딩 바이너리 데이터로 구성된 스트리밍 페이로드의 예상 상한 길이를 설정하는 데 MAY 사용될 수 있습니다. 비인코딩 바이너리 데이터의 경우 길이는 옥텟 수입니다. 이 사용 사례에서 maxLength는 JSON Schema가 바이너리 데이터에 직접 적용되지 않기 때문에 정규 JSON Schema 평가 외부에서 구현될 수 있습니다. 인코딩된 바이너리 스트림을 전체 메모리에 저장하는 것은 비현실적일 수 있습니다.

4.14.4 서버 전송 이벤트 특수 고려사항

text/event-stream의 경우, 구현체는 text/event-stream 명세에 따라 이벤트 스트림을 파싱한 이후의 이벤트 데이터와 작업해야 하며, 특정 필드(주석 포함)와 값을 무시하거나 여러 줄에 걸쳐 분할된 값을 결합하는 등 모든 지침을 따라야 합니다(MUST).

필드 값 타입은 text/event-stream 명세에 지정된 대로 처리되어야 합니다(예: retry 필드 값은 JSON 숫자로 모델링되어 JSON Schema의 type: integer로 예상됨). 명시적 값 타입이 없는 필드는 문자열로 처리되어야 합니다(MUST).

text/event-stream 사용자의 일부는 특히 data 필드에 대해 필드 값으로 JSON 형식을 사용하는 경우가 있습니다. 이럴 때 문자열로 인코딩된 데이터의 내용을 다루기 위해 JSON Schema의 contentMediaTypecontentSchema 키워드를 사용하여 문자열 관련 검증 키워드(pattern 등)가 지원할 수 있는 것보다 더 자세히 설명하고 검증하세요. contentSchema는 기본적으로 자동 검증되지 않음을 유의하세요(자세한 내용은 이 명세의 Non-validating constraint keywords 섹션 참조).

다음 Schema Object는 본 문서 작성 시점의 [HTML] 명세에 문서화된 대로 text/event-stream 미디어 타입을 위한 일반적인 스키마 예시입니다:

type: object
required:
- data
properties:
  data:
    type: string
  event:
    type: string
  id:
    type: string
  retry:
    type: integer
    minimum: 0

4.14.5 인코딩 사용 및 제한 사항

이들 인코딩 필드는 각 Encoding Object를 데이터의 특정 값에 어떻게 매핑할지 정의합니다. 각 필드는 사용할 수 있는 미디어 타입 세트가 있으며, 해당 미디어 타입이 아닌 다른 타입에 대해서는 세 필드 모두 무시되어야 합니다(SHALL).

4.14.5.1 이름별 인코딩

encoding 필드의 동작은 웹 폼을 지원하도록 설계되었으므로, 반복 값을 허용하는 이름-값 쌍으로 구조화된 미디어 타입에 대해서만 정의됩니다. 특히 application/x-www-form-urlencodedmultipart/form-data가 해당됩니다.

encoding 필드를 사용하려면 해당 필드 아래의 각 키가 속성으로 반드시 존재해야 합니다(MUST); 해당 속성이 없는 encoding 항목은 무시되어야 합니다(SHALL). 배열 속성은 권장대로 각 배열 항목마다 동일한 name을 사용하여 하나의 인코딩된 값을 생성하도록 주어진 Encoding Object를 적용하여 처리해야 합니다([RFC7578] 참조). 최상위 비배열 속성 및 값, 그리고 최상위 배열 내의 배열 값 등 다른 모든 값 유형에 대해서는 Encoding Object가 값 전체에 적용되어야 합니다. 대상 미디어 타입에서의 이름-값 쌍 순서는 구현-정의입니다.

application/x-www-form-urlencoded의 경우, 인코딩 키는 파라미터 이름에 매핑되어야 하며 값은 Encoding Object 규칙에 따라 생성됩니다. Encoding the x-www-form-urlencoded Media Type에서 예시와 안내를 확인하세요.

multipart의 경우 인코딩 키는 각 파트의 Content-Disposition: form-data 헤더의 name parameter에 매핑되어야 합니다. 비-ASCII 파트 이름에 대한 지침은 [RFC7578]를 참조하세요.

encoding 필드가 있는 경우와 없는 경우 모두에 대한 추가 안내 및 예시는 Encoding multipart Media Types를 참조하세요.

4.14.5.2 위치별 인코딩

대부분의 multipart 미디어 타입(모든 multipart 타입의 구문 분석 규칙을 정의하는 multipart/mixed 포함)은 명명된 파트를 가지지 않습니다. 이러한 미디어 타입의 데이터는 한 파트당 하나의 항목을 가지는 배열로 모델링됩니다(순서 중요).

prefixEncoding 및/또는 itemEncoding 필드를 사용하려면 itemSchema 또는 배열 형태의 schema가 있어야 합니다(MUST). 이들 필드는 JSON Schema의 prefixItemsitems 키워드와 유사하며, prefixEncoding은 데이터 배열에서 동일한 위치의 값에 각각 적용되는 Encoding Objects 배열을 제공하고, itemEncoding은 배열의 나머지 항목 전체에 단일 Encoding Object를 적용합니다. 인스턴스 배열이 prefixEncoding 배열보다 짧아도 오류가 아니며, 추가 Encoding Objects는 무시되어야 합니다(SHALL).

itemEncoding 필드는 스트리밍 multipart 콘텐츠 지원을 위해 itemSchema와 함께 사용할 수도 있습니다.

4.14.5.3 추가 인코딩 방식

prefixEncoding 필드는 고정된 파트 순서를 요구하기 위해 어떤 multipart 콘텐츠와도 함께 사용할 수 있습니다. 이에는 Encoding Object의 headers 필드를 사용해 Content-Disposition 및 파트 이름을 제공해야 하는 multipart/form-data가 포함됩니다(속성 이름이 자동으로 제공되지 않기 때문입니다).

이전 버전의 명세는 multipart 미디어 타입(특히 multipart/form-data 외의 경우)에 대해 각 파트의 Content-Disposition: form-data 헤더의 name parameter를 사용하도록 권고하여 encoding 필드의 한계를 우회하도록 제안했습니다. 구현체는 이 워크어라운드를 선택적으로 지원할 수 있지만, 이 사용 방식은 일반적이지 않으므로 비-form-data multipart 미디어 타입 구현체는 이를 지원할 가능성이 낮습니다.

4.14.6 미디어 타입 예시

폼 관련 및 multipart 미디어 타입 예시는 Encoding Object를 참고하세요.

4.14.6.1 JSON

이 예시는 YAML로 작성되었기 때문에 Example Object의 value 필드는 JSON으로 간단히 변환 가능한 YAML 형식으로 작성할 수 있습니다. 이는 JSON을 문자열로 임베드할 필요를 피합니다.

application/json:
  schema:
    $ref: '#/components/schemas/Pet'
  examples:
    cat:
      summary: An example of a cat
      value:
        name: Fluffy
        petType: Cat
        color: White
        gender: male
        breed: Persian
    dog:
      summary: An example of a dog with a cat's name
      value:
        name: Puma
        petType: Dog
        color: Black
        gender: Female
        breed: Mixed
    frog:
      $ref: '#/components/examples/frog-example'

대안으로, 모든 JSON이 유효한 YAML이므로 예시 값은 YAML 문서 내에서 JSON 문법을 그대로 사용할 수 있습니다:

application/json:
  schema:
    $ref: '#/components/schemas/Pet'
  examples:
    cat:
      summary: An example of a cat
      value: {
        "name": "Fluffy",
        "petType": "Cat",
        "color": "White",
        "gender": "male",
        "breed": "Persian"
      }
    dog:
      summary: An example of a dog with a cat's name
      value: {
        "name": "Puma",
        "petType": "Dog",
        "color": "Black",
        "gender": "Female",
        "breed": "Mixed"
      }
    frog:
      $ref: '#/components/examples/frog-example'
4.14.6.2 순차 JSON

시퀀스의 항목이 JSON 값인 모든 연속적 미디어 타입에 대해서는 각 값의 변환이 필요하지 않습니다. JSON Text Sequences(예: application/json-seq)와 RFC 참조의 +json-seq 접미사, JSON Lines(application/jsonl), NDJSON(application/x-ndjson) 등이 이 범주에 포함됩니다. JSON Lines와 NDJSON의 미디어 타입은 IANA에 등록되지 않았지만 일반적으로 사용됩니다.

다음 예시는 스트리밍 로그 항목과 쿼리에 대한 고정 길이 집합 반환을 위한 Media Type Objects를 보여주며, schemaitemSchema의 관계와 각각을 언제 사용해야 하는지를 설명합니다.

components:
  schemas:
    LogEntry:
      type: object
      properties:
        timestamp:
          type: string
          format: date-time
        level:
          type: integer
          minimum: 0
        message:
          type: string
    Log:
      type: array
      items:
        $ref: "#/components/schemas/LogEntry"
      maxItems: 100
  examples:
    LogJSONSeq:
      summary: Log entries in application/json-seq
      # JSON Text Sequences require an unprintable character
      # that cannot be escaped in a YAML string, and therefore
      # must be placed in an external document shown below
      externalValue: examples/log.json-seq
    LogJSONPerLine:
      summary: Log entries in application/jsonl or application/x-ndjson
      description: JSONL and NDJSON are identical for this example
      # Note that the value must be written as a string with newlines,
      # as JSONL and NDJSON are not valid YAML
      value: |
        {"timestamp": "1985-04-12T23:20:50.52Z", "level": 1, "message": "Hi!"}
        {"timestamp": "1985-04-12T23:20:51.37Z", "level": 1, "message": "Bye!"}
  responses:
    LogStream:
      description: |
        A stream of JSON-format log messages that can be read
        for as long as the application is running, and is available
        in any of the sequential JSON media types.
      content:
        application/json-seq:
          itemSchema:
            $ref: "#/components/schemas/LogEntry"
          examples:
            JSON-SEQ:
              $ref: "#/components/examples/LogJSONSeq"
        application/jsonl:
          itemSchema:
            $ref: "#/components/schemas/LogEntry"
          examples:
            JSONL:
              $ref: "#/components/examples/LogJSONPerLine"
        application/x-ndjson:
          itemSchema:
            $ref: "#/components/schemas/LogEntry"
          examples:
            NDJSON:
              $ref: "#/components/examples/LogJSONPerLine"
    LogExcerpt:
      description: |
        A response consisting of no more than 100 log records,
        generally as a result of a query of the historical log,
        available in any of the sequential JSON media types.
      content:
        application/json-seq:
          schema:
            $ref: "#/components/schemas/Log"
          examples:
            JSON-SEQ:
              $ref: "#/components/examples/LogJSONSeq"
        application/jsonl:
          schema:
            $ref: "#/components/schemas/Log"
          examples:
            JSONL:
              $ref: "#/components/examples/LogJSONPerLine"
        application/x-ndjson:
          schema:
            $ref: "#/components/schemas/Log"
          examples:
            NDJSON:
              $ref: "#/components/examples/LogJSONPerLine"

우리의 application/json-seq 예시는 개행 문자와 인쇄 불가능한 레코드 구분자(0x1E)를 사용하기 때문에 외부 문서로 두어야 합니다; YAML 블록 리터럴에서 이를 이스케이프할 수 없습니다:

0x1E{
  "timestamp": "1985-04-12T23:20:50.52Z",
  "level": 1,
  "message": "Hi!"
}
0x1E{
  "timestamp": "1985-04-12T23:20:51.37Z",
  "level": 1,
  "message": "Bye!"
}
4.14.6.3 서버 전송 이벤트 스트림

이 예시에서는 Special Considerations for Server-Sent Events 섹션에 제공된 일반 이벤트 스키마가 #/components/schemas/Event에 있다고 가정합니다:

description: A request body to add a stream of typed data.
required: true
content:
  text/event-stream:
    itemSchema:
      $ref: "#/components/schemas/Event"
      required: [event]
      oneOf:
      - properties:
          event:
            const: addString
      - properties:
          event:
            const: addInt64
          data:
            $comment: |
              Since the `data` field is a string,
              we need a format to signal that it
              should be handled as a 64-bit integer.
            format: int64
      - properties:
          event:
            const: addJson
          data:
            $comment: |
              These content fields indicate
              that the string value should
              be parsed and validated as a
              JSON document (since JSON is not
              a binary format, `contentEncoding`
              is not needed)
            contentMediaType: application/json
            contentSchema:
              type: object
              required: [foo]
              properties:
                foo:
                  type: integer

다음 text/event-stream 문서는 위 예시의 유효한 요청 본문의 예입니다:

event: addString
data: This data is formatted
data: across two lines
retry: 5

event: addInt64
data: 1234.5678
unknownField: this is ignored

: This is a comment
event: addJSON
data: {"foo": 42}

이 스트림이 어떻게 처리되는지 더 명확히 보기 위해, 다음은 동등한 JSON Lines 문서로서 숫자 및 JSON 데이터가 문자열로 처리되는 방식과 알려지지 않은 필드 및 주석이 무시되어 스키마 검증에 전달되지 않는 방식을 보여줍니다:

{"event": "addString", "data": "This data is formatted\nacross two lines", "retry": 5}
{"event": "addInt64", "data": "1234.5678"}
{"event": "addJSON", "data": "{\"foo\": 42}"}

4.14.7 파일 업로드 고려사항

OpenAPI 2.0과 달리, OAS 3.x에서의 file 입력/출력 콘텐츠는 다른 스키마 타입과 동일한 의미론으로 기술됩니다.

OAS 3.0과 달리, OAS 3.1에서는 format 키워드가 스키마의 콘텐츠 인코딩에 영향을 주지 않습니다. 대신 JSON Schema의 contentEncodingcontentMediaType 키워드를 사용합니다. 다양한 시나리오를 이 키워드들로 모델링하는 방법과 이전의 format 사용에서 마이그레이션하는 방법은 Working With Binary Data를 참조하세요.

예시:

바이너리(octet-stream)로 전송되는 콘텐츠는 schema를 생략할 수 있습니다(MAY):

# a PNG image as a binary file:
content:
  image/png: {}
# an arbitrary binary file:
content:
  application/octet-stream: {}
# arbitrary JSON without constraints beyond being syntactically valid:
content:
  application/json: {}

이 예시들은 파일 업로드의 입력 페이로드 또는 응답 페이로드 모두에 적용됩니다.

POST 오퍼레이션에서 파일을 제출하기 위한 requestBody 예시는 다음과 같을 수 있습니다:

requestBody:
  content:
    application/octet-stream: {}

또한 특정 미디어 타입들을 지정할 수 있습니다(MAY):

# multiple, specific media types may be specified:
requestBody:
  content:
    # a binary file of type png or jpeg
    image/jpeg: {}
    image/png: {}

여러 파일을 업로드하려면 multipart 미디어 타입을 사용해야 합니다(MUST); 예시는 Example: Multipart Form with Multiple Files를 참조하세요.

4.15 인코딩 객체

단일 값을 대상으로 적용되는 단일 인코딩 정의입니다. Encoding Objects와 값의 매핑은 Media Type Object에서 설명한 바와 같이 Encoding Usage and Restrictions에 의해 결정됩니다.

다양한 타입의 값을 문자열 표현으로 변환하는 논의는 Appendix B를 참조하세요.

폼 미디어 타입의 퍼센트 인코딩 관련 상세 검토는 Appendix E를 참조하세요.

4.15.1 고정 필드

4.15.1.1 공통 고정 필드

이들 필드는 아래 섹션에 정의된 RFC6570 스타일 직렬화 필드의 사용 여부와 상관없이 사용할 수 있습니다(MAY).

Field Name Type Description
contentType string 특정 속성의 인코딩을 위한 Content-Type입니다. 값은 쉼표로 구분된 목록이며, 각 요소는 특정 미디어 타입(예: image/png) 또는 와일드카드 미디어 타입(예: image/*)일 수 있습니다. 기본값은 아래 표에 표시된 타입에 따라 달라집니다.
headers Map[string, Header Object | Reference Object] 추가 정보를 헤더로 제공할 수 있는 맵입니다. Content-Type은 별도로 설명되며 이 항목에서는 무시되어야 합니다(SHALL). 이 필드는 미디어 타입이 multipart가 아닌 경우 무시되어야 합니다(SHALL).
encoding Map[string, Encoding Object] Media Type Objectencoding 필드와 동일한 방식으로 중첩 Encoding Objects를 적용합니다.
prefixEncoding [Encoding Object] Media Type ObjectprefixEncoding 필드와 동일한 방식으로 중첩 Encoding Objects를 적용합니다.
itemEncoding Encoding Object Media Type ObjectitemEncoding 필드와 동일한 방식으로 중첩 Encoding Objects를 적용합니다.

이 객체는 MAY Specification Extensions로 확장될 수 있습니다.

contentType의 기본값은 다음과 같습니다. contentEncoding 열의 n/acontentEncoding의 존재 또는 값이 무관함을 의미합니다. 이 표는 Encoding Object가 적용되는 값의 유형에 기반합니다(Encoding Usage and Restrictions 참조). Encoding By Name의 경우, 이 값은 "array" 타입의 속성에 대해 배열 항목에 해당하고, 다른 모든 타입에서는 전체 값에 해당합니다. 따라서 표의 array 행은 이름으로 인코딩할 때 최상위 배열 내부의 배열 값 항목에만 적용됩니다.

type contentEncoding Default contentType
absent n/a application/octet-stream
string present application/octet-stream
string absent text/plain
number, integer, or boolean n/a text/plain
object n/a application/json
array n/a application/json

null 타입을 처리하는 방식은 null 값이 어떻게 직렬화되는지에 따라 달라집니다. null 값이 완전히 생략된다면 contentType는 무의미합니다. 데이터 타입 변환 옵션에 대한 논의는 Appendix B를 참조하세요.

4.15.1.2 RFC6570 스타일 직렬화용 고정 필드
Field Name Type Description
style string 특정 속성 값이 그 타입에 따라 어떻게 직렬화되는지를 설명합니다. Parameter Object에서 style 필드에 대한 세부사항을 참조하세요. 동작은 query 파라미터와 동일한 값들을 따르며, contentType사용되지 않는 경우에만 적용되는 기본값 "form"를 포함합니다(이는 explode 또는 allowReserved가 명시적으로 지정된 경우에 해당합니다). 쿼리 문자열에서 사용하는 초기 ?application/x-www-form-urlencoded 메시지 본문에서는 사용되지 않으므로 RFC6570 구현을 사용하는 경우 제거해야 하며(MUST), 수동으로 문자열을 구성하는 경우 처음부터 추가하지 않아야 합니다. 이 필드는 미디어 타입이 application/x-www-form-urlencoded 또는 multipart/form-data가 아닌 경우 무시되어야 합니다(SHALL). 값이 명시적으로 정의되면 contentType의 (암묵적이거나 명시적) 값은 무시되어야 합니다(SHALL).
explode boolean 이 값이 true이면 array 또는 object 타입의 속성 값은 배열의 각 값이나 맵의 각 키-값 쌍에 대해 별도의 파라미터를 생성합니다. 다른 타입의 속성이나 style"deepObject"인 경우 이 필드는 영향이 없습니다. style"form"일 때 기본값은 true입니다. 다른 모든 스타일의 기본값은 false입니다. 이 필드는 미디어 타입이 application/x-www-form-urlencoded 또는 multipart/form-data가 아닌 경우 무시되어야 합니다(SHALL). 값이 명시적으로 정의되면 contentType의 (암묵적이거나 명시적) 값은 무시되어야 합니다(SHALL).
allowReserved boolean 이 값이 true이면 파라미터 값은 RFC6570의 예약 확장(reserved expansion)을 사용하여 직렬화됩니다([RFC6570] 참조), 이는 RFC3986의 예약 문자 집합과 퍼센트 인코딩된 3문자 시퀀스가 그대로 통과되도록 허용합니다. 그러나 대상 미디어 타입에서 허용되지 않는 예약 문자는 애플리케이션이 직접 퍼센트-인코딩해야 합니다. 자세한 내용은 URL Percent-Encoding을 참조하세요. 기본값은 false입니다. 이 필드는 미디어 타입이 application/x-www-form-urlencoded 또는 multipart/form-data가 아닌 경우 무시되어야 합니다(SHALL). 값이 명시적으로 정의되면 contentType의 (암묵적이거나 명시적) 값은 무시되어야 합니다(SHALL).

multipart/form-data에 대해 RFC6570 스타일 직렬화를 사용할 때는 URI 퍼센트 인코딩을 적용해서는 안 되며(MUST NOT), allowReserved의 값은 영향을 미치지 않습니다. 추가 안내는 Appendix C: Using RFC6570 Implementations를 참조하세요.

style, explode, 또는 allowReserved 중 적어도 하나가 명시적으로 존재하는 것은 schemain: "query" Parameter Objects를 사용하는 것과 동등합니다. 이들 세 필드가 모두 없는 경우는 content를 사용하는 것과 동등하지만, 미디어 타입은 Media Type Object를 통해서가 아니라 contentType에 의해 지정된다는 점이 다릅니다.

4.15.2 중첩 인코딩

인코딩이 필요한 중첩 포맷(특히 중첩된 multipart/mixed)은 이 객체의 encoding, prefixEncoding, 및/또는 itemEncoding 필드로 지원할 수 있습니다. 구현체는 한 수준의 중첩을 반드시 지원해야 하며(MUST), 추가 수준의 지원은 선택사항입니다(MAY).

4.15.3 x-www-form-urlencoded 미디어 타입 인코딩

[WHATWG-URL] 규칙에 따라 form url 인코딩 콘텐츠를 다루려면 Media Type Object에서 application/x-www-form-urlencoded 미디어 타입을 사용하세요. 이 설정은 복잡한 객체가 먼저 문자열 표현으로 직렬화된 후 해당 미디어 타입 규칙에 따라 퍼센트-인코딩되어야 함을 의미합니다(MUST).

폼 미디어 타입의 퍼센트 인코딩 문제에 대한 상세 검토는 Appendix E를 참조하세요.

4.15.3.1 예시: JSON 값이 포함된 URL 인코딩 폼

encoding 필드가 없을 때 직렬화 전략은 Encoding Object의 기본값에 기반합니다:

requestBody:
  content:
    application/x-www-form-urlencoded:
      schema:
        type: object
        properties:
          id:
            type: string
            format: uuid
          address:
            type: object
            properties: {}

이 예에서 idf81d4fae-7dec-11d0-a765-00a0c91e6bf6이고 ZIP+4를 포함한 미국식 주소가 다음과 같다고 가정하면:

{
  "streetAddress": "123 Example Dr.",
  "city": "Somewhere",
  "state": "CA",
  "zip": "99999+1234"
}

JSON 값의 가장 간결한 표현(불필요한 공백 제거)을 가정하면, 요청 본문은 다음과 같을 것이며 공백 문자는 +로, 그리고 +, ", :, ,, {, } 등은 각각 %2B, %22, %3A, %2C, %7B, %7D로 퍼센트-인코딩됩니다:

id=f81d4fae-7dec-11d0-a765-00a0c91e6bf6&address=%7B%22streetAddress%22%3A%22123+Example+Dr.%22%2C%22city%22%3A%22Somewhere%22%2C%22state%22%3A%22CA%22%2C%22zip%22%3A%2299999%2B1234%22%7D

Encoding Object의 기본 동작에 따라 id 키워드는 text/plain로 취급되어 있는 그대로 직렬화됩니다. 만약 application/json으로 취급되면 직렬화된 값은 따옴표를 포함한 JSON 문자열이 되며 따옴표는 %22로 퍼센트-인코딩됩니다.

다음은 id 파라미터가 text/plain 대신 application/json으로 직렬화된 후 WHATWG-URL의 form-urlencoded 규칙에 따라 인코딩된 예시입니다:

id=%22f81d4fae-7dec-11d0-a765-00a0c91e6bf6%22
4.15.3.2 예시: 바이너리 값이 포함된 URL 인코딩 폼

application/x-www-form-urlencoded은 텍스트 형식이므로 바이너리 데이터는 base64로 인코딩해야 합니다.

requestBody:
  content:
    application/x-www-form-urlencoded:
      schema:
        type: object
        properties:
          name:
            type: string
          icon:
            # The default content type with `contentEncoding` present
            # is `application/octet-stream`, so we need to set the correct
            # image media type(s) in the Encoding Object.
            type: string
            contentEncoding: base64url
  encoding:
    icon:
      contentType: image/png, image/jpeg

예: nameexample이고 icon이 빨간색 2x2 PNG라면 요청 본문은 다음과 같습니다:

name=example&icon=iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAIAAAD91JpzAAAABGdBTUEAALGPC_xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAqADAAQAAAABAAAAAgAAAADO0J6QAAAAEElEQVQIHWP8zwACTGCSAQANHQEDqtPptQAAAABJRU5ErkJggg%3D%3D

= 패딩 문자는 contentEncoding: base64url 같은 "URL safe" 인코딩을 사용하더라도 퍼센트-인코딩되어야 합니다. 일부 base64 디코더는 RFC4648 섹션에 따라 패딩 없이도 처리할 수 있지만 보장되지 않으므로 호환성을 위해 패딩을 유지하고 퍼센트-디코딩에 의존하는 것이 더 안전할 수 있습니다.

4.15.4 multipart 미디어 타입 인코딩

스키마 속성과 파트를 연관시키는 방법에 대한 지침은 Encoding Usage and Restrictions를 참조하세요.

multipart 미디어 타입에서 사용할 수 있는 헤더에는 일반적으로 상당한 제한이 있음을 유의하세요([RFC2046] Section 5.1) 및 특히 multipart/form-data에 관해서는 [RFC7578] Section 4.8을 참조하세요.

4.15.4.1 다중 contentType 값 처리

contentType에 여러 값이 지정된 경우에도 파트의 실제 Content-Type이 문서에 포함되므로 파싱은 간단합니다.

인코딩 및 직렬화 시 구현체는 애플리케이션이 의도한 미디어 타입을 표시할 수 있는 메커니즘을 반드시 제공해야 합니다(MUST). 구현체는 대안으로 미디어 타입 스니핑([SNIFF])을 제공할 수 있지만, 보안 위험 때문에 기본 동작으로 이것을 사용해서는 안 됩니다(MUST NOT).

4.15.4.2 Content-Transfer-EncodingcontentEncoding

멀티파트 필드에 대해 contentEncoding을 사용하는 것은 해당 값을 요구하는 스키마를 가진 Content-Transfer-Encoding 헤더를 포함하는 Encoding Object를 지정하는 것과 동등합니다. 만약 멀티파트 필드에 대해 contentEncoding이 사용되었고, 동시에 Encoding Object의 headers 필드에 Content-Transfer-Encoding가 있어 그 스키마가 contentEncoding의 값을 허용하지 않는다면 직렬화 및 파싱 결과는 정의되지 않습니다.

Working with Binary Data에서 언급된 바와 같이, Encoding Object의 contentType이 (명시적이든 암묵적이든) 스키마 객체의 contentMediaType과 불일치하는 경우 contentMediaType는 무시되어야 합니다(SHALL). 이 때문에 Encoding Object와 함께 contentMediaType를 사용하는 것은 권장되지 않습니다(NOT RECOMMENDED).

또한 Content-Transfer-Encoding은 HTTP에서 바이너리 데이터를 지원하는 multipart/form-data에 대해 더 이상 권장되지 않습니다([RFC7578] Section 4.7).

폼 미디어 타입의 퍼센트 인코딩 문제에 대한 상세 검토는 Appendix E를 참조하세요.

4.15.4.3 예시: 기본 멀티파트 폼

encoding 필드가 사용되지 않을 때 인코딩은 Encoding Object의 기본값에 의해 결정됩니다:

requestBody:
  content:
    multipart/form-data:
      schema:
        type: object
        properties:
          # default content type for a string without `contentEncoding`
          # is `text/plain`
          id:
            type: string
            format: uuid

          # default content type for a schema without `type`
          # is `application/octet-stream`
          profileImage: {}

          # for arrays, the `encoding` field applies the Encoding Object
          # to each item individually and determines the default content type
          # based on the type in the `items` subschema, which in this example
          # is an object, so the default content type for each item is
          # `application/json`
          addresses:
            type: array
            items:
              $ref: '#/components/schemas/Address'
4.15.4.4 예시: 인코딩 객체가 포함된 멀티파트 폼

encoding을 사용하면 바이너리 데이터에 대해 더 구체적인 타입을 설정하거나 복잡한 값에 대해 비-JSON 형식을 지정할 수 있습니다. 또한 각 파트에 대한 헤더도 설명할 수 있습니다:

requestBody:
  content:
    multipart/form-data:
      schema:
        type: object
        properties:
          # No Encoding Object, so use default `text/plain`
          id:
            type: string
            format: uuid

          # Encoding Object overrides the default `application/json` content type
          # for each item in the array with `application/xml; charset=utf-8`
          addresses:
            description: addresses in XML format
            type: array
            items:
              $ref: '#/components/schemas/Address'

          # Encoding Object accepts only PNG or JPEG, and also describes
          # a custom header for just this part in the multipart format
          profileImage: {}

      encoding:
        addresses:
          contentType: application/xml; charset=utf-8
        profileImage:
          contentType: image/png, image/jpeg
          headers:
            X-Rate-Limit-Limit:
              description: The number of allowed requests in the current period
              schema:
                type: integer
4.15.4.5 예시: 다중 파일을 포함하는 멀티파트 폼

[RFC7578] Section 4.3에 따라, 단일 폼 필드에 대한 다중 파일 업로드는 각 파일 파트에 대해 동일한 이름(이 예에서는 file)을 사용하여 업로드합니다:

requestBody:
  content:
    multipart/form-data:
      schema:
        properties:
          # The property name `file` will be used for all files.
          file:
            type: array
            items: {}

앞서 Encoding Object의 contentType 필드 문서에서 본 바와 같이, items의 빈 스키마는 application/octet-stream 미디어 타입을 나타냅니다.

4.15.4.6 예시: 순서가 있는, 이름 없는 멀티파트

JSON 메타데이터 문서가 먼저 나오고 그 메타데이터가 설명하는 이미지를 뒤따르는 multipart/mixed 페이로드 예시:

multipart/mixed:
  schema:
    type: array
    prefixItems:
    - # default content type for objects
      # is `application/json`
      type: object
      properties:
        author:
          type: string
        created:
          type: string
          format: datetime
        copyright:
          type: string
        license:
          type: string
    - # default content type for a schema without `type`
      # is `application/octet-stream`, which we need
      # to override.
      {}
  prefixEncoding:
  - # Encoding Object defaults are correct for JSON
    {}
  - contentType: image/*
4.15.4.7 예시: 필수 헤더가 있는 순서형 멀티파트

[RFC2557]에 설명된 바와 같이, 웹 페이지를 구성하는 리소스 집합은 multipart/related 페이로드로 전송될 수 있으며, 각 파트에 Content-Location 헤더를 정의하여 text/html 문서에서 보조 리소스로의 링크를 보존할 수 있습니다. 첫 번째 파트는 루트 리소스로 사용되므로(Content-ID 사용은 권장되지 않음) prefixItemsprefixEncoding을 사용하여 첫 파트가 HTML 리소스여야 함을 정의하고, 그 뒤에는 여러 타입의 리소스를 임의의 순서로 허용합니다.

Content-Location 헤더는 그 값이 URI이므로 퍼센트 인코딩을 피하기 위해 content: {text/plain: {...}}를 사용하여 정의합니다. 자세한 내용은 Appendix D를 참조하세요.

components:
  headers:
    RFC2557NoContentId:
      description: Use Content-Location instead of Content-ID
      schema: false
    RFC2557ContentLocation:
      required: true
      content:
        text/plain:
          schema:
            $comment: Use a full URI (not a relative reference)
            type: string
            format: uri
  requestBodies:
    RFC2557:
      content:
        multipart/related; type=text/html:
          schema:
            prefixItems:
            - type: string
            items:
              anyOf:
              - type: string
              - $comment: To allow binary, this must always pass
          prefixEncoding:
          - contentType: text/html
            headers:
              Content-ID:
                $ref: '#/components/headers/RFC2557NoContentId'
              Content-Location:
                $ref: '#/components/headers/RFC2557ContentLocation'
          itemEncoding:
            contentType: text/css,text/javascript,image/*
            headers:
              Content-ID:
                $ref: '#/components/headers/RFC2557NoContentId'
              Content-Location:
                $ref: '#/components/headers/RFC2557ContentLocation'
4.15.4.8 예시: 스트리밍 멀티파트

이 예시는 대량의 사진을 캡처하여 호출자에게 스트리밍하는 장치를 가정합니다. 이전 예와 달리 여기서는 각 이미지를 도착했을 때(또는 소규모 배치로) 처리할 것으로 기대하므로 itemSchema를 사용합니다. 전체 스트림을 버퍼링하면 메모리가 부족해지기 때문입니다.

multipart/mixed:
  itemSchema:
    $comment: A single data image from the device
  itemEncoding:
    contentType: image/jpg
4.15.4.9 예시: 바이트 범위 스트리밍

multipart/byteranges의 경우([RFC9110] Section 14.6), Content-Range 헤더가 필요합니다.

content: {text/plain: {...}}를 사용하여 헤더 값을 설명하는지에 대한 설명은 Appendix D를 참조하세요.

multipart/byteranges:
  itemSchema:
    $comment: A single range of bytes from a video
  itemEncoding:
    contentType: video/mp4
    headers:
      Content-Range:
        required: true
        content:
          text/plain:
            schema:
              # The `pattern` regular expression that would
              # be included in practice is omitted for simplicity
              type: string
4.15.4.10 예시: 중첩 multipart/mixed

이는 첫 번째 파트가 JSON 배열이고 두 번째 파트가 중첩된 multipart/mixed 문서인 2-파트 multipart/mixed를 정의합니다. 중첩된 파트들은 XML, 일반 텍스트, PNG 이미지입니다.

multipart/mixed:
  schema:
    type: array
    prefixItems:
    - type: array
    - type: array
      prefixItems:
      - type: object
      - type: string
      - {}
  prefixEncoding:
    - {} # Accept the default application/json
    - contentType: multipart/mixed
      prefixEncoding:
      - contentType: application/xml
      - {} # Accept the default text/plain
      - contentType: image/png

4.16 응답 객체

오퍼레이션의 예상 응답을 담는 컨테이너입니다. 이 컨테이너는 HTTP 응답 코드를 해당 예상 응답에 매핑합니다.

문서화는 모든 가능한 HTTP 응답 코드를 반드시 다루지 않을 수 있습니다. 이는 사전에 알 수 없는 코드가 있을 수 있기 때문입니다. 하지만 문서에는 성공적인 오퍼레이션 응답과 알려진 오류들은 포함되어야 합니다.

default는 Responses Object에 개별적으로 포함되지 않은 모든 HTTP 코드에 대한 기본 Response Object로서 MAY 사용될 수 있습니다.

Responses Object는 최소 하나의 응답 코드를 포함해야 합니다(MUST). 만약 하나의 응답 코드만 제공된다면, 그 코드는 성공적인 오퍼레이션 호출에 대한 응답인 것이 SHOULD 권장됩니다.

4.16.1 고정 필드

Field Name Type Description
default Response Object | Reference Object 특정 HTTP 응답 코드에 대해 선언된 것 이외의 응답들을 문서화합니다. 선언되지 않은 응답을 다루기 위해 이 필드를 사용하세요.

4.16.2 패턴 필드

Field Pattern Type Description
HTTP Status Code Response Object | Reference Object 어떤 HTTP 상태 코드도 속성 이름으로 사용할 수 있습니다. 단, 코드별로 하나의 속성만 허용되며, 해당 HTTP 상태 코드에 대한 예상 응답을 설명합니다. 이 필드는 JSON과 YAML 간의 호환성을 위해 반드시(MUST) 따옴표로 묶여야 합니다(예: “200”). 응답 코드 범위를 정의하려면, 이 필드에 대문자 와일드카드 문자 X를 사용할 수 있습니다(MAY). 예를 들어 2XX200에서 299까지의 모든 응답 코드를 나타냅니다. 허용되는 범위 정의는 다음만 허용됩니다: 1XX, 2XX, 3XX, 4XX, 5XX. 만약 응답이 명시적 코드로 정의되어 있다면, 그 명시적 코드 정의가 해당 코드에 대한 범위 정의보다 우선합니다.

이 객체는 MAY Specification Extensions로 확장될 수 있습니다.

4.16.3 HTTP 상태 코드

HTTP 상태 코드는 실행된 오퍼레이션의 상태를 나타내는 데 사용됩니다. 상태 코드는 IANA Status Code Registry에 등록된 사용 가능한 상태 코드들 중에서 선택하는 것이 SHOULD 권장됩니다.

4.16.4 응답 객체 예시

성공한 오퍼레이션에 대한 200 응답과 기타(오류를 암시하는) 경우에 대한 기본 응답 예시:

'200':
  description: 반환될 애완동물
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/Pet'
default:
  description: 예상치 못한 오류
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/ErrorModel'

4.17 Response 객체

API 오퍼레이션으로부터의 단일 응답을 설명합니다. 또한 응답을 기반으로 하는 설계 시점의 정적 links를 포함할 수 있습니다.

4.17.1 고정 필드

Field Name Type Description
summary string 응답의 의미에 대한 간단한 요약입니다.
description string 응답에 대한 설명입니다. [CommonMark] 문법을 사용하여 풍부한 텍스트 표현을 할 수 있습니다(MAY).
headers Map[string, Header Object | Reference Object] 헤더 이름을 해당 정의로 매핑합니다. [RFC9110]의 Section 5.1에 따르면 헤더 이름은 대소문자 구분이 없습니다. 응답 헤더가 "Content-Type"이라는 이름으로 정의되어 있다면, 해당 정의는 무시되어야 합니다(SHALL).
content Map[string, Media Type Object | Reference Object] 가능한 응답 페이로드의 설명을 포함하는 맵입니다. 키는 미디어 타입 또는 media type range이고 값이 그것을 설명합니다. 여러 키에 일치하는 응답의 경우 가장 구체적인 키만 적용됩니다. 예: "text/plain""text/*"를 덮어씁니다.
links Map[string, Link Object | Reference Object] 응답에서 따라갈 수 있는 오퍼레이션 링크들의 맵입니다. 맵의 키는 링크의 짧은 이름이며, Component Objects의 이름 제약을 따릅니다.

이 객체는 MAY Specification Extensions로 확장될 수 있습니다.

4.17.2 Response 객체 예시

복잡한 타입의 배열을 응답으로 반환하는 예시:

description: 복잡한 객체 배열 응답
content:
  application/json:
    schema:
      type: array
      items:
        $ref: '#/components/schemas/VeryComplexType'

문자열 타입을 반환하는 응답 예시:

description: 간단한 문자열 응답
content:
  text/plain:
    schema:
      type: string

헤더를 포함한 평문 응답 예시:

description: 간단한 문자열 응답
content:
  text/plain:
    schema:
      type: string
    example: 'whoa!'
headers:
  X-Rate-Limit-Limit:
    description: 현재 기간 동안 허용된 요청 수
    schema:
      type: integer
  X-Rate-Limit-Remaining:
    description: 현재 기간 동안 남은 요청 수
    schema:
      type: integer
  X-Rate-Limit-Reset:
    description: 현재 기간에 남은 초 수
    schema:
      type: integer

반환 값이 없는 응답 예시:

description: 객체 생성됨

4.18 Callback 객체

부모 오퍼레이션과 관련된 가능한 비동기 콜백들의 맵입니다. 맵의 각 값은 API 제공자가 시작할 수 있는 일련의 요청과 예상 응답들을 설명하는 Path Item Object입니다. Path Item Object를 식별하는 데 사용되는 키 값은 런타임에 평가되는 표현식으로, 콜백 오퍼레이션에 사용할 URL을 식별합니다.

다른 API 호출과 독립적으로 API 제공자로부터 들어오는 요청을 설명하려면 webhooks 필드를 사용하세요.

4.18.1 패턴 필드

Field Pattern Type Description
{expression} Path Item Object 콜백 요청과 예상 응답을 정의하는 데 사용되는 Path Item Object입니다. 완전한 예시를 참고하세요.

이 객체는 MAY Specification Extensions로 확장될 수 있습니다.

4.18.2 Key 표현식

Path Item Object를 식별하는 키는 런타임 HTTP 요청/응답의 맥락에서 평가될 수 있는 runtime expression입니다. 이 표현식은 콜백 요청에 사용할 URL을 식별합니다. 간단한 예로는 $request.body#/url 같은 표현이 있을 수 있습니다. 런타임 표현식을 사용하면 전체 HTTP 메시지에 접근할 수 있으며, 이는 JSON Pointer([RFC6901])가 참조할 수 있는 본문의 어떤 부분에도 접근할 수 있음을 의미합니다.

예를 들어 다음과 같은 HTTP 요청이 주어졌다고 가정합니다:

POST /subscribe/myevent?queryUrl=https://clientdomain.com/stillrunning HTTP/1.1
Host: example.org
Content-Type: application/json
Content-Length: 188

{
  "failedUrl": "https://clientdomain.com/failed",
  "successUrls": [
    "https://clientdomain.com/fast",
    "https://clientdomain.com/medium",
    "https://clientdomain.com/slow"
  ]
}

그 결과:

201 Created
Location: https://example.org/subscription/1

다음 예들은 콜백 오퍼레이션이 경로 파라미터 eventType와 쿼리 파라미터 queryUrl를 가지고 있다고 가정했을 때 각 표현식이 어떻게 평가되는지를 보여줍니다.

Expression Value
$url https://example.org/subscribe/myevent?queryUrl=https://clientdomain.com/stillrunning
$method POST
$request.path.eventType myevent
$request.query.queryUrl https://clientdomain.com/stillrunning
$request.header.content-type application/json
$request.body#/failedUrl https://clientdomain.com/failed
$request.body#/successUrls/1 https://clientdomain.com/medium
$response.header.Location https://example.org/subscription/1

4.18.3 Callback 객체 예시

다음 예시는 사용자 제공 쿼리 문자열 파라미터 queryUrl을 사용하여 콜백 URL을 정의합니다. 이는 웹훅과 유사하지만, 콜백은 초기 요청에서 queryUrl을 전송했기 때문에 발생한다는 점에서 다릅니다.

myCallback:
  '{$request.query.queryUrl}':
    post:
      requestBody:
        description: 콜백 페이로드
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SomePayload'
      responses:
        '200':
          description: 콜백이 성공적으로 처리됨

다음 예시는 서버가 하드코딩되어 있지만 쿼리 문자열 파라미터가 요청 본문의 idemail 속성으로 채워지는 콜백 예시입니다.

transactionCallback:
  'http://notificationServer.com?transactionId={$request.body#/id}&email={$request.body#/email}':
    post:
      requestBody:
        description: 콜백 페이로드
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SomePayload'
      responses:
        '200':
          description: 콜백이 성공적으로 처리됨

4.19 예시 객체

내부 또는 외부 예시 값을 기본 summarydescription 메타데이터와 함께 그룹화한 객체입니다. 예시들은 스키마 검증에 적합한 데이터나 포함하는 Media Type Object, Parameter Object, 또는 Header Object에 요구되는 직렬화된 데이터를 보여줄 수 있습니다. 이 객체는 일반적으로 복수형 examples 필드에 사용되며, 참조 가능한(referenceable) 대안으로 오래된 단수형 example 필드를 대체합니다. 다양한 필드와 예시 유형에 대한 자세한 설명은 Working With Examples에서 확인할 수 있습니다.

4.19.1 고정 필드

Field Name Type Description
summary string 예시의 간단한 설명입니다.
description string 예시의 자세한 설명입니다. [CommonMark] 문법을 사용하여 풍부한 텍스트 표현을 할 수 있습니다(MAY).
dataValue Any 해당 Schema Object에 따라 유효해야 하는 데이터 구조의 예시입니다(MUST). 이 필드가 존재하면 value는 반드시 부재해야 합니다.
serializedValue string 인코딩 및 이스케이프를 포함한 값의 직렬화된 형태의 예시입니다(Validating Examples 참조). 만약 dataValue가 존재한다면, 이 필드는 주어진 데이터의 직렬화를 포함하는 것이 SHOULD 권장됩니다. 그렇지 않다면, 이 필드는 자체적으로 dataValue에 대해 유효한 직렬화를 포함해야 합니다. 이 필드는 직렬화 형식이 JSON인 경우 사용하지 않는 것이 SHOULD NOT 권장됩니다. 이 필드가 존재하면 valueexternalValue는 반드시 부재해야 합니다.
externalValue string 직렬화된 예시를 별도의 문서로 식별하는 URI로, 유니코드 문자열로 쉽게 표현하기 어려운 값을 허용합니다. 만약 dataValue가 존재한다면, 이 필드는 주어진 데이터의 직렬화를 식별하는 것이 SHOULD 권장됩니다. 그렇지 않다면, 이 값은 자체적으로 dataValue에 대해 유효한 직렬화를 식별해야 합니다. 이 필드가 존재하면 serializedValuevalue는 반드시 부재해야 합니다. 또한 Relative References 규칙을 따르세요.
value Any 임베디드 리터럴 예시입니다. value 필드와 externalValue 필드는 상호 배타적입니다. JSON이나 YAML로 자연스럽게 표현할 수 없는 미디어 타입의 예시는 문자열 값을 사용하여 예시를 포함하고 필요 시 이스케이프하세요.

비-JSON 직렬화 대상에 대해 권장 중단: 구문과 의미가 명확한 dataValue 및/또는 serializedValue 사용을 권장합니다.

이 객체는 MAY Specification Extensions로 확장될 수 있습니다.

모든 경우에 예시 값은 연관된 스키마와 호환되는 것이 SHOULD 권장됩니다. 툴링 구현체는 자동으로 호환성을 검증하고, 호환되지 않을 경우 예시 값을 거부할 수 있습니다(MAY). 각 필드에 대한 “호환성”의 정확한 의미는 Validating Examples를 참조하세요.

4.19.2 예시 작업하기

Example Object는 Parameter Objects, Header Objects, 및 Media Type Objects에서 사용될 수 있습니다. 세 객체 모두에서 이는 복수형 examples 필드를 통해 이루어집니다. 하지만 예시를 제공하는 다른 방법들도 존재합니다: 단수형 example 필드(복수형 examples와 상호 배타적)와, 스키마 내부의 키워드들(스키마의 단수형 example과 복수형 examples) 등입니다. 우리는 Parameter, Header, 또는 Media Type Object에서의 단수형 example 필드를 “약식 example”이라고 지칭합니다(이는 value 필드만 가진 단일 Example Object와 동일한 동작). 각각의 필드는 약간씩 다른 고려사항을 가집니다.

4.19.2.1 JSON 호환 및 value 안전 예시

value와 약식 example 필드는 serializedValue(또는 externalValue)와 동일한 의미론을 가지도록 의도되었지만, JSON(또는 JSON-호환 YAML) 표현과 최종 직렬화 형태 사이에 차이가 없을 때 더 편리한 문법을 허용합니다. application/json 또는 +json 미디어 타입에 대해 이 문법을 사용할 때, 이들 필드는 사실상 dataValue처럼 동작하므로 안전하게 사용할 수 있습니다.

데이터가 단일 문자열로 이루어지고 그 직렬화 대상이 text/plain처럼 문자열이 추가 이스케이프 없이 보장되어 직렬화되는 경우에도 이러한 필드는 안전하게 사용할 수 있습니다.

다른 직렬화 대상의 경우, “JSON 또는 YAML로 자연스럽게 표현될 수 있음”이라는 모호성 때문에 비호환성 문제가 발생할 수 있습니다. 실무에서는 비-JSON 대상에 대해 value와 약식 example의 동작이 구현체마다 달라질 수 있으므로 OAD 작성자는 상호운용성을 위해 다른 필드를 사용하는 것을 SHOULD 권장합니다.

4.19.2.2 사용할 필드 선택하기

이전 섹션의 주의사항을 염두에 두고, 약식 example이 단일 Example Object에 대해서는 value 대신 사용될 수 있다는 점을 고려하여 다음 지침을 따르세요.

스키마로 검증될 예시를 보여주려면:

  • 검증 스키마와 예시를 함께 유지하려면 Schema Object의 examples 배열(JSON Schema draft 2020-12)을 사용하세요.
    • OAS v3.0과의 호환성이 필요하면 Schema Object의 단수형 example을 사용하세요.
  • 예시를 직렬화된 형태의 예시와 연관시키거나 스키마와 별도로 유지하려면 Example Object의 dataValue 필드를 사용하세요.
    • OAS v3.1 또는 이전과의 호환성이 필요하고 값이 JSON이나 YAML로 자연스럽게 표현될 수 있다면 Example Object의 value 필드를 사용하세요.

HTTP/1.1 메시지를 구성하기 위해 실제 직렬화된 예시를 보여주려면:

  • 직렬화가 유효한 유니코드 문자열로 표현될 수 있고 정확한 문자 인코딩을 보여줄 필요가 없다면 Example Object의 serializedValue를 사용하세요.
    • OAS v3.1 또는 이전과의 호환성이 필요한 경우에는 문자열 형태의 value를 사용하세요.
  • 그 외의 값이나 예시를 문서 밖에서 별도로 유지하고자 할 경우 Example Object의 externalValue를 사용하세요.

serializedValueexternalValue는 모두 직렬화된 형태를 반드시(MUST) 보여주어야 합니다. Media Type Objects의 경우 이는 적절한 미디어 타입의 문서이며, Encoding Object의 효과가 적용되어야 합니다. Parameter 및 Header Objects가 schemastyle를 사용하는 경우 직렬화 값의 정의는 Style Examples를 참조하세요.

4.19.2.3 serializedExample 기준

다음 조건 중 하나라도 만족하면 직렬화는 serializedValue에 유효한 유니코드 문자열로 표현될 수 있습니다:

  • 문자 집합을 나타내는 charset 파라미터를 허용하는 미디어 타입으로, 모든 유니코드 인코딩(UTF-8, UTF-16 등)이나 그 유효한 부분집합(예: US-ASCII)을 지정하는 경우.
  • URI나 HTTP 필드 같은 형식 또는 문자 기반 미디어 타입이 유니코드 인코딩을 요구하거나 기본값으로 가지며, charset으로 오버라이드되지 않는 경우.
  • 모든 파트가 위 조건 중 적어도 하나를 만족하는 합성 포맷(예: multipart/mixed로 구성된 파트들이 application/jsonapplication/xml; charset=utf-8인 경우).

이 모든 경우에 OAD의 문자 집합(일반적으로 JSON의 상호운용 문자 집합으로서 UTF-8로 가정)은 유니코드 코드 포인트로 변환된 다음 실제 직렬화 문자 집합으로 변환되는 과정이 잘 정의되어야 합니다.

externalValue의 경우 문자 집합이 명시되지 않았거나 형식/미디어 타입 명세로 결정되지 않으면 구현체는 UTF-8을 가정하는 것이 SHOULD 권장됩니다.

4.19.2.4 예시 검증

툴링 구현체는 예시의 호환성을 자동으로 검증하고, 호환되지 않을 경우 예시 값을 거부할 수 있습니다(MAY). 스키마-준비된 데이터 형식의 예시는 검증이 간단합니다.

직렬화된 예시의 경우 여러 표현이 동일한 데이터를 표현할 수 있는 포맷들이 있으며(부록 B 참조), 어떤 경우에는 직렬화된 예시를 파싱하여 결과 데이터를 검증함으로써 모호성을 제거할 수 있지만, 일부 경우 파싱 자체도 모호할 수 있습니다. 따라서 특정 직렬화 예시의 검증은 본질적으로 최선의 노력을 필요로 함을 주의하세요.

4.19.3 예시 객체 예시

4.19.3.1 JSON 예시

YAML로 작성할 때 dataValue에 JSON 문법을 사용할 수 있습니다(예: noRating 예시). 대부분의 경우에는 데이터 형식만으로 충분합니다.

content:
  application/json:
    schema:
      type: object
      required:
      - author
      - title
      properties:
        author:
          type: string
        title:
          type: string
        rating:
          type: number
          minimum: 1
          maximum: 5
          multipleOf: 0.5
    examples:
      noRating:
        summary: 아직 평점이 없는 작품
        dataValue:
          author: A. Writer
          title: The Newest Book
      withRating:
        summary: 평균 평점이 4.5인 작품
        dataValue:
          author: A. Writer
          title: An Older Book
          rating: 4.5
        serializedValue: |
          {
            "author": "A. Writer",
            "title": "An Older Book",
            "rating": 4.5
          }
4.19.3.2 바이너리 예시

완전한 바이너리 데이터는 externalValue를 사용하여 표시합니다:

content:
  image/png:
    schema: {}
    examples:
      Red:
        externalValue: ./examples/2-by-2-red-pixels.png
4.19.3.3 Boolean 쿼리 파라미터 예시

불리언 값을 직렬화하는 표준이 없기 때문에(부록 B 참조) 이 예시는 해당 파라미터에 대해 dataValueserializedValue를 사용하여 불리언이 어떻게 직렬화되는지를 보여줍니다:

name: flag
in: query
required: true
schema:
  type: boolean
examples:
  "true":
    dataValue: true
    serializedValue: flag=true
  "false":
    dataValue: false
    serializedValue: flag=false

4.21 헤더 객체

HTTP 응답의 헤더multipart 표현의 개별 파트에 대한 단일 헤더를 설명합니다; 관련된 제약 사항은 해당 Response ObjectEncoding Object 문서를 참조하세요.

Header Object는 Parameter Object의 구조를 따르며, schema 또는 content의 존재 여부에 따라 직렬화 전략을 결정합니다. 다만 다음과 같은 변경점이 있습니다:

  1. nameMUST NOT 지정되어야 하며, 해당 값은 상응하는 headers 맵에서 제공됩니다.
  2. inMUST NOT 지정되어야 하며, 암묵적으로 header에 위치합니다.
  3. 위치에 의해 영향을 받는 모든 특성은 MUST 헤더 위치에 적용 가능해야 합니다(예: style). 이는 allowEmptyValueMUST NOT 사용되어야 함을 의미하며, style을 사용하는 경우 허용값은 "simple"로 제한되어야 합니다.

4.21.1 고정 필드

4.21.1.1 공통 고정 필드

이들 필드는 content 또는 schema와 함께 사용할 수 있습니다(MAY).

exampleexamples 필드는 상호 배타적입니다; 검증 요구사항에 대한 안내는 Working with Examples를 참조하세요.

필드 이름 유형 설명
description string 헤더에 대한 간단한 설명입니다. 사용 예시를 포함할 수 있습니다. [CommonMark] 문법을 사용하여 풍부한 텍스트 표현을 할 수 있습니다(MAY).
required boolean 이 헤더가 필수인지 여부를 결정합니다. 기본값은 false입니다.
deprecated boolean 헤더가 더 이상 권장되지 않음을 지정하며 사용 중단 전환을 권장합니다(SHOULD). 기본값은 false입니다.
example Any 헤더의 잠재적 값에 대한 예시입니다; Working With Examples 참조.
examples Map[ string, Example Object | Reference Object] 헤더의 잠재적 값들에 대한 예시들입니다; Working With Examples 참조.

이 객체는 MAY Specification Extensions로 확장될 수 있습니다.

4.21.1.2 schema 와 함께 사용하는 고정 필드

단순한 시나리오의 경우, schemastyle로 헤더의 구조와 문법을 설명할 수 있습니다.

schema로 헤더를 직렬화할 때는 URI 퍼센트 인코딩을 적용해서는 안 됩니다(MUST NOT); 자동으로 이를 적용하는 RFC6570 구현을 사용하는 경우 사용 전에 이를 제거해야 합니다(MUST). 구현체는 헤더 값을 자동으로 따옴표로 감싸려 하기보다는 있는 그대로 전달해야 합니다. 헤더의 따옴표 규칙은 헤더마다 매우 다양하기 때문입니다. 따옴표 및 이스케이프에 대한 지침은 Appendix D를 참조하세요.

필드 이름 유형 설명
style string 헤더 값이 어떻게 직렬화되는지를 설명합니다. 기본값(헤더에 대해 유일하게 허용되는 값)은 "simple"입니다.
explode boolean 이 값이 true이면 array 또는 object 타입의 헤더 값은 배열 항목들의 쉼표로 구분된 목록 또는 맵의 키-값 쌍으로 합쳐진 단일 헤더 값을 생성합니다(자세한 내용은 Style Examples 참조). 다른 데이터 타입에는 영향이 없습니다. 기본값은 false입니다.
schema Schema Object 헤더에 사용되는 타입을 정의하는 스키마입니다.

추가 안내는 Appendix C: Using RFC6570-Based Serialization를 참조하세요.

4.21.1.3 content 와 함께 사용하는 고정 필드

더 복잡한 시나리오의 경우, content 필드는 헤더의 미디어 타입과 스키마를 정의하고 사용 예시를 제공할 수 있습니다.

필드 이름 유형 설명
content Map[string, Media Type Object | Reference Object] 헤더에 대한 표현들을 포함하는 맵입니다. 키는 미디어 타입이고 값이 그것을 설명합니다. 이 맵은 항목을 하나만 포함해야 합니다(MUST).

4.21.4 Header Object 예시

정수형 타입의 단순한 헤더 예시:

X-Rate-Limit-Limit:
  description: 현재 기간 동안 허용된 요청 수
  schema:
    type: integer

값이 "로 시작하는 강한 ETag 헤더(즉 W/가 아닌)를 필수로 요구하는 예시:

ETag:
  required: true
  schema:
    type: string
    # Note that quotation marks are part of the
    # ETag value, unlike many other headers that
    # use a quoted string purely for managing
    # reserved characters.
    pattern: ^"
  example: '"xyzzy"'

4.22 태그 객체

Operation Object에서 사용되는 단일 태그에 메타데이터를 추가합니다. Operation Object 인스턴스에 정의된 각 태그마다 Tag Object를 반드시 가질 필요는 없습니다.

4.22.1 고정 필드

필드 이름 유형 설명
name string REQUIRED. 태그의 이름입니다. 이 값을 Operation의 tags 배열에서 사용하십시오.
summary string 표시 목적으로 사용되는 태그의 간단한 요약입니다.
description string 태그에 대한 설명입니다. [CommonMark] 문법을 사용하여 리치 텍스트 표현을 할 수 있습니다 (MAY).
externalDocs 외부 문서 객체 이 태그에 대한 추가 외부 문서입니다.
parent string 이 태그가 중첩된 상위 태그의 name입니다. 명시된 태그는 API 설명에 반드시 존재해야 하며( MUST ), 부모와 자식 태그 간의 순환 참조는 사용해서는 안 됩니다( MUST NOT ).
kind string 태그의 종류를 분류하는 기계 판독 가능한 문자열입니다. 어떤 문자열 값이든 사용할 수 있으며, 일반적인 사용 예로는 내비게이션용 nav, 시각적 배지용 badge, 서로 다른 그룹이 사용하는 API를 위한 audience 등이 있습니다. 자주 사용되는 값들의 레지스트리가 제공됩니다.

이 객체는 명세 확장으로 확장될 수 있습니다 (MAY).

4.22.2 태그 객체 예제

tags:
  - name: account-updates
    summary: Account Updates
    description: Account update operations
    kind: nav

  - name: partner
    summary: Partner
    description: Operations available to the partners network
    parent: external
    kind: audience

  - name: external
    summary: External
    description: Operations available to external consumers
    kind: audience

4.23 참조 객체

OpenAPI 설명 내에서 내부 및 외부의 다른 컴포넌트를 참조할 수 있게 해주는 단순한 객체입니다.

The $ref 문자열 값은 식별되는 값을 가리키는 URI [RFC3986]을 포함합니다.

상대 참조 해석 규칙을 참조하십시오.

4.23.1 고정 필드

필드 이름 유형 설명
$ref string REQUIRED. 참조 식별자입니다. 이 값은 URI 형식이어야 합니다 (MUST).
summary string 기본적으로 참조된 컴포넌트의 요약을 재정의하는 짧은 요약입니다( SHOULD ). 참조된 객체 유형이 summary 필드를 허용하지 않으면 이 필드는 효과가 없습니다.
description string 기본적으로 참조된 컴포넌트의 설명을 재정의하는 설명입니다( SHOULD ). [CommonMark] 문법을 사용하여 리치 텍스트 표현을 할 수 있습니다 (MAY). 참조된 객체 유형이 description 필드를 허용하지 않으면 이 필드는 효과가 없습니다.

이 객체는 추가 속성으로 확장할 수 없으며, 추가된 모든 속성은 무시되어야 합니다 (SHALL).

이 추가 속성에 대한 제한은 $ref 키워드를 포함하는 스키마 객체와의 차이점입니다.

4.23.2 참조 객체 예제

$ref: '#/components/schemas/Pet'

4.23.3 상대 스키마 문서 예제

$ref: Pet.yaml

4.23.4 내장 스키마가 있는 상대 문서 예제

$ref: definitions.yaml#/Pet

4.24 스키마 객체

스키마 객체는 입력 및 출력 데이터 타입을 정의할 수 있게 합니다. 이러한 타입은 객체일 수도 있고, 원시 타입이나 배열일 수도 있습니다. 이 객체는 JSON Schema 명세 초안 2020-12의 상위 집합입니다. 빈 스키마(모든 인스턴스를 허용)는 불리언 값 true로 표현될 수 있으며, 어떤 인스턴트도 허용하지 않는 스키마는 불리언 값 false로 표현될 수 있습니다 (MAY).

키워드에 대한 자세한 내용은 JSON Schema CoreJSON Schema Validation을 참조하십시오.

명시되지 않은 한, 키워드 정의는 JSON Schema와 동일하며 추가 의미를 부여하지 않습니다; 여기에는 $schema, $id, $ref, 및 $dynamicRef와 같은 키워드가 URL이 아니라 URI로 취급되는 점이 포함됩니다. JSON Schema가 동작을 애플리케이션에 위임한다고 명시할 때(예: 주석의 경우), OAS 또한 OpenAPI 문서를 소비하는 애플리케이션에 의미 정의를 위임합니다.

4.24.1 JSON Schema 키워드

OpenAPI 스키마 객체의 dialect는 JSON Schema 명세 초안 2020-12에 명시된 어휘들에 추가하여 OAS 기본 어휘를 요구하도록 정의됩니다.

이 버전의 사양에 대한 OpenAPI 스키마 객체 방언은 URI https://spec.openapis.org/oas/3.1/dialect/base로 식별됩니다 (이것이 “OAS 방언 스키마 ID”입니다).

다음 키워드들은 JSON Schema 명세에서 가져왔지만 OAS에 의해 정의가 확장되었습니다:

  • description - [CommonMark] 문법을 사용하여 리치 텍스트 표현을 할 수 있습니다 (MAY).
  • format - 자세한 내용은 데이터 타입 포맷을 참조하십시오. JSON Schema의 정의된 포맷을 따르면서, OAS는 몇 가지 추가 사전 정의된 포맷을 제공합니다.

OAS 방언을 구성하는 JSON Schema 키워드 외에도, 스키마 객체는 다른 어휘의 키워드 또는 완전히 임의의 속성을 지원합니다.

JSON Schema 구현은 OpenAPI 명세의 기본 어휘에 의해 정의된 키워드를 알 수 없는 키워드로 처리할 수 있습니다 (unknown keywords) — 이는 해당 어휘가 $vocabulary 값으로 false를 가지기 때문입니다. OAS 기본 어휘는 다음 키워드들로 구성됩니다:

4.24.2 고정 필드

필드 이름 유형 설명
discriminator 판별자 객체 판별자는 페이로드가 만족해야 할 스키마 집합 중 어떤 것인지에 대한 힌트를 제공합니다. 자세한 내용은 구성 및 상속을 참조하십시오.
xml XML 객체 이 스키마의 XML 표현을 설명하기 위한 추가 메타데이터를 추가합니다.
externalDocs 외부 문서 객체 이 스키마에 대한 추가 외부 문서입니다.
example Any 이 스키마 인스턴스의 예시를 포함하기 위한 자유 형식 필드입니다. JSON이나 YAML로 자연스럽게 표현할 수 없는 예시는 문자열 값을 사용하여 필요한 이스케이프를 포함할 수 있습니다.

Deprecated: example 필드는 JSON Schema의 examples 키워드로 대체되었습니다. example 사용은 권장되지 않으며, 이후 버전에서 제거될 수 있습니다.

이 객체는 명세 확장으로 확장될 수 있으며(MAY), 다만 이 객체 내의 추가 속성은 x- 접두사를 생략할 수 있습니다.

4.24.3 데이터 타입

OAS의 데이터 타입은 JSON Schema Validation 명세 초안 2020-12에 정의된 타입을 기반으로 합니다: "null", "boolean", "object", "array", "number", "string", 또는 "integer". 모델은 스키마 객체를 사용하여 정의되며, 이는 JSON Schema 명세 초안 2020-12의 상위 집합입니다.

JSON Schema 키워드와 format 값은 JSON의 "인스턴스"에 대해 동작하며 이 인스턴스는 여섯 가지 JSON 데이터 타입 중 하나일 수 있습니다: "null", "boolean", "object", "array", "number", 또는 "string". 특정 키워드 및 포맷은 특정 타입에만 적용됩니다. 예를 들어 pattern 키워드와 date-time 포맷은 문자열에만 적용되며, 다른 다섯 타입의 인스턴스는 자동으로 유효한 것으로 처리됩니다. 이는 JSON Schema 키워드와 포맷이 암묵적으로 기대 타입을 요구하지 않는다는 것을 의미합니다. 타입을 명시적으로 제한하려면 type 키워드를 사용하십시오.

type 키워드는 편의를 위해 "integer"를 값으로 허용하지만, 키워드와 포맷의 적용성은 정수와 다른 숫자를 구분된 JSON 타입으로 인식하지 않습니다. JSON 자체는 그 구분을 하지 않기 때문입니다. 정수는 수학적으로 정의됩니다. 이는 11.0이 등가로 간주된다는 것을 의미합니다.

4.24.3.1 데이터 타입 포맷

JSON Schema Validation 명세에서 정의한 바와 같이, 데이터 타입은 선택적 수정 키워드인 format을 가질 수 있습니다. 해당 명세에 따라 format은 기본적으로 검증을 수행하지 않는 주석으로 취급됩니다; format을 검증하는 능력은 구현마다 다릅니다.

OpenAPI Initiative는 OAS 사용자 및 다른 명세에서 정의한 포맷을 위한 포맷 레지스트리를 호스팅합니다. 등록된 포맷에 대한 지원은 엄격히 OPTIONAL이며, 하나의 등록된 포맷을 지원한다고 해서 다른 포맷도 지원함을 의미하지 않습니다.

format 키워드가 없는 타입은 JSON Schema의 타입 정의를 따릅니다. 특정 format을 인식하지 못하는 도구는 MAY 포맷 없이 type만을 기준으로 동작할 수 있습니다. JSON Schema 검증의 목적상 각 포맷은 적용되는 JSON 데이터 타입 집합을 지정해야 합니다. 이 레지스트리에서는 이러한 타입이 "JSON Data Type" 열에 표시됩니다.

OAS에서 정의된 포맷은 다음과 같습니다:

format JSON 데이터 타입 설명
int32 number 부호 있는 32비트
int64 number 부호 있는 64비트(일명 long)
float number
double number
password string 값을 가리기 위한 힌트입니다.

앞서 데이터 타입에서 언급했듯이, type: numbertype: integer는 데이터 모델에서 모두 숫자로 간주됩니다.

4.24.4 파싱 및 직렬화

API 데이터에는 여러 형태가 있습니다:

  1. 문서의 특정 미디어 타입, HTTP 헤더 값, 또는 URI의 일부인 직렬화된 형태.
  2. 스키마 객체와 함께 사용하기 위한 데이터 형태.
  3. 애플리케이션 형태로, formatcontentType과 같은 JSON Schema 키워드가 전달하는 추가 정보와 클래스 계층 구조 등 본 사양 범위를 벗어나는 정보를 포함할 수 있습니다. 다만 이러한 정보는 판별자 객체데이터 모델링 기법와 같은 사양 요소를 기반으로 할 수 있습니다.
4.24.4.1 JSON 데이터

JSON으로 직렬화된 데이터는 데이터 형태와 거의 동일합니다. 이는 JSON Schema 데이터 모델이 JSON 표현과 거의 동등하기 때문입니다. 예를 들어 직렬화된 UTF-8 JSON 문자열 {"when": "1985-04-12T23:20:50.52"}는 이름이 when인 문자열 값 1985-04-12T23:20:50.52를 갖는 객체를 나타냅니다.

정확한 애플리케이션 형태는 이 규격의 범위를 벗어나지만, 다음 스키마 예로 설명할 수 있습니다:

type: object
properties:
  when:
    type: string
    format: date-time

일부 애플리케이션은 이 문자열을 언어에 관계없이 문자열로 유지할 수 있고, 다른 애플리케이션은 format을 감지하여 Python에서는 datetime.datetime 인스턴스, Java에서는 java.time.ZonedDateTime으로 사용할 수 있습니다. 이 규격은 데이터가 스키마에 따라 유효함을 요구하며, 주석을 통한 확장 검증과 같이 format 같은 주석이 JSON Schema 명세에 따라 제공되는 것만을 요구합니다.

4.24.4.2 비-JSON 데이터

비-JSON 직렬화는 대응되는 데이터 형태와 상당히 다를 수 있으며, 파싱을 위해 여러 단계를 요구할 수 있습니다.

예를 들어 이전의 "when" 예를 application/x-www-form-urlencoded로 직렬화하면 ASCII 문자열 when=1985-04-12T23%3A20%3A50.52처럼 보입니다. 이 예는 여전히 모두 문자열 데이터이기 때문에 간단합니다. JSON과의 차이는 URI 퍼센트 인코딩과 구분자 문법(=가 JSON 문법 및 인용 대신 사용)뿐입니다.

그러나 많은 비-JSON 텍스트 기반 포맷은 복잡할 수 있으며, 텍스트를 올바르게 스키마 준비된 데이터 구조로 파싱하려면 적절한 스키마들을 검사해야 할 수 있습니다. 이러한 포맷으로 직렬화하려면 유효화된 데이터를 사용하거나 동일한 스키마 검사를 수행해야 합니다.

스키마를 검사할 때, 시작 스키마가 주어지면 구현체는 MUST 해당 스키마와 그로부터 $refallOf 키워드만을 따라 도달할 수 있는 모든 스키마를 검사해야 합니다. 이러한 스키마들은 어떤 인스턴스에도 적용되는 것으로 보장됩니다. 스키마에서 type을 찾을 때, type 키워드의 값이 타입 목록이고 직렬화된 값이 목록 내의 둘 이상의 타입으로 성공적으로 파싱될 수 있으며, 다른 발견 가능한 type 키워드가 실제 요구 타입을 명확히 하지 않는 경우, 동작은 구현에 의해 정의됩니다. type을 포함하지 않는 스키마 객체는, 다른 키워드가 존재하더라도 모든 타입을 허용하는 것으로 간주되어야 합니다 (예: maximum는 숫자에 적용되지만 인스턴스가 숫자임을 요구하지는 않습니다).

구현체는 oneOf 또는 $dynamicRef 같은 다른 키워드의 서브스키마나 가능한 참조 대상을 검사할 수는 있으나 (MAY), 모호성을 해결하려 해서는 안 됩니다 (MUST NOT). 예를 들어, 구현체가 anyOf를 검사하기로 선택하면 다음 스키마는:

anyOf:
- type: number
  minimum: 0
- type: number
  maximum: 100

명확하게 숫자 타입을 나타내지만, 다음 스키마는:

anyOf:
- type: number
- maximum: 100

모호합니다. 두 번째 서브스키마는 모든 타입을 허용하기 때문입니다.

스키마 검색 요구사항이 제한적이므로, 검증된 데이터에 접근할 수 있는 직렬화기는 가능하면 데이터를 검사해야 합니다 (MUST); 런타임 데이터를 다루지 않거나 검증된 데이터에 접근할 수 없는 구현체(예: 코드 생성기)는 스키마 검사를 사용해야 합니다.

JSON Schema에서 특정 타입에 적용되는 키워드(예: pattern는 문자열에, minimum은 숫자에 적용)는 데이터가 실제로 그 타입일 것을 요구하거나 암시하지 않는다는 점을 다시 상기하십시오.

다음은 이러한 프로세스의 예제로, 다음 OpenAPI 컴포넌트가 주어졌을 때:

components:
  requestBodies:
    Form:
      content:
        application/x-www-form-urlencoded:
          schema:
            $ref: "#/components/schemas/FormData"
          encoding:
            extra:
              contentType: application/xml
  schemas:
    FormData:
      type: object
      properties:
        code:
          allOf:
          - type: [string, number]
            pattern: "1"
            minimum: 0
          - type: string
            pattern: "2"
        count:
          type: integer
        extra:
          type: object

그리고 아래 요청 본문을 데이터 형태로 파싱해야 한다고 하면:

code=1234&count=42&extra=%3Cinfo%3Eabc%3C/info%3E

우리는 먼저 스키마에서 properties 또는 다른 프로퍼티 정의 키워드를 찾아야 하며, 각 프로퍼티 스키마를 해당 프로퍼티의 type 키워드를 검색하기 위한 시작점으로 사용해야 합니다(정확한 순서는 구현에 따라 다름):

  • #/components/requestBodies/Form/content/application~1x-www-form-urlencoded/schema (초기 시작 스키마, 오직 $ref만 있음)
  • #/components/schemas/FormData ($ref를 따라가며 properties를 찾음)
  • #/components/schemas/FormData/properties/code (code 프로퍼티의 시작점 스키마)
  • #/components/schemas/FormData/properties/code/allOf/0 (allOf를 따라가며 type: [string, number]를 찾음)
  • #/components/schemas/FormData/properties/code/allOf/1 (allOf를 따라가며 type: string를 찾음)
  • #/components/schemas/FormData/properties/count (count 프로퍼티의 시작점 스키마, type: integer를 찾음)
  • #/components/schemas/FormData/properties/extra (extra 프로퍼티의 시작점 스키마, type: object를 찾음)

code에 대해서는 먼저 모호한 type을 발견했지만, 이후에 하나의 가능성만 유효하도록 하는 다른 type 키워드를 발견했습니다.

이 검사를 통해 code는 숫자처럼 보이지만 문자열인 것으로 판단되고, count는 스키마 검증 이전에 숫자로 파싱되어야 한다는 것을 알게 됩니다. 또한 extra 문자열은 실제로 info 프로퍼티를 포함하는 객체의 XML 직렬화라는 것도 알 수 있습니다. 이는 이 직렬화의 데이터 형태가 다음 JSON 객체와 동등하다는 것을 의미합니다:

{
  "code": "1234",
  "count": 42
  "extra": {
    "info": "abc"
  }
}

이 객체를 직렬화하려면 또한 프로퍼티를 인코딩 객체와 연관시켜야 하며, 기본 contentType 값을 결정하기 위해 검사가 필요할 수 있습니다. 검증된 데이터에 접근할 수 없다면, 스키마 검사 과정은 파싱을 위한 경우와 동일합니다.

이 예에서 codecount는 원시 타입이고 encoding 필드에 나타나지 않으므로 일반 텍스트로 직렬화됩니다. 그러나 extra 필드는 객체로 기본적으로 JSON으로 직렬화되지만, encoding 필드의 extra 항목은 이를 XML로 직렬화하라고 지시합니다.

4.24.4.3 바이너리 데이터 다루기

OAS는 원시(raw) 또는 인코딩된(encoded) 바이너리 데이터를 설명할 수 있습니다.

  • 원시 바이너리는 전체 HTTP 메시지 본문으로 바이너리 페이로드를 보내거나 바이너리 파트를 허용하는 multipart/* 페이로드의 일부로 사용할 때와 같이 인코딩되지 않은 바이너리 데이터를 허용하는 경우에 사용됩니다.
  • 인코딩된 바이너리application/json 또는 application/x-www-form-urlencoded와 같은 텍스트 전용 포맷에 바이너리 데이터가 포함될 때 사용됩니다(메시지 본문 또는 URL 쿼리 문자열 모두 해당).

다음 표는 스키마 객체 키워드를 바이너리 데이터에 사용하는 방법을 보여주며, 예제로 image/png를 사용합니다. 모든 바이너리 미디어 타입(예: application/octet-stream)은 바이너리 콘텐츠를 나타내기에 충분합니다.

키워드 원시 인코딩된 설명
type 생략 string 원시 바이너리는 type의 범위 밖
contentMediaType image/png image/png 중복되는 경우 생략할 수 있습니다(아래 참조)
contentEncoding 생략 base64 또는 base64url 다른 인코딩들도 허용됩니다(자세한 내용은 명세 참조)

contentEncoding로 표시된 인코딩은 데이터를 7비트 ASCII 텍스트로 표현하기 위해 크기를 늘리는 것이며, 이는 HTTP의 Content-Encoding 헤더(메시지 본문이 압축되었는지 여부 및 압축 방법을 나타내며 이 섹션에서 설명된 모든 콘텐츠 직렬화 이후에 적용됨)와는 관련이 없습니다. HTTP는 인코딩되지 않은 바이너리 메시지 본문을 허용하므로 전체 메시지 본문에 대한 base64 같은 인코딩을 표기하는 표준화된 HTTP 헤더는 없습니다.

base64urlcontentEncoding으로 사용하면 쿼리 문자열 및 application/x-www-form-urlencoded 유형의 메시지 본문에 필요한 URL 인코딩이 이미 인코딩된 바이너리 데이터를 추가로 인코딩할 필요가 없습니다.

contentMediaType 키워드는 미디어 타입이 이미 설정되어 있으면 중복입니다:

스키마 객체가 OAS를 인식하지 못하는 JSON Schema 구현체에 의해 처리될 경우, 중복이더라도 contentMediaType을 포함하는 것이 유용할 수 있습니다. 그러나 contentMediaType이 관련 미디어 타입 객체나 인코딩 객체와 모순되면 contentMediaType은 무시되어야 합니다 (SHALL).

스트리밍 바이너리 페이로드에 대한 지침은 완전 콘텐츠 대 스트리밍 콘텐츠를 참조하십시오.

4.24.4.3.1 스키마 평가와 바이너리 데이터

바이너리 데이터를 직접 지원하는 JSON Schema 구현체는 많지 않습니다. 이는 JSON Schema의 필수 부분이 아니기 때문입니다.

바이너리 인스턴스를 직접 지원하지 않는 JSON Schema 구현체를 가진 OAS 구현체는 바이너리 데이터 다루기에 따라 스키마를 검사하고 적용해야 합니다. 전체 인스턴스가 바이너리일 경우에는 관련 키워드가 적기 때문에 비교적 간단합니다.

그러나 multipart 미디어 타입은 바이너리와 텍스트 기반 데이터를 혼합할 수 있어 구현체는 스키마 평가에 대해 두 가지 옵션을 가질 수 있습니다:

  1. 플레이스홀더 값을 사용한다 — 바이너리 데이터에 대한 어떤 어설션도 적용되지 않으며, 조건부 스키마 키워드가 플레이스홀더 값을 다르게 처리하지 않을 것이라고 가정합니다(예: 문자열이 바이너리 플레이스홀더로 사용되면 평소 문자열로 취급되어 다른 서브스키마나 키워드의 영향을 받을 수 있음).
  2. 스키마들을 검사하여 적절한 키워드(properties, prefixItems 등)를 찾아 서브스키마를 분해하고 바이너리와 JSON 호환 데이터에 각각 따로 적용한다.
4.24.4.3.2 OAS 3.0에서의 바이너리 설명 마이그레이션

다음 표는 OAS 3.0의 바이너리 데이터 설명에서 마이그레이션하는 방법을 보여줍니다. 예로 image/png를 계속 사용합니다:

OAS < 3.1 OAS >= 3.1 설명
type: string
format: binary
contentMediaType: image/png 중복되는 경우 생략 가능하며, 종종 빈 스키마 객체가 됩니다
type: string
format: byte
type: string
contentMediaType: image/png
contentEncoding: base64
base64 문자열을 URL 안전하게 다시 인코딩하는 것을 피하기 위해 base64url를 사용할 수 있습니다

4.24.5 주석을 통한 확장 검증

JSON Schema Draft 2020-12는 주석 수집을 지원하며, 인식되지 않은 키워드를 주석으로 처리하는 것을 포함합니다. OAS 구현체는 이러한 주석을, 선언된 JSON Schema 어휘의 일부로 인식되지 않는 확장을 포함하여 추가 검증의 근거로 사용할 수 있습니다 (MAY). JSON Schema Draft 2020-12는 확장에 대해 x- 접두사를 요구하지 않는다는 점에 유의하십시오.

4.24.5.1 비검증 제약 키워드

format 키워드(기본 format-annotation 어휘 사용 시)contentMediaType, contentEncoding, 및 contentSchema 키워드는 데이터에 대한 제약을 정의하지만, 직접적으로 검증되는 대신 주석으로 취급됩니다. 확장 검증은 이러한 제약을 강제할 수 있는 한 방법입니다 (MAY).

4.24.5.2 readOnlywriteOnly 검증

readOnlywriteOnly 키워드는 주석입니다. JSON Schema는 검증하는 데이터가 어떻게 사용되는지 알지 못합니다. 이러한 키워드의 검증은 주석, 읽기/쓰기 방향, (관련 있는 경우) 필드의 현재 값을 확인하여 수행할 수 있습니다 (MAY). JSON Schema Validation Draft 2020-12 섹션 9.4는 이러한 키워드의 기대 동작을 정의하며, 리소스(“소유 권한자”로 설명)는 MAY readOnly 필드를 무시하거나 오류로 처리할 수 있습니다.

필드가 요구되며 동시에 읽기 전용인 경우, 특히 값이 변경되지 않았다면 PUT에서 readOnly: true 제약을 무시하는 것이 유익할 수 있습니다. 이는 GET에서 필드를 올바르게 요구하면서 동일한 표현 및 스키마를 PUT에도 계속 사용할 수 있게 합니다. 읽기 전용 필드를 제거하는 것은 클라이언트에게 부담이 되며, 특히 JSON 데이터가 복잡하거나 중첩되어 있는 경우 그렇습니다.

readOnly의 동작은 특히 이 사양의 3.0 버전에서 지정된 것과 다르다는 점에 유의하십시오.

4.24.6 데이터 모델링 기법

4.24.6.1 구성 및 상속(다형성)

OpenAPI 명세는 JSON Schema의 allOf 키워드를 사용하여 모델 정의를 결합하고 확장할 수 있게 하여 모델 구성을 제공합니다. allOf는 개별적으로 검증되지만 함께 단일 객체를 구성하는 객체 정의의 배열을 취합니다.

구성은 모델 확장성을 제공하지만 모델 간 계층을 의미하지는 않습니다.

JSON Schema는 또한 anyOfoneOf 키워드를 제공하여, 각각 배열 내의 스키마 중 적어도 하나 또는 정확히 하나가 유효해야 함을 정의할 수 있게 합니다. allOf의 경우와 마찬가지로, 스키마들은 독립적으로 검증됩니다. 이러한 키워드는 단일 필드가 여러 타입의 값을 허용할 수 있는 다형성을 설명하는 데 사용될 수 있습니다.

OpenAPI 명세는 discriminator 필드를 추가하여 JSON Schema의 다형성 지원을 확장합니다. 이 필드의 값은 판별자 객체입니다. 사용될 때 판별자 객체는 anyOf 또는 oneOf의 어떤 스키마가 모델 구조를 검증할 것으로 예상되는지 힌트를 제공합니다. 판별 속성은 필수로 정의될 수도 있고 선택적으로 정의될 수도 있지만, 선택적 속성으로 정의된 경우 판별자 객체는 판별 속성이 없을 때 어느 스키마가 사용될지 지정하는 defaultMapping 필드를 반드시 포함해야 합니다 (MUST).

상속 인스턴스의 판별 속성 값을 정의하는 방법은 두 가지가 있습니다.

  • 스키마 이름을 사용합니다.
  • 스키마 이름을 재정의하여 속성을 새로운 값으로 덮어씁니다. 새로운 값이 존재하면 스키마 이름보다 우선합니다.
4.24.6.2 제네릭(템플릿) 데이터 구조

구현체는 JSON Schema의 동적 참조 기능을 사용하여 제네릭 또는 템플릿 데이터 구조를 정의하는 것을 SHOULD 지원해야 합니다:

  • $dynamicAnchor$dynamicRef가 해석될 수 있는 가능한 스키마 집합(기본 플레이스홀더 스키마 포함)을 식별합니다.
  • $dynamicRef는 스키마 진입점에서 참조까지의 경로에서 첫 번째로 일치하는 $dynamicAnchor로 해석됩니다(데이터 사양에 설명된 대로).

예제는 아래의 스키마 객체 예제 섹션에 포함되어 있으며, 추가 정보는 Learn OpenAPI 사이트의 “Dynamic References” 페이지를 참조하십시오.

4.24.6.3 주석이 포함된 열거형

스키마 객체의 enum 키워드는 개별 값에 설명이나 다른 정보를 연결하는 것을 허용하지 않습니다.

구현체는 각 서브스키마가 const 키워드와 title 또는 description 같은 주석을 포함하는 oneOf 또는 anyOf를 열거형으로 인식하는 것을 지원할 수 있습니다(MAY). 이 패턴의 정확한 동작은 JSON Schema에서 요구하는 것 이상의 부분은 구현체에 의해 정의됩니다.

4.24.6.4 XML 모델링

xml 필드는 JSON 정의를 XML로 변환할 때 추가 정의를 허용합니다. XML 객체는 사용 가능한 옵션에 대한 추가 정보를 포함합니다.

4.24.7 스키마 방언 지정

툴링이 특정 리소스를 어떤 방언 또는 메타스키마(JSON Schema Core, JSON Schema Validation, OpenAPI Schema dialect 또는 커스텀 메타스키마)로 처리할지 결정할 수 있어야 합니다.

$schema 키워드는 스키마 리소스 루트인 모든 스키마 객체에 포함될 수 있으며(MAY), 포함된 경우 스키마를 처리할 때 어떤 방언을 사용할지 결정하는 데 사용되어야 합니다(MUST). 이는 기본 Draft 2020-12 이외의 JSON Schema 초안과 호환되는 스키마 객체를 사용할 수 있게 합니다. 툴링은 OAS 방언 스키마 ID를 지원해야 하며(MUST), 추가적인 $schema 값들을 지원할 수 있습니다(MAY).

OpenAPI 문서 내의 모든 스키마 객체에 대한 다른 기본 $schema 값을 허용하려면 OpenAPI 객체 내에 jsonSchemaDialect 값을 설정할 수 있습니다. 이 기본값이 설정되지 않으면 OAS 방언 스키마 ID가 이러한 스키마 객체에 대해 사용되어야 합니다( MUST ). 리소스 루트 스키마 객체 내의 $schema 값은 항상 기본값을 재정의합니다.

단독 JSON Schema 문서가 $schema를 설정하지 않거나, OpenAPI 설명 문서 내의 스키마 객체가 완전한 문서가 아닌 경우, 방언은 OAS 방언으로 가정하는 것이 권장됩니다(SHOULD). 그러나 최대 상호 운용성을 위해 OpenAPI 설명 작성자는 이러한 문서에서 명시적으로 $schema를 설정하는 것이 권장됩니다(RECOMMENDED).

4.24.8 스키마 객체 예제

4.24.8.1 원시 예제
type: string
format: email
4.24.8.2 간단한 모델
type: object
required:
  - name
properties:
  name:
    type: string
  address:
    $ref: '#/components/schemas/Address'
  age:
    type: integer
    format: int32
    minimum: 0
4.24.8.3 맵/사전 프로퍼티를 가진 모델

간단한 문자열-문자열 매핑의 경우:

type: object
additionalProperties:
  type: string

문자열-모델 매핑의 경우:

type: object
additionalProperties:
  $ref: '#/components/schemas/ComplexModel'
4.24.8.4 주석된 열거형을 가진 모델
oneOf:
  - const: RGB
    title: Red, Green, Blue
    description: Specify colors with the red, green, and blue additive color model
  - const: CMYK
    title: Cyan, Magenta, Yellow, Black
    description: Specify colors with the cyan, magenta, yellow, and black subtractive color model
4.24.8.5 예제가 있는 모델
type: object
properties:
  id:
    type: integer
    format: int64
  name:
    type: string
required:
  - name
examples:
  - name: Puma
    id: 1
4.24.8.6 구성을 가진 모델들
components:
  schemas:
    ErrorModel:
      type: object
      required:
        - message
        - code
      properties:
        message:
          type: string
        code:
          type: integer
          minimum: 100
          maximum: 600
    ExtendedErrorModel:
      allOf:
        - $ref: '#/components/schemas/ErrorModel'
        - type: object
          required:
            - rootCause
          properties:
            rootCause:
              type: string
4.24.8.7 다형성 지원 모델

다음 예제는 Pet 모델이 petType 속성으로 구분되는 고양이 또는 개를 나타낼 수 있음을 설명합니다. 각 반려동물 유형은 기본 Pet 모델 외에 다른 속성을 가집니다. petType 속성이 없거나 cat 또는 dog와 일치하지 않으면 인스턴스는 유효하지 않습니다.

components:
  schemas:
    Pet:
      type: object
      properties:
        name:
          type: string
      required:
        - name
        - petType
      oneOf:
        - $ref: '#/components/schemas/Cat'
        - $ref: '#/components/schemas/Dog'
    Cat:
      description: A pet cat
      type: object
      properties:
        petType:
          const: 'cat'
        huntingSkill:
          type: string
          description: The measured skill for hunting
          enum:
            - clueless
            - lazy
            - adventurous
            - aggressive
      required:
        - huntingSkill
    Dog:
      description: A pet dog
      type: object
      properties:
        petType:
          const: 'dog'
        packSize:
          type: integer
          format: int32
          description: the size of the pack the dog is from
          default: 0
          minimum: 0
      required:
        - packSize
4.24.8.8 판별자 객체를 포함한 다형성 지원 모델

다음 예제는 이전 섹션의 예제를 확장하여 Pet 스키마에 판별자 객체를 추가합니다. 판별자 객체는 API 소비자에게 주는 힌트일 뿐이며 스키마의 검증 결과를 변경하지 않음을 유의하십시오.

components:
  schemas:
    Pet:
      type: object
      discriminator:
        propertyName: petType
        mapping:
          cat: '#/components/schemas/Cat'
          dog: '#/components/schemas/Dog'
      properties:
        name:
          type: string
      required:
        - name
        - petType
      oneOf:
        - $ref: '#/components/schemas/Cat'
        - $ref: '#/components/schemas/Dog'
    Cat:
      description: A pet cat
      type: object
      properties:
        petType:
          const: 'cat'
        huntingSkill:
          type: string
          description: The measured skill for hunting
          enum:
            - clueless
            - lazy
            - adventurous
            - aggressive
      required:
        - huntingSkill
    Dog:
      description: A pet dog
      type: object
      properties:
        petType:
          const: 'dog'
        packSize:
          type: integer
          format: int32
          description: the size of the pack the dog is from
          default: 0
          minimum: 0
      required:
        - petType
        - packSize
4.24.8.9 allOf 및 판별자 객체를 사용한 다형성 지원 모델

allOf를 사용하여 다형성 모델을 설명하는 것도 가능합니다. 다음 예제는 판별자 객체와 함께 allOf를 사용하여 다형성 Pet 모델을 설명합니다.

components:
  schemas:
    Pet:
      type: object
      discriminator:
        propertyName: petType
      properties:
        name:
          type: string
        petType:
          type: string
      required:
        - name
        - petType
    Cat: # "Cat" will be used as the discriminating value
      description: A representation of a cat
      allOf:
        - $ref: '#/components/schemas/Pet'
        - type: object
          properties:
            huntingSkill:
              type: string
              description: The measured skill for hunting
              enum:
                - clueless
                - lazy
                - adventurous
                - aggressive
          required:
            - huntingSkill
    Dog: # "Dog" will be used as the discriminating value
      description: A representation of a dog
      allOf:
        - $ref: '#/components/schemas/Pet'
        - type: object
          properties:
            packSize:
              type: integer
              format: int32
              description: the size of the pack the dog is from
              default: 0
              minimum: 0
          required:
            - packSize
4.24.8.10 제네릭 데이터 구조 모델
components:
  schemas:
    genericArrayComponent:
      $id: fully_generic_array
      type: array
      items:
        $dynamicRef: '#generic-array'
      $defs:
        allowAll:
          $dynamicAnchor: generic-array
    numberArray:
      $id: array_of_numbers
      $ref: fully_generic_array
      $defs:
        numbersOnly:
          $dynamicAnchor: generic-array
          type: number
    stringArray:
      $id: array_of_strings
      $ref: fully_generic_array
      $defs:
        stringsOnly:
          $dynamicAnchor: generic-array
          type: string
    objWithTypedArray:
      $id: obj_with_typed_array
      type: object
      required:
      - dataType
      - data
      properties:
        dataType:
          enum:
          - string
          - number
      oneOf:
      - properties:
          dataType:
            const: string
          data:
            $ref: array_of_strings
      - properties:
          dataType:
            const: number
          data:
            $ref: array_of_numbers

4.25 판별자 객체

요청 본문이나 응답 페이로드가 여러 다른 스키마 중 하나일 수 있는 경우, 가능한 스키마를 설명하기 위해 JSON Schema의 anyOf 또는 oneOf 키워드를 사용해야 합니다(참조: 구성 및 상속).

다형성 스키마는 MAY 판별자 객체(Discriminator Object)를 포함할 수 있으며, 이 객체는 anyOf 또는 oneOf 중 어느 스키마가 모델의 구조를 검증할 것으로 예상되는지에 대한 힌트로 사용할 수 있는 속성의 이름을 정의합니다. 이 힌트는 직렬화, 역직렬화 및 검증을 지원하는 데 사용될 수 있습니다. 판별자 객체는 명시적 또는 암시적으로 명명된 속성의 가능한 값들을 대체 스키마와 연관시킴으로써 이를 수행합니다.

참고: discriminator는 스키마의 검증 결과를 변경해서는 안 됩니다(MUST NOT).

4.25.1 고정 필드

필드 이름 유형 설명
propertyName string REQUIRED. 페이로드에서 판별 값이 들어가는 판별 속성의 이름입니다. 판별 속성은 MAY 필수로 정의되거나 선택적으로 정의될 수 있지만, 선택적으로 정의된 경우 Discriminator Object는 판별 속성이 없을 때 어떤 스키마가 모델 구조를 검증할 것으로 예상되는지 지정하는 defaultMapping 필드를 반드시 포함해야 합니다.
mapping Map[string, string] 페이로드 값과 스키마 이름 또는 URI 참조 간의 매핑을 담는 객체입니다.
defaultMapping string 페이로드에 판별 속성이 없거나 명시적/암시적 매핑이 없는 값을 포함할 때 모델의 구조를 검증할 것으로 예상되는 스키마 이름 또는 스키마에 대한 URI 참조입니다.

이 객체는 MAY 명세 확장(Specification Extensions)으로 확장될 수 있습니다.

4.25.2 판별자 객체 사용 조건

판별자 객체는 합성 키워드 중 하나인 oneOf, anyOf, allOf을 사용할 때에만 합법적입니다.

oneOfanyOf의 경우, 해당 키워드가 discriminator와 인접해 있다면 모든 가능한 스키마는 MUST 명시적으로 나열되어야 합니다.

중복을 피하기 위해, 판별자는 부모 스키마 정의에 추가될 수 있으며 부모 스키마를 allOf로 확장하는 모든 스키마는 대체 스키마로 사용될 수 있습니다.

allOf 형태의 discriminator는 검증 용도 이외의 사용 사례에만 유용합니다; 이 형태의 discriminator로 부모 스키마를 검증하는 것은 자식 스키마를 검색하거나 검증에 사용하는 동작을 수행하지 않습니다. 이는 discriminator가 검증 결과를 변경할 수 없고, 부모 스키마를 자식 스키마와 연결하는 표준 JSON Schema 키워드가 없기 때문입니다.

위에서 설명하지 않은 oneOf, anyOf, allOfdiscriminator의 어떤 구성도 정의되지 않습니다.

4.25.3 값을 스키마에 매핑하는 옵션

propertyName에 명시된 이름의 속성 값은 Components Object 아래의 관련 스키마 이름으로 사용됩니다. 단, 해당 값에 대해 mapping이 존재하는 경우는 예외입니다. mapping 엔트리는 특정 속성 값을 다른 스키마 컴포넌트 이름이나 URI로 식별된 스키마에 매핑합니다. 암시적 또는 명시적 스키마 컴포넌트 이름을 사용할 때는 인라인 oneOf 또는 anyOf 서브스키마는 고려되지 않습니다. 스키마 이름과 유효한 상대 URI 참조 둘 다가 될 수 있는 mapping 값 또는 defaultMapping 값의 동작은 구현에 따라 결정되지만, 스키마 이름으로 취급하는 것이 권장됩니다. 모호한 값(예: "foo")을 모든 구현체에서 상대 URI 참조로 처리하려면 작성자는 반드시 "." 경로 세그먼트(예: "./foo")로 접두사를 붙여야 합니다.

매핑 키는 MUST 문자열 값이어야 하지만, 도구는 비교를 위해 응답 값을 문자열로 변환할 수 MAY 있습니다. 다만 이러한 변환의 정확한 방식은 구현에 따라 다릅니다.

4.25.4 선택적 판별 속성

판별 속성이 선택적으로 정의된 경우, Discriminator Object는 페이로드에 판별 속성이 없거나 명시적/암시적 매핑이 없는 값을 포함할 때 모델의 구조를 검증할 것으로 예상되는 스키마를 지정하는 defaultMapping 필드를 반드시 포함해야 합니다. 이는 판별 속성이 누락되더라도 스키마가 여전히 올바르게 검증되도록 합니다.

선택적 판별 속성의 주요 사용 사례는 판별자를 추가해도 판별 속성을 제공하지 않는 기존 클라이언트를 깨뜨리지 않도록 허용하는 것입니다.

판별 속성이 선택적일 때, 판별 속성 값을 정의하는 각 서브스키마는 해당 속성을 필수로 정의하는 것이 중요합니다. 이는 더 이상 부모 스키마에서 강제되지 않기 때문입니다.

defaultMapping 스키마는 판별 속성이 존재하지만 명시적/암시적 매핑이 없는 값을 포함할 때에도 모델의 구조를 검증할 것으로 예상됩니다. 이는 일반적으로 defaultMapping 스키마에서 판별 속성의 매핑된 값들을 제외하는 방식으로 표현됩니다, 예:

OtherPet:
  type: object
  properties:
    petType:
      not:
        enum: ['cat', 'dog']

이렇게 하면 defaultMapping 스키마가 매핑된 판별 값이 포함된 페이로드를 검증하는 것을 방지하여, 다형성이 oneOf로 설명될 때 검증 실패를 일으키지 않게 합니다.

4.25.5 예제

이 예제들에서는 모든 스키마가 OAD의 진입 문서에 있다고 가정합니다; 참조된 문서에서의 discriminator 처리에 대해서는 암시적 연결 해결을 참조하세요.

OAS 3.x에서 응답 페이로드는 임의의 여러 타입 중 정확히 하나일 수 있습니다(MAY):

MyResponseType:
  oneOf:
    - $ref: '#/components/schemas/Cat'
    - $ref: '#/components/schemas/Dog'
    - $ref: '#/components/schemas/Lizard'

이는 유효한 페이로드가 Cat, Dog, 또는 Lizard가 설명하는 스키마 중 정확히 하나와 일치해야 함을 의미합니다. oneOf의 역직렬화는 어떤 스키마가 페이로드와 일치하는지 판단해야 하므로 비용이 많이 드는 작업이 될 수 있습니다. 이 문제는 anyOf의 경우에도 존재합니다. discriminator는 일치하는 스키마 선택의 효율성을 높이기 위한 "힌트"로 사용될 수 있습니다. Discriminator ObjectoneOf의 검증 결과를 변경할 수 없으며, 단지 역직렬화를 더 효율적으로 하고 오류 메시지를 개선하는 데 도움을 줄 뿐입니다. 어떤 필드가 인스턴스와 일치할 것으로 예상되는 스키마를 알려주는지 명시할 수 있습니다:

MyResponseType:
  oneOf:
    - $ref: '#/components/schemas/Cat'
    - $ref: '#/components/schemas/Dog'
    - $ref: '#/components/schemas/Lizard'
  discriminator:
    propertyName: petType

이제 응답 페이로드에 petType이라는 이름의 속성이 반드시 존재해야 한다고 기대하며(MUST), 그 값은 OpenAPI 설명에 정의된 스키마 이름에 대응합니다. 따라서 다음과 같은 페이로드는:

{
  "id": 12345,
  "petType": "Cat"
}

Cat 스키마가 이 페이로드와 일치할 것으로 예상된다는 것을 나타냅니다.

판별 속성 값이 스키마 이름과 일치하지 않거나 암시적 매핑이 불가능한 경우에는 선택적 mapping 정의를 사용할 수 있습니다:

MyResponseType:
  oneOf:
    - $ref: '#/components/schemas/Cat'
    - $ref: '#/components/schemas/Dog'
    - $ref: '#/components/schemas/Lizard'
    - $ref: https://gigantic-server.com/schemas/Monster/schema.json
  discriminator:
    propertyName: petType
    mapping:
      dog: '#/components/schemas/Dog'
      monster: https://gigantic-server.com/schemas/Monster/schema.json

여기서 판별 값 dog은 기본 암시적 값인 #/components/schemas/dog 대신 #/components/schemas/Dog 스키마로 매핑됩니다. 판별 값이 암시적 또는 명시적 매핑과 일치하지 않으면 어떤 스키마도 결정할 수 없으므로 검증은 SHOULD 실패해야 합니다.

anyOf 구성과 함께 사용할 때, 판별자는 단일 페이로드를 만족할 수 있는 여러 스키마가 있을 때 직렬화/역직렬화의 모호성을 피하는 데 도움이 됩니다.

판별 속성이 선택적으로 정의된 경우, Discriminator Object는 페이로드에 판별 속성이 없을 때 anyOf 또는 oneOf 중 어느 스키마가 모델의 구조를 검증할 것으로 예상되는지를 지정하는 defaultMapping 필드를 포함해야 합니다. 이를 통해 판별 속성이 없더라도 스키마가 올바르게 검증될 수 있습니다.

예를 들면:

MyResponseType:
  oneOf:
    - $ref: '#/components/schemas/Cat'
    - $ref: '#/components/schemas/Dog'
    - $ref: '#/components/schemas/Lizard'
    - $ref: '#/components/schemas/OtherPet'
  discriminator:
    propertyName: petType
    defaultMapping: OtherPet
OtherPet:
  type: object
  properties:
    petType:
      not:
        enum: ['Cat', 'Dog', 'Lizard']

이 예에서, 페이로드에 petType 속성이 없거나 그 값이 "Cat", "Dog" 또는 "Lizard"가 아니면 해당 페이로드는 OtherPet 스키마로 검증되어야 합니다.

다음 예는 부모에서 모든 자식 스키마를 참조할 필요를 피하는 allOf 사용을 보여줍니다:

components:
  schemas:
    Pet:
      type: object
      required:
        - petType
      properties:
        petType:
          type: string
      discriminator:
        propertyName: petType
        mapping:
          dog: Dog
    Cat:
      allOf:
        - $ref: '#/components/schemas/Pet'
        - type: object
          # all other properties specific to a `Cat`
          properties:
            name:
              type: string
    Dog:
      allOf:
        - $ref: '#/components/schemas/Pet'
        - type: object
          # all other properties specific to a `Dog`
          properties:
            bark:
              type: string
    Lizard:
      allOf:
        - $ref: '#/components/schemas/Pet'
        - type: object
          # all other properties specific to a `Lizard`
          properties:
            lovesRocks:
              type: boolean

Pet 스키마로 검증할 때, 다음과 같은 페이로드는:

{
  "petType": "Cat",
  "name": "Misty"
}

#/components/schemas/Cat 스키마가 일치할 것으로 예상됩니다. 마찬가지로 다음 페이로드는:

{
  "petType": "dog",
  "bark": "soft"
}

매핑 요소의 dog 항목이 Dog로 매핑되어 있으므로 #/components/schemas/Dog에 대응합니다.

4.26 XML 객체

XML 모델 정의를 더 세밀하게 조정할 수 있게 하는 메타데이터 객체입니다. Schema Object를 XML과 함께 사용할 때 XML Object가 없으면 동작은 XML Object의 기본 필드 값에 의해 결정됩니다.

4.26.1 고정 필드

필드 이름 유형 설명
nodeType string element, attribute, text, cdata, 또는 none 중 하나입니다(자세한 내용은 XML 노드 유형 참조). 기본값은 포함된 Schema Object$ref, $dynamicRef 또는 type: "array"가 있으면 none이고, 그렇지 않으면 element입니다.
name string 스키마에 대응하는 요소/속성의 이름을 설정하여 XML 노드 이름에 따라 추론된 이름을 대체합니다. 이 필드는 nodeTypetext, cdata 또는 none일 경우 무시되어야 합니다(SHALL).
namespace string 네임스페이스 정의의 IRI([RFC3987])입니다. 값은 상대적이지 않은 IRI 형식이어야 합니다(MUST).
prefix string 이름에 사용할 접두사입니다.
attribute boolean 속성 정의가 요소 대신 속성으로 변환되는지 여부를 선언합니다. 기본값은 false입니다. nodeType이 존재하는 경우 이 필드는 있어서는 안 됩니다(MUST NOT).

Deprecated: attribute: true 대신 nodeType: "attribute"를 사용하세요.
wrapped boolean MAY 배열 정의에만 사용될 수 있습니다. 배열이 래핑되는지(예: <books><book/><book/></books>) 또는 래핑되지 않는지(<book/><book/>)를 나타냅니다. 기본값은 false입니다. 이 정의는 type"array"일 때에만 (즉, items 밖에서) 적용됩니다. nodeType이 존재하면 이 필드는 있어서는 안 됩니다(MUST NOT).

Deprecated: wrapped: true 대신 nodeType: "element"를 사용하세요.

객체 데이터에서 XML 문서를 생성할 때 노드의 순서는 정의되지 않습니다. 노드 순서를 제어하려면 정렬된 요소와 텍스트에 설명된 대로 prefixItems를 사용하세요.

다양한 유형의 값을 문자열 표현으로 변환하는 논의는 부록 B를 참조하세요.

이 객체는 MAY 명세 확장으로 확장될 수 있습니다.

4.26.2 XML 노드 유형

각 Schema Object는 nodeType 필드로 지정되는 특정 유형의 XML [DOM] 노드를 설명합니다. 다음은 가능한 값들입니다. 특별 값인 none을 제외하고 이 값들은 DOM 명세에서 숫자 값(괄호 안)이 있습니다:

  • element (1): 스키마가 요소를 나타내며 그 내용을 설명합니다
  • attribute (2): 스키마가 속성을 나타내며 그 값을 설명합니다
  • text (3): 스키마가 텍스트 노드(구문 분석된 문자 데이터)를 나타냅니다
  • cdata (4): 스키마가 CDATA 섹션을 나타냅니다
  • none: 스키마가 XML 문서의 어떤 노드에도 대응하지 않으며, 그 서브스키마에 해당하는 노드들은 부모 스키마의 노드 바로 아래에 직접 포함됩니다

none 타입은 재사용을 촉진하기 위해 구조를 암시하지 않고 단지 $ref만 포함하는 스키마와 같이 XML 노드보다 더 많은 Schema Object가 필요한 JSON Schema 구성에 유용합니다.

4.26.2.1 요소 목록 모델링

역사적 호환성을 위해, type: "array"인 스키마는 기본적으로 nodeType: "none"으로 설정되어 각 배열 항목의 노드를 부모 노드 바로 아래에 배치합니다. 이는 또한 XML 노드 이름에 정의된 추론된 이름 동작과 일치합니다.

목록을 감싸는 요소를 생성하려면 type: "array" 스키마에 명시적으로 nodeType: "element"를 설정하세요. 이 경우 래핑 요소 또는 항목 요소 중 하나에 명시적 이름을 설정하여 동일한 추론된 이름이 사용되는 것을 피하는 것이 좋습니다. 기대되는 동작에 대한 예제를 참조하세요.

4.26.2.2 암시적 및 명시적 text 노드

만약 element 노드가 원시 타입(primitive type)을 가지면, 해당 element 노드의 내용에 대한 스키마에 의해 암시적 text 노드가 생성됩니다. 이 노드의 이름은 속성 이름(또는 name 필드)으로 지정됩니다.

요소가 속성과 내용을 모두 가질 경우에는 명시적 text 노드가 필요합니다.

두 개의 text 노드를 인접하게 배치하는 것은 파싱에 모호성을 야기하므로 결과 동작은 구현에 따라 정의됩니다.

4.26.3 XML 노드 이름

elementattribute 노드 유형은 이름이 필요하며, 이 이름은 name 필드로 재정의되지 않는 한 다음 규칙에 따라 스키마에서 추론되어야 합니다(MUST).

  • Components Objectschemas 필드 바로 아래 있는 스키마의 경우, 컴포넌트 이름이 추론된 이름입니다.
  • 속성 스키마 및 속성 스키마 아래의 배열 항목 스키마의 경우, 속성 이름이 추론된 이름입니다.
  • 미디어 타입 객체의 schema 필드 아래의 인라인 스키마와 같은 다른 모든 경우에는 이름을 추론할 수 없으므로 name 필드를 가진 XML Object가 반드시 존재해야 합니다(MUST).

배열을 사용할 때 단수형 대 복수형은 추론되지 않으므로 명시적으로 설정해야 합니다.

4.26.4 네임스페이스 제한

namespace 필드는 XML 네임스페이스의 문법과 일치하도록 의도되었지만 몇 가지 유의사항이 있습니다:

  • 이 명세의 버전 3.1.0, 3.0.3 및 이전 버전은 잘못되게 "절대 URI"라는 용어를 사용했으므로, 프래그먼트를 포함하는 네임스페이스를 사용하는 작성자는 도구 지원을 주의 깊게 확인해야 합니다.
  • XML은 상대 IRI 참조를 허용하지만 권장하지 않으며, 이 명세는 상대 IRI를 명시적으로 금지합니다.

4.26.5 null 값 처리

XML은 기본적으로 null에 해당하는 개념이 없으며, 이 명세의 3.1.1 이전 버전과의 호환성을 유지하기 위해 null 값의 직렬화 동작은 구현에 따라 정의됩니다.

그러나 구현체는 다음과 같이 null 값을 처리하는 것이 SHOULD 합니다:

  • 요소의 경우 xsi:nil="true" 속성을 가진 빈 요소를 생성합니다.
  • 속성의 경우 속성을 생략합니다.
  • 텍스트 및 CDATA 섹션에 대해서는 비텍스트 값을 텍스트로 직렬화하는 논의는 부록 B를 참조하세요.

속성의 경우, 이는 null 값이나 누락된 속성이 모두 속성의 생략으로 직렬화되는 것을 의미합니다. Schema Object는 인메모리 표현을 검증하므로 null과 필수 속성의 조합을 처리할 수 있습니다. 그러나 속성으로서 null을 표현할 분명한 방법이 없으므로 속성 속성은 null을 사용하기보다는 선택적으로 만드는 것이 권장됩니다.

정확한 왕복 동작을 보장하려면, 속성이 생략된 요소를 파싱할 때 구현체는 해당 스키마가 그 값을 허용하면(예: type: ["number", "null"]) 해당 속성에 null을 설정하고, 그렇지 않으면 속성을 생략해야 합니다(예: type: "number").

4.26.6 XML 객체 예제

Schema Objects 다음에는 해당 스키마에 대해 생성된 예제 XML 표현이 따라옵니다. attribute 또는 wrapped를 사용하는 예제는 OpenAPI 사양 버전 3.1을 참조하세요.

4.26.6.1 XML Object 없음

XML Object가 없는 기본 문자열 속성 예제입니다. 이 예제에서는 serializedValue를 사용합니다(나머지 예제는 XML 형태를 문법 강조와 함께 보이기 위해 externalValue를 사용합니다):

application/xml:
  schema:
    type: object
    xml:
      name: document
    properties:
      animals:
        type: string
  examples:
    pets:
      dataValue:
        animals: dog, cat, hamster
      serializedValue: |
        <document>
          <animals>dog, cat, hamster</animals>
        </document>

기본 문자열 배열 속성(nodeType의 기본값은 none):

application/xml:
  schema:
    type: object
    xml:
      name: document
    properties:
      animals:
        type: array
        items:
          type: string
  examples:
    pets:
      dataValue:
        animals:
          - dog
          - cat
          - hamster
      externalValue: ./examples/pets.xml

여기서 ./examples/pets.xml는 다음과 같습니다:

<document>
  <animals>dog</animals>
  <animals>cat</animals>
  <animals>hamster</animals>
</document>
4.26.6.2 XML 이름 대체
application/xml:
  schema:
    type: object
    xml:
      name: document
    properties:
      animals:
        type: string
        xml:
          name: animal
  examples:
    pets:
      dataValue:
        animals:
          - dog
          - cat
          - hamster
      externalValue: ./examples/pets.xml

여기서 ./examples/pets.xml는 다음과 같습니다:

<document>
  <animal>dog</animal>
  <animal>cat</animal>
  <animal>hamster</animal>
</document>
4.26.6.3 XML 속성, 접두사 및 네임스페이스

루트 XML 요소의 이름은 컴포넌트 이름에서 온다는 점에 유의하세요.

components:
  schemas:
    Person:
      type: object
      properties:
        id:
          type: integer
          format: int32
          xml:
            nodeType: attribute
        name:
          type: string
          xml:
            namespace: https://example.com/schema/sample
            prefix: sample
  requestBodies:
    Person:
      content:
        application/xml:
          schema:
            $ref: "#/components/schemas/Person"
          examples:
            Person:
              dataValue:
                id: 123
                name: example
              externalValue: ./examples/Person.xml

여기서 ./examples/Person.xml는 다음과 같습니다:

<Person id="123">
  <sample:name xmlns:sample="https://example.com/schema/sample">example</sample:name>
</Person>
4.26.6.4 XML 배열

요소 이름 변경 예:

application/xml:
  schema:
    type: object
    xml:
      name: document
    properties:
      animals:
        type: array
        items:
          type: string
          xml:
            name: animal
  examples:
    pets:
      dataValue:
        animals:
          - dog
          - cat
          - hamster
      externalValue: ./examples/pets.xml

여기서 ./examples/pets.xml는 다음과 같습니다:

<document>
  <animal>dog</animal>
  <animal>cat</animal>
  <animal>hamster</animal>
</document>

type: "array" 스키마의 name 필드는 기본 nodeTypenone이기 때문에 효과가 없습니다:

application/xml:
  schema:
    type: object
    xml:
      name: document
    properties:
      animals:
        type: array
        xml:
          name: aliens
        items:
          type: string
          xml:
            name: animal
  examples:
    pets:
      dataValue:
        animals:
          - dog
          - cat
          - hamster
      externalValue: ./examples/pets.xml

여기서 ./examples/pets.xml는 다음과 같습니다:

<document>
  <animal>dog</animal>
  <animal>cat</animal>
  <animal>hamster</animal>
</document>

명시적으로 nodeTypeelement로 설정하여 래핑 요소를 생성하더라도 이름이 명시적으로 정의되지 않으면 래핑 요소와 항목 요소에 동일한 이름이 사용됩니다:

application/xml:
  schema:
    type: object
    xml:
      name: document
    properties:
      animals:
        type: array
        xml:
          nodeType: element
        items:
          type: string
  examples:
    pets:
      dataValue:
        animals:
          - dog
          - cat
          - hamster
      externalValue: ./examples/pets.xml

여기서 ./examples/pets.xml는 다음과 같습니다:

<document>
  <animals>
    <animals>dog</animals>
    <animals>cat</animals>
    <animals>hamster</animals>
  </animals>
</document>

위 예제의 이름 문제를 해결하려면 다음 정의를 사용할 수 있습니다:

application/xml:
  schema:
    type: object
    xml:
      name: document
    properties:
      animals:
        type: array
        xml:
          nodeType: element
        items:
          type: string
          xml:
            name: animal
  examples:
    pets:
      dataValue:
        animals:
          - dog
          - cat
          - hamster
      externalValue: ./examples/pets.xml

여기서 ./examples/pets.xml는 다음과 같습니다:

<document>
  <animals>
    <animal>dog</animal>
    <animal>cat</animal>
    <animal>hamster</animal>
  </animals>
</document>

래핑 요소와 항목 요소 이름을 모두 변경하는 예:

application/xml:
  schema:
    type: object
    xml:
      name: document
    properties:
      animals:
        type: array
        xml:
          name: aliens
          nodeType: element
        items:
          type: string
          xml:
            name: animal
  examples:
    pets:
      dataValue:
        animals:
          - dog
          - cat
          - hamster
      externalValue: ./examples/pets.xml

여기서 ./examples/pets.xml는 다음과 같습니다:

<document>
  <aliens>
    <animal>dog</animal>
    <animal>cat</animal>
    <animal>hamster</animal>
  </aliens>
</document>

래핑 요소 이름만 변경하고 항목 요소 이름은 변경하지 않으면:

application/xml:
  schema:
    type: object
    xml:
      name: document
    properties:
      animals:
        type: array
        xml:
          name: aliens
          nodeType: element
        items:
          type: string
  examples:
    pets:
      dataValue:
        animals:
          - dog
          - cat
          - hamster
      externalValue: ./examples/pets.xml

여기서 ./examples/pets.xml는 다음과 같습니다:

<document>
  <aliens>
    <aliens>dog</aliens>
    <aliens>cat</aliens>
    <aliens>hamster</aliens>
  </aliens>
</document>
4.26.6.5 속성과 텍스트를 가진 요소들
application/xml:
  schema:
    type: array
    xml:
      nodeType: element
      name: animals
    items:
      xml:
        name: animal
      properties:
        kind:
          type: string
          xml:
            nodeType: attribute
        name:
          type: string
          xml:
            nodeType: text
  examples:
    pets:
      dataValue:
      - kind: Cat
        name: Fluffy
      - kind: Dog
        name: Fido

여기서 ./examples/pets.xml는 다음과 같습니다:

<animals>
  <animal kind="Cat">Fluffy</animals>
  <animal kind="Dog">Fido</animals>
<animals>
4.26.6.6 CDATA를 가진 참조된 요소

이 예제에서는 $ref만 포함하는 Schema Object에 대해 요소가 생성되지 않습니다(해당 객체의 nodeType 기본값이 none이기 때문). CDATA 섹션을 위해 서브스키마를 생성해야 하며, 그렇지 않으면 내용은 암시적 text 노드로 처리됩니다.

components:
  schemas:
    Documentation:
      type: object
      properties:
        content:
          type: string
          contentMediaType: text/html
          xml:
            nodeType: cdata
  responses:
    content:
      application/xml:
        schema:
          $ref: "#/components/schemas/Documentation"
        examples:
          docs:
            dataValue:
              content: <html><head><title>Awesome Docs</title></head><body></body><html>
            externalValue: ./examples/docs.xml

여기서 ./examples/docs.xml는 다음과 같습니다:

<Documentation>
  <![CDATA[<html><head><title>Awesome Docs</title></head><body></body><html>]]>
</Documentation>

또는 루트 요소 이름을 사용 지점에서 설정하고 컴포넌트에서 루트 요소를 비활성화할 수도 있습니다(이 예에서는 동일한 dataValue가 두 곳에서 사용되며 서로 다른 직렬화가 externalValue로 표시됩니다):

paths:
  /docs:
    get:
      responses:
        "200":
          content:
            application/xml:
              schema:
                xml:
                  nodeType: element
                  name: StoredDocument
                $ref: "#/components/schemas/Documentation"
              examples:
                stored:
                  dataValue:
                    content: <html><head><title>Awesome Docs</title></head><body></body><html>
                  externalValue: ./examples/stored.xml
    put:
      requestBody:
        required: true
        content:
          application/xml:
            schema:
              xml:
                nodeType: element
                name: UpdatedDocument
              $ref: "#/components/schemas/Documentation"
            examples:
              updated:
                dataValue:
                  content: <html><head><title>Awesome Docs</title></head><body></body><html>
                externalValue: ./examples/updated.xml
      responses:
        "201": {}
components:
  schemas:
    Documentation:
      xml:
        nodeType: none
      type: object
      properties:
        content:
          type: string
          contentMediaType: text/html
          xml:
            nodeType: cdata

여기서 ./examples/stored.xml는:

<StoredDocument>
  <![CDATA[<html><head><title>Awesome Docs</title></head><body></body><html>]]>
</StoredDocument>

그리고 ./examples/updated.xml는:

<UpdatedDocument>
  <![CDATA[<html><head><title>Awesome Docs</title></head><body></body><html>]]>
</UpdatedDocument>
4.26.6.7 정렬된 요소와 텍스트

요소의 정확한 순서를 제어하려면 prefixItems 키워드를 사용하세요. 이 접근법에서는 각 항목의 이름을 XML Object로 설정해야 하며, 그렇지 않으면 모두 부모의 이름을 상속받아 특정 순서의 서로 다른 요소임에도 동일한 이름을 갖게 됩니다. 또한 시퀀스를 포함하는 요소를 얻으려면 배열에 대해 nodeType: "element"를 명시적으로 설정해야 합니다.

다음 첫 번째 정렬된 예제는 요소의 순서와 요소에 대한 null의 권장 직렬화를 보여줍니다:

application/xml:
  schema:
    xml:
      nodeType: element
      name: OneTwoThree
    type: array
    minLength: 3
    maxLength: 3
    prefixItems:
    - xml:
        name: One
      type: string
    - xml:
        name: Two
      type: object
      required:
      - unit
      - value
      properties:
        unit:
          type: string
          xml:
            nodeType: attribute
        value:
          type: number
          xml:
            nodeType: text
    - xml:
        name: Three
      type:
      - boolean
      - "null"
  examples:
    OneTwoThree:
      dataValue:
        - Some text
        - unit: cubits
          value: 42
        null
      ]
      externalValue: ./examples/OneTwoThree.xml

여기서 ./examples/OneTwoThree.xml는 다음과 같습니다:

<OneTwoThree>
  <One>Some text</One>
  <Two unit="cubits">42</Two>
  <Three xsi:nil="true" />
</OneTwoThree>

다음 예에서는 요소 이름을 설정해야 하며 텍스트 노드에는 nodeType을 설정해야 합니다.

application/xml:
  schema:
    xml:
      nodeType: element
      name: Report
    type: array
    prefixItems:
    - xml:
        nodeType: text
      type: string
    - xml:
        name: data
      type: number
    - xml:
        nodeType: text
      type: string
  examples:
    Report:
      dataValue:
        - Some preamble text.
        - 42
        - Some postamble text.
      externalValue: ./examples/Report.xml

여기서 ./examples/Report.xml는 다음과 같습니다:

<Report>Some preamble text.<data>42</data>Some postamble text.</Report>
4.26.6.8 NULL 값을 가진 XML

스키마는 XML 문서 자체가 아닌 인메모리 데이터를 검증한다는 점을 기억하세요. 이 예제는 빈 객체와 null이 어떻게 처리되는지를 보여주기 위해 "related"에 대한 속성을 정의하지 않습니다.

application/xml:
  schema:
    xml:
      name: product
    type: object
    required:
    - count
    - description
    - related
    properties:
      count:
        type:
        - number
        - "null"
        xml:
          nodeType: attribute
      rating:
        type: string
        xml:
          nodeType: attribute
      description:
        type: string
      related:
        type:
        - object
        - "null"
  examples:
    productWithNulls:
      dataValue:
        count: null
        description: Thing
        related: null
      externalValue: ./examples/productWithNulls.xml
    productNoNulls:
      dataValue:
        count: 42
        description: Thing
        related: {}
      externalValue: ./examples/productNoNulls.xml

여기서 ./examples/productWithNulls.xml는:

<product>
  <description>Thing</description>
  <related xsi:nil="true" />
</product>

그리고 ./examples/productNoNulls.xml는:

<product count="42">
  <description>Thing</description>
  <related></related>
</product>

4.27 보안 스킴 객체

작업에서 사용할 수 있는 보안 스키마를 정의합니다.

지원되는 스킴은 HTTP 인증, API 키(헤더, 쿠키 매개변수 또는 쿼리 매개변수로 전달되는 경우), 상호 TLS(클라이언트 인증서 사용), RFC6749에 정의된 OAuth2의 일반적인 플로우(implicit, password, client credentials 및 authorization code), RFC8628에 정의된 OAuth2 장치 인증 플로우(device authorization), 그리고 OpenID-Connect-Core를 포함합니다. 참고로 2020년 기준으로 implicit 플로우는 OAuth 2.0 Security Best Current Practice에 따라 폐기될 예정입니다. 대부분의 사용 사례에는 PKCE를 사용하는 Authorization Code Grant 플로우가 권장됩니다.

4.27.1 고정 필드

Field Name Type Applies To Description
type string Any REQUIRED. 보안 스키마의 유형입니다. 유효한 값은 "apiKey", "http", "mutualTLS", "oauth2", "openIdConnect"입니다.
description string Any 보안 스키마에 대한 설명입니다. 풍부한 텍스트 표현을 위해 CommonMark 문법([CommonMark])을 MAY 사용할 수 있습니다.
name string apiKey REQUIRED. 사용될 헤더, 쿼리 또는 쿠키 매개변수의 이름입니다.
in string apiKey REQUIRED. API 키의 위치입니다. 유효한 값은 "query", "header", 또는 "cookie"입니다.
scheme string http REQUIRED. Authorization 헤더에서 사용할 HTTP 인증 스킴의 이름입니다. 자세한 내용은 RFC9110 Section 16.4.1을 참조하세요. 사용되는 값은 IANA Authentication Scheme registry에 등록되는 것이 SHOULD 권장되며, 값은 RFC9110에 정의된 바와 같이 대소문자를 구분하지 않습니다.
bearerFormat string http ("bearer") 베어러 토큰의 포맷이 어떻게 되어 있는지 클라이언트에게 알려주는 힌트입니다. 베어러 토큰은 보통 권한 부여 서버에 의해 생성되므로 이 정보는 주로 문서화 목적입니다.
flows OAuth Flows Object oauth2 REQUIRED. 지원되는 플로우 유형에 대한 구성 정보를 포함하는 객체입니다.
openIdConnectUrl string openIdConnect REQUIRED. OpenID-Connect-Discovery의 provider metadata를 검색하기 위한 Well-known URL입니다.
oauth2MetadataUrl string oauth2 OAuth2 권한 부여 서버 메타데이터([RFC8414])에 대한 URL입니다. TLS가 요구됩니다.
deprecated boolean Any 이 보안 스키마가 더 이상 권장되지 않음을 선언합니다. 소비자는 선언된 스키마의 사용을 SHOULD 자제해야 합니다. 기본값은 false입니다.

이 객체는 MAY Specification Extensions로 확장될 수 있습니다.

4.27.2 보안 스킴 객체 예시

4.27.2.1 기본 인증 예시
type: http
scheme: basic
4.27.2.2 API 키 예시
type: apiKey
name: api-key
in: header
4.27.2.3 JWT Bearer 예시
type: http
scheme: bearer
bearerFormat: JWT
4.27.2.4 MutualTLS 예시
type: mutualTLS
description: Cert must be signed by example.com CA
4.27.2.5 Implicit OAuth2 예시
type: oauth2
flows:
  implicit:
    authorizationUrl: https://example.com/api/oauth/dialog
    scopes:
      write:pets: modify pets in your account
      read:pets: read your pets

4.28 OAuth Flows 객체

지원되는 OAuth 플로우를 구성할 수 있게 합니다.

4.28.1 고정 필드

Field Name Type Description
implicit OAuth Flow Object OAuth Implicit 플로우에 대한 구성
password OAuth Flow Object OAuth Resource Owner Password 플로우에 대한 구성
clientCredentials OAuth Flow Object OAuth Client Credentials 플로우에 대한 구성입니다. 이전에는 OpenAPI 2.0에서 application으로 불렸습니다.
authorizationCode OAuth Flow Object OAuth Authorization Code 플로우에 대한 구성입니다. 이전에는 OpenAPI 2.0에서 accessCode로 불렸습니다.
deviceAuthorization OAuth Flow Object OAuth Device Authorization 플로우에 대한 구성입니다.

이 객체는 MAY Specification Extensions로 확장될 수 있습니다.

4.29 OAuth Flow 객체

지원되는 OAuth 플로우에 대한 구성 세부사항

4.29.1 고정 필드

필드 이름 유형 적용 대상 설명
authorizationUrl string oauth2 ("implicit", "authorizationCode") REQUIRED. 이 플로우에 사용될 인증(authorization) URL입니다. 이 값은 MUST URL 형식이어야 하며 OAuth2 표준은 TLS 사용을 요구합니다.
deviceAuthorizationUrl string oauth2 ("deviceAuthorization") REQUIRED. 이 플로우에 사용될 장치 인증(device authorization) URL입니다. 이 값은 MUST URL 형식이어야 하며 OAuth2 표준은 TLS 사용을 요구합니다.
tokenUrl string oauth2 ("password", "clientCredentials", "authorizationCode", "deviceAuthorization") REQUIRED. 이 플로우에 사용될 토큰(token) URL입니다. 이 값은 MUST URL 형식이어야 하며 OAuth2 표준은 TLS 사용을 요구합니다.
refreshUrl string oauth2 리프레시 토큰(refresh tokens)을 얻기 위해 사용되는 URL입니다. 이 값은 MUST URL 형식이어야 하며 OAuth2 표준은 TLS 사용을 요구합니다.
scopes Map[string, string] oauth2 REQUIRED. OAuth2 보안 스키마에 대해 사용 가능한 스코프들입니다. 스코프 이름과 그에 대한 간단한 설명을 매핑한 객체입니다. 이 맵은 MAY 비어 있을 수 있습니다.

이 객체는 MAY Specification Extensions로 확장될 수 있습니다.

4.29.2 OAuth Flow Object 예제

type: oauth2
flows:
  implicit:
    authorizationUrl: https://example.com/api/oauth/dialog
    scopes:
      write:pets: modify pets in your account
      read:pets: read your pets
  authorizationCode:
    authorizationUrl: https://example.com/api/oauth/dialog
    tokenUrl: https://example.com/api/oauth/token
    scopes:
      write:pets: modify pets in your account
      read:pets: read your pets

4.30 보안 요구 객체

이 작업을 수행하기 위해 필요한 보안 스키마들을 나열합니다.

각 속성에 사용된 이름은 Security Schemes에서 선언된 보안 스키마와 일치해야 하거나 Security Scheme Object의 URI여야 합니다. 컴포넌트 이름과 동일한 속성 이름은 Components Object 아래의 컴포넌트 이름으로 처리되어야 합니다(MUST). 단일 세그먼트 상대 URI 참조(예: foo)가 컴포넌트 이름(예: #/components/securitySchemes/foo)과 충돌하는 경우에는 . 경로 세그먼트(예: ./foo)를 사용하세요.

URI처럼 보이는 Security Scheme 컴포넌트 이름을 사용하는 것은 권장되지 않습니다(NOT RECOMMENDED), 이전 OAS 버전과의 호환성을 유지하기 위해 컴포넌트 이름 매칭이 URI 해석보다 우선되는 것이 직관적이지 않기 때문입니다. 자세한 내용은 Security Considerations를 참조하세요.

Security Requirement Object는 여러 보안 스키마를 참조할 수 있으며 이 경우 요청이 인가되려면 모든 스키마를 만족해야 합니다(MUST). 이는 보안 정보를 전달하기 위해 여러 개의 쿼리 매개변수나 HTTP 헤더가 필요한 시나리오를 지원합니다.

OpenAPI Object 또는 Operation Object에 정의된 security 필드가 여러 Security Requirement Objects를 포함하는 경우, 목록의 항목 중 어느 하나만 만족되면 요청 인가가 이루어집니다. 이는 API가 여러 독립적인 보안 스키마를 허용하는 시나리오를 지원합니다.

비어 있는 Security Requirement Object({})는 익명(anonymous) 접근을 허용함을 나타냅니다.

4.30.1 패턴 필드

필드 패턴 유형 설명
{name} [string] 각 이름 또는 URI는 위에서 설명한 보안 스키마에 대응해야 합니다(MUST). 보안 스키마가 "oauth2" 또는 "openIdConnect" 타입인 경우 값은 실행에 필요한 스코프 이름들의 목록이며, 특정 스코프가 필요하지 않다면 목록은 비어 있을 수 있습니다. 다른 보안 스키마 타입의 경우 배열에는 실행에 필요한 역할(role) 이름들의 목록이 포함될 수 있으나 이는 별도로 정의되거나 인밴드(in-band)로 교환되지 않습니다.

4.30.2 Security Requirement Object 예제

멀티 문서 OpenAPI 설명에서 Security Requirement Objects를 사용하는 예제는 Implicit Connection Resolution Examples부록 G: 파싱 및 해석 지침을 참조하세요.

4.30.2.1 비-OAuth2 보안 요구사항
api_key: []
4.30.2.2 OAuth2 보안 요구사항

이 예제는 Security Scheme에 대한 컴포넌트 이름을 사용합니다.

petstore_auth:
  - write:pets
  - read:pets
4.30.2.3 선택적 OAuth2 보안

이 예제는 Security Scheme에 대해 상대 URI 참조를 사용합니다.

OpenAPI Object 또는 Operation Object에 정의될 수 있는 선택적 OAuth2 보안 예:

security:
  - {}
  - petstore_auth:
      - write:pets
      - read:pets

5. 명세 확장

OpenAPI 명세는 대부분의 사용 사례를 수용하려고 시도하지만, 특정 지점에서 명세를 확장하기 위해 추가 데이터를 첨부할 수 있습니다.

확장 속성은 항상 x-로 접두사되는 패턴화된 필드로 구현됩니다.

필드 패턴 유형 설명
^x- Any OpenAPI 스키마에 대한 확장을 허용합니다. 필드 이름은 x-로 시작해야 합니다(MUST), 예: x-internal-id. x-oai-x-oas-로 시작하는 필드 이름은 OpenAPI Initiative에서 정의한 용도로 예약되어 있습니다. 값은 유효한 JSON 값(null, 원시값, 배열, 또는 객체)일 수 있습니다.

OpenAPI Initiative는 확장 레지스트리를 여러 개 유지하며, 여기에는 개별 확장 키워드확장 키워드 네임스페이스에 대한 레지스트리가 포함됩니다.

확장은 명세에 제안된 추가 기능의 실현 가능성을 입증하는 가장 좋은 방법 중 하나입니다. 따라서 구현체가 커뮤니티 실험을 지원하도록 확장 가능하게 설계되는 것이 RECOMMENDED합니다.

어떤 단일 확장에 대한 지원은 OPTIONAL이며, 하나의 확장을 지원한다고 해서 다른 확장들을 지원한다는 의미는 아닙니다.

6. 보안 고려사항

6.1 OpenAPI 설명 형식

OpenAPI 설명서는 JSON, YAML 및 JSON Schema를 조합하여 사용하므로 이들과 관련된 보안 고려사항을 공유합니다:

6.2 도구와 사용 시나리오

또한 OpenAPI 설명서는 클라이언트 코드 생성, 문서 생성, 서버 측 라우팅, API 테스트 등 다양한 목적으로 광범위한 도구에 의해 처리됩니다. OpenAPI 설명서 작성자는 OpenAPI 설명서가 사용될 수 있는 시나리오들의 위험을 고려해야 합니다.

6.3 보안 스키마

OpenAPI 설명서는 정의된 리소스를 보호하는 데 사용되는 보안 스키마를 설명합니다. 사용 가능한 보안 스키마는 서로 다른 수준의 보호를 제공합니다. 데이터의 민감도와 보안 침해의 잠재적 영향을 고려하여 API 리소스에 적합한 보안 스키마를 선택해야 합니다. 일부 보안 스키마(예: basic auth 및 OAuth Implicit flow)는 기존 API와의 호환성을 위해 지원되지만, OpenAPI에 포함된다고 해서 특히 민감한 데이터나 작업에 대해 그 사용을 권장하는 것은 아닙니다.

Security Requirement ObjectSecurity Scheme Object에 연결하는 규칙은 악용될 여지가 있는 방식으로 모호할 수 있습니다. 구체적으로:

6.4 보안 필터링

OpenAPI 명세의 일부 객체는 본질적으로 API 문서의 핵심임에도 불구하고 선언되었지만 비어 있거나 완전히 제거될 수 있습니다.

이는 문서에 대한 추가적인 접근 제어 계층을 허용하기 위한 이유입니다. 명세 자체의 일부는 아니지만, 특정 라이브러리는 인증/권한 부여의 일부 형태에 따라 문서의 일부 접근을 허용하도록 선택할 수 있습니다(MAY).

예시는 다음과 같습니다:

  1. Paths Object는 존재할 수 있지만 비어 있을 수 있습니다. 직관적이지 않을 수 있으나, 이는 뷰어에게 올바른 위치에 도달했지만 문서에 접근할 수 없음을 알려줄 수 있습니다. 뷰어는 인증에 관한 추가 정보를 포함할 수 있는 적어도 Info Object에는 접근할 수 있을 것입니다.
  2. Path Item Object는 비어 있을 수 있습니다. 이 경우 뷰어는 경로가 존재함을 알게 되지만 해당 경로의 작업이나 매개변수를 볼 수 없습니다. 이는 경로 자체를 Paths Object에서 숨기는 것과 다르며, 문서 제공자가 뷰어가 볼 수 있는 내용을 세밀하게 제어할 수 있게 합니다.

6.5 외부 리소스 처리

OpenAPI 설명서는 도구가 자동으로 역참조할 수 있는 외부 리소스에 대한 참조를 포함할 수 있습니다. 외부 리소스는 신뢰할 수 없는 서로 다른 도메인에 호스팅될 수 있습니다.

6.6 참조 순환 처리

OpenAPI 설명서의 참조는 순환을 일으킬 수 있습니다. 도구는 리소스 고갈을 방지하기 위해 순환을 감지하고 처리해야 합니다.

6.7 마크다운 및 HTML 정화

특정 필드는 HTML(스크립트 포함)을 포함할 수 있는 마크다운 사용을 허용합니다. 마크다운을 적절히 정화하는 것은 도구의 책임입니다.

A. 부록 A: 개정 이력

버전 날짜 비고
3.2.0 2025-09-19 OpenAPI Specification 3.2.0 출시
3.1.2 2025-09-19 OpenAPI Specification 3.1.2 패치 릴리스
3.1.1 2024-10-24 OpenAPI Specification 3.1.1 패치 릴리스
3.1.0 2021-02-15 OpenAPI Specification 3.1.0 출시
3.1.0-rc1 2020-10-08 3.1 사양의 rc1
3.1.0-rc0 2020-06-18 3.1 사양의 rc0
3.0.4 2024-10-24 OpenAPI Specification 3.0.4 패치 릴리스
3.0.3 2020-02-20 OpenAPI Specification 3.0.3 패치 릴리스
3.0.2 2018-10-08 OpenAPI Specification 3.0.2 패치 릴리스
3.0.1 2017-12-06 OpenAPI Specification 3.0.1 패치 릴리스
3.0.0 2017-07-26 OpenAPI Specification 3.0.0 출시
3.0.0-rc2 2017-06-16 3.0 사양의 rc2
3.0.0-rc1 2017-04-27 3.0 사양의 rc1
3.0.0-rc0 2017-02-28 3.0 사양의 구현자 초안
2.0 2015-12-31 Swagger 2.0의 OpenAPI Initiative 기증
2.0 2014-09-08 Swagger 2.0 출시
1.2 2014-03-14 정식 문서 초판 출시
1.1 2012-08-22 Swagger 1.1 출시
1.0 2011-08-10 Swagger 명세 첫 출시

B. 부록 B: 데이터 타입 변환

타입이 지정된 데이터를 일반 텍스트로 직렬화하는 것은 text/plain 메시지 본문이나 multipart 파트, 또는 URL 쿼리 문자열이나 메시지 본문에서의 application/x-www-form-urlencoded 형식에서 발생할 수 있으며, 이는 상당한 구현 또는 애플리케이션 정의 동작을 포함합니다.

Schema ObjectsJSON Schema 데이터 모델에 따라 데이터를 검증합니다. JSON Schema 데이터 모델은 문자열(UTF-8로 널리 상호 운용 가능), 숫자, 불리언, 및 null의 네 가지 원시 데이터 타입만을 인식합니다. 특히 정수는 소수점의 존재 여부에 기반한 별개의 타입이 아니며, type: "integer"는 수학적 정의로서의 편의성입니다.

Parameter Object, Header Object, 및 Encoding Object는 배열 또는 객체 타입의 값을 배열하거나 정렬하는 방법을 제어하는 기능을 제공합니다. 또한 예약되거나 불법 문자를 피하기 위해 문자열이 어떻게 추가로 인코딩되는지를 제어하는 데 사용할 수 있습니다. 그러나 스키마로 검증된 비-UTF-8 원시 데이터 타입(또는 전체 배열이나 객체)을 문자열로 변환하는 일반 목적의 명세는 없습니다.

다음 두 가지 경우에는 표준 기반 지침이 제공됩니다:

RFC6570의 구현체는 종종 비문자열 값을 변환하는 자체 관례를 가지지만, 이는 구현별이며 RFC 자체에서 정의하지 않습니다. 이것이 OpenAPI 명세가 이러한 변환을 구현 정의로 남겨두는 이유 중 하나입니다: 변환 방식에 관계없이 RFC6570 구현체를 사용할 수 있게 합니다.

숫자, 불리언 및 null (또는 RFC6570가 정의상 undefined로 여기는 다른 값)을 더 정확하게 직렬화하려면, 스키마를 type: "string"으로 정의하고 pattern, enum, format 등으로 제약하여 애플리케이션이 스키마 검증 전에 데이터를 어떻게 사전 변환해야 하는지를 명확히 전달할 수 있습니다. 결과 문자열은 추가 타입 변환을 필요로 하지 않습니다.

format 키워드는 직렬화에 도움을 줄 수 있습니다. 일부 포맷(예: date-time)은 모호성이 없지만, decimal과 같이 덜 명확한 포맷도 있습니다. 다만 인식되지 않는 포맷은 무시되므로 관련 도구들이 특정 포맷을 지원하는지 주의해야 합니다.

미리 포맷된, 스키마 검증된 문자열을 입력으로 요구하면 모든 프로그래밍 언어와 환경이 동일한 데이터 타입을 지원하지 않기 때문에 왕복 상호 운용성이 향상됩니다.

C. 부록 C: RFC6570 기반 직렬화 사용

직렬화는 세 가지 시나리오에서 [RFC6570] URI 템플릿 관점으로 정의됩니다:

객체 조건
Parameter Object When schema is present
Header Object When schema is present
Encoding Object When encoding for application/x-www-form-urlencoded and any of style, explode, or allowReserved are used

이 명세의 구현체는 RFC6570의 구현체를 사용해 변수 확장을 수행할 수 있지만(MAY), 몇 가지 주의사항이 있습니다.

style: "form"을 사용하여 RFC6570 확장으로 application/x-www-form-urlencoded HTTP 메시지 본문을 생성할 때는 URI 쿼리 문자열 문법을 만족시키기 위해 생성되는 ? 접두사를 제거해야 합니다.

style 같은 키워드를 사용하여 multipart/form-data 본문을 생성할 때는 쿼리 문자열 이름이 각 파트 헤더의 Content-Dispositionname 매개변수에 배치되고 값은 해당 파트 본문에 배치됩니다; 이때 ?, =, & 문자는 사용되지 않으며, URI 퍼센트 인코딩도 적용되지 않습니다. 부록 E에서 파일 이름에 대한 퍼센트 인코딩 허용 등 추가 지침을 참고하세요.

모든 RFC6570 구현체가 OpenAPI 사용에 필요한 모든 네 수준의 연산자를 지원하는 것은 아니므로, 지원 수준이 낮은 구현체를 사용하면 제한을 우회하기 위해 URI 템플릿을 수동으로 구성해야 할 수 있습니다.

C.1 필드와 RFC6570 연산자 간의 등가성

일부 필드 값은 RFC6570의 연산자에 대응합니다(또는 연산자가 없음):

필드 등가
style "simple" n/a
style "matrix" ; 접두 연산자
style "label" . 접두 연산자
style "form" ? 접두 연산자
allowReserved false n/a
allowReserved true + 접두 연산자
explode false n/a
explode true * 수식자 접미사

여러 개의 style: "form" 파라미터는 RFC6570의 변수 리스트와 동일하며 ? 접두 연산자를 사용합니다:

parameters:
- name: foo
  in: query
  schema:
    type: object
  explode: true
- name: bar
  in: query
  schema:
    type: string

이 예제는 RFC6570의 {?foo*,bar}와 동일하며 NOT {?foo*}{&bar}와 동일하지 않습니다. 후자는 foo가 정의되지 않으면 유효하지 않은 URI가 되기 때문에 문제가 됩니다. Parameter Object에는 & 접두 연산자에 해당하는 것이 없습니다.

RFC6570은 explode로 다루는 단일 수준을 넘어선 복합 값에 대한 동작을 지정하지 않습니다. 명확한 동작이 지정되어 있지 않은 객체나 배열을 사용하는 결과는 구현에 따라 달라집니다.

C.2 파라미터 값의 구분자

배열이나 객체 값을 style: "simple"로 조인할 때 사용되는 ,와 같은 RFC6570 확장에서의 구분자들은 allowReservedfalse인 한 자동으로 퍼센트 인코딩됩니다. RFC6570은 URI 템플릿을 기반으로 변수를 파싱하는 방법을 지정하지 않으므로, 사용자는 먼저 구분자로 값을 분할한 다음 구분자를 포함할 수 있는 값을 퍼센트 디코딩해야 합니다.

allowReservedtrue인 경우에는 구분자로 값을 결합하기 전에 퍼센트 인코딩을 하고(또는 분할 후 퍼센트 디코딩을) 적절한 시점에 수동으로 수행해야 합니다.

부록 E에서 spaceDelimited, pipeDelimited, 및 deepObject와 같이 RFC6570 등가성이 없는 style 값들을 구분자로 사용할 때의 퍼센트 인코딩 처리에 대한 추가 지침을 확인하세요.

C.3 RFC6570에 해당하지 않는 필드 값 및 조합

직접적인 [RFC6570] 등가성이 없는 구성은 RFC6570에 따라 처리하는 것이 SHOULD합니다. 구현체는 개별 이름과 값을 위한 변수를 포함하는 올바르게 구분된 URI 템플릿을 RFC6570 정규 또는 예약 확장으로 생성할 수 있습니다(MAY).

여기에는 다음이 포함됩니다:

Parameter Object의 name 필드는 RFC6570의 변수 이름 문법보다 훨씬 관대합니다. 허용된 RFC6570 변수 문자 집합을 벗어나는 문자를 포함하는 파라미터 이름은 URI 템플릿에서 사용되기 전에 퍼센트 인코딩되어야 합니다(MUST).

C.4 예제

예를 들어 formulas는 explode되고 words는 explode되지 않는 폼 쿼리 문자열에 다음 데이터를 사용한다고 가정해 보겠습니다:

formulas:
  a: x+y
  b: x/y
  c: x^y
words:
- math
- is
- fun

C.4.1 RFC6570 등가 확장

이 Parameter Objects 배열은 정규 style: "form" 확장을 사용하며 RFC6570로 완전히 지원됩니다:

parameters:
- name: formulas
  in: query
  schema:
    type: object
    additionalProperties:
      type: string
  explode: true
- name: words
  in: query
  schema:
    type: array
    items:
      type: string

이는 다음 URI 템플릿과 동일합니다:

{?formulas*,words}

앞에서 주어진 데이터로 확장하면 다음과 같은 결과를 얻습니다:

?a=x%2By&b=x%2Fy&c=x%5Ey&words=math,is,fun

C.4.2 RFC6570로 직접 지원되지 않는 옵션으로의 확장

하지만 어떤 이유로 b 수식의 /를 쿼리 문자열에 그대로 표시하고 싶고, words를 공백으로 구분된 문구처럼 보이게 하고 싶다고 합시다. 이를 위해 formulasallowReserved: true를 추가하고 words에 대해 style: "spaceDelimited"로 변경합니다:

parameters:
- name: formulas
  in: query
  schema:
    type: object
    additionalProperties:
      type: string
  explode: true
  allowReserved: true
- name: words
  in: query
  style: spaceDelimited
  explode: false
  schema:
    type: array
    items:
      type: string

우리는 ?+ RFC6570 접두 연산자를 결합할 수 없으며, RFC6570로는 , 구분자를 공백 문자로 교체할 방법이 없습니다. 따라서 수동으로 URI 템플릿을 구성하여 모든 조각을 올바른 확장으로 통과시키도록 데이터를 재구성해야 합니다.

다음은 words의 첫 번째 항목을 위한 words.0, 두 번째를 위한 words.1, 세 번째를 위한 words.2라는 임의 규약을 사용하는 템플릿 예입니다:

?a={+a}&b={+b}&c={+c}&words={words.0} {words.1} {words.2}

RFC6570는 .를 하위 구조의 이름 계층을 나타내는 데 사용할 수 있다고 언급하지만, 구체적인 명명 규약이나 동작을 정의하지 않습니다. . 사용이 자동이 아니므로 이 새 템플릿에 맞는 입력 구조를 구성해야 합니다.

또한 formulas 값은 [, ], # 등이 허용되지 않기 때문에 사전 처리해야 합니다. 또한 &, =, + 등은 application/x-www-form-urlencoded 형식에서 특별한 동작을 가지므로 주의가 필요합니다.

allowReserved: true는 허용되지 않는 예약 문자를 허용하게 만들지 않으며, 단지 확장 과정에서 해당 문자를 변경하지 않고 통과시키도록 허용할 뿐입니다. 어떤 예약 문자를 그대로 통과시킬지 여부는 별도의 규격이 정의한 경우에만 해당됩니다.

따라서 사용자는 여전히 퍼센트 인코딩이 필요한 예약 문자를 인코딩해야 합니다. 예약 확장은 정규 확장과 달리 사전 퍼센트 인코딩된 삼중(예: %2B)을 변경하지 않습니다. 퍼센트 인코딩 및 폼 미디어 타입 처리에 대한 추가 지침은 부록 E를 참조하세요.

다음은 위 템플릿에 맞도록 이름과 값을 정렬한 데이터 구조의 예입니다. 여기서는 formulas의 값들이 []#&=+를 사전 퍼센트 인코딩했습니다(이 예에서는 +만 등장합니다):

a: x%2By
b: x/y
c: x^y
words.0: math
words.1: is
words.2: fun

이 수동으로 조립된 템플릿을 재구성된 데이터로 확장하면 다음과 같은 쿼리 문자열이 생성됩니다:

?a=x%2By&b=x/y&c=x%5Ey&words=math%20is%20fun

/와 사전 퍼센트 인코딩된 %2B는 그대로 유지되었지만, 허용되지 않는 ^ 문자(값 내부)와 템플릿에 있는 공백 문자(확장 변수 외부)는 퍼센트 인코딩되었습니다.

C.4.3 정의되지 않은 값과 수동 URI 템플릿 구성

수동으로 템플릿을 구성할 때 RFC6570이 정의되지 않음(undefined)으로 간주하는 값을 올바르게 처리하도록 주의해야 합니다:

formulas: {}
words:
- hello
- world

이 데이터를 원래의 RFC6570 친화적 URI 템플릿 {?formulas*,words}에 사용하면 다음과 같은 결과가 생성됩니다:

?words=hello,world

이는 수동으로 구성한 URI 템플릿과 재구성된 데이터가 formulas 객체를 완전히 생략하여 words 파라미터가 쿼리 문자열에서 첫 번째이자 유일한 파라미터가 되도록 해야 함을 의미합니다.

재구성된 데이터:

words.0: hello
words.1: world

수동으로 구성한 URI 템플릿:

?words={words.0} {words.1}

결과:

?words=hello%20world

C.4.4 유효하지 않은 변수 이름을 파라미터 이름으로 사용

이 예에서는 하트 이모지가 URI 템플릿 이름(또는 URI)에서 합법적이지 않습니다:

parameters:
- name: ❤️
  in: query
  schema:
    type: string

우리는 단순히 ❤️: "love!"를 RFC6570 구현체에 전달할 수 없습니다. 대신 이름(6 바이트 UTF-8 시퀀스)을 데이터와 URI 템플릿 모두에서 사전 퍼센트 인코딩해야 합니다:

"%E2%9D%A4%EF%B8%8F": love!
{?%E2%9D%A4%EF%B8%8F}

이것은 다음과 같은 결과로 확장됩니다:

?%E2%9D%A4%EF%B8%8F=love%21

D. 부록 D: 헤더와 쿠키 직렬화

HTTP 헤더는 허용되는 문자와 일부 또는 모든 허용되지 않는 문자를 어떻게 이스케이프하여 포함할 수 있는지에 대해 일관되지 않은 규칙을 가집니다. [RFC9110]의 quoted-string ABNF 규칙은 가장 일반적인 이스케이프 솔루션이지만 자동으로 적용하기에는 충분히 보편적이지 않습니다. 예를 들어 강력한 ETag"foo"처럼 보이고(내용과 관계없이 따옴표 포함), 약한 ETagW/"foo"처럼 보입니다(값의 일부만 인용됨). 이 헤더의 따옴표 안 내용도 quoted-string의 내용처럼 이스케이프되지 않습니다.

이러한 이유로 Parameter 또는 Header Object를 통해 헤더로 전달되는 모든 데이터는 OAS 구현에 전달하기 전에 인용되고 이스케이프되어야 하며, 파싱된 헤더 값은 따옴표와 이스케이프를 포함하는 것으로 예상됩니다.

D.1 퍼센트 인코딩과 쿠키

RFC6570의 퍼센트 인코딩 동작은 in: "cookie" 파라미터에 항상 적절하지 않을 수 있습니다. 퍼센트 인코딩은 RFC6265에서 권장하는 base64(contentEncoding: "base64")보다 더 일반적인 이스케이프 메커니즘처럼 보이지만, draft-ietf-httpbis-rfc6265bis-20의 해당 섹션은 Set-Cookie 응답 헤더에서 퍼센트 인코딩된 것으로 보이는 쿠키는 클라이언트가 저장할 때 디코딩해서는 안 된다고 명시합니다. 이는 클라이언트가 저장소에서 검색할 때 이미 인코딩된 상태로 있음을 의미합니다. style: "cookie"의 동작은 이 사용을 가정하며 퍼센트 인코딩을 적용하거나 제거하지 않습니다.

자동 퍼센트 인코딩이 필요하면 원시 값에 대해서 또는 explode의 기본값이 아닌 false를 사용하는 style: "form"이 이 동작을 제공합니다. 그러나 기본값인 explode: true는 쿠키에서 여러 값을 설정할 때 잘못된 구분자(& 대신 ; 및 단일 공백)를 사용합니다. RFC6570 구현체를 통해 style: "form"in: "cookie"를 사용하려면 ? 접두사를 제거해야 합니다. in: "cookie"와 함께 style: "form"을 완전히 사용하려면 allowReserved 필드를 사용하세요.

E. 부록 E: Percent-Encoding 및 Form 미디어 타입

참고: 이 절에서는 읽기 편의를 위해 application/x-www-form-urlencodedmultipart/form-data 미디어 타입을 각각 form-urlencodedform-data로 약어로 표기합니다.

퍼센트 인코딩은 URI와 그 문법을 따르는 미디어 타입에서 사용됩니다. 퍼센트 인코딩의 기본 규칙은 다음과 같습니다:

이 부록의 나머지 부분은 위 규칙을 바탕으로 보다 자세한 지침을 제공합니다.

E.1 퍼센트 인코딩 문자 클래스

이 절에서는 세 가지 문자 클래스를 다루며, 명세에 따라 이름이 다를 수 있지만 이 절의 목적상 다음과 같이 정의합니다:

특별한 언급이 없는 한, 이 절은 RFC3986의 reservedunreserved 정의를 사용하며, unsafe 집합은 이 두 집합에 포함되지 않는 모든 문자로 정의합니다.

E.2 퍼센트 인코딩과 form-urlencoded

각 URI 구성 요소(예: 쿼리 문자열)는 일부 reserved 문자를 안전하지 않은 것으로 간주합니다. 이는 해당 문자들이 구성 요소 간의 구분자 역할을 하기 때문(예: #)이거나, 과거에 전역적으로 안전하지 않다고 여겨졌지만 제한된 목적을 위해 나중에 reserved로 지정된 경우(예: []) 때문입니다.

구성 요소 내에서 특별한 의미가 정의되지 않은 reserved 문자는 퍼센트 인코딩하지 않고 남겨둘 수 있습니다. 그러나 다른 명세가 특별한 의미를 정의할 수 있으며, 그런 경우에는 해당 특별 의미와 관계없는 문자는 퍼센트 인코딩이 요구됩니다.

form-urlencoded 미디어 타입은 =&를 구분자로, +를 공백을 대신하는 표기로 특별한 의미를 정의합니다(이는 %20 대신 사용). 이는 이 세 문자가 RFC3986에 의해 쿼리 문자열에서 허용되더라도, form-urlencoded 쿼리 문자열에서는 form-urlencoded 용도로 사용될 때를 제외하고 반드시 퍼센트 인코딩되어야 함을 의미합니다. +를 폼 값에서 처리하는 예는 부록 C를 참조하세요.

E.3 퍼센트 인코딩과 form-data

[RFC7578]의 Section 2는 파일 이름과 같은 파트별 텍스트 헤더 데이터를 ASCII 문자 집합 내에 유지하기 위한 메커니즘으로 RFC3986 기반의 퍼센트 인코딩을 제안합니다. 이 제안은 2015년 이전의 오래된 form-data 명세에는 포함되지 않았으므로 상호운용성을 위해 주의가 필요합니다. 퍼센트 인코딩을 이 방식으로 사용하려는 사용자는 데이터를 퍼센트 인코딩된 형태로 제공해야 합니다(MUST). 이 미디어 타입에서는 어떤 Encoding Object 필드를 사용하든 퍼센트 인코딩이 자동으로 적용되지 않습니다.

form-data 미디어 타입은 파트에 임의의 텍스트 또는 바이너리 데이터를 허용하므로, 일반적으로 퍼센트 인코딩이나 유사한 이스케이프가 필요하지 않습니다.

E.4 URI 및 form-urlencoded 문자열 생성과 검증

URI 퍼센트 인코딩과 form-urlencoded 미디어 타입은 여러 개정판에 걸친 복잡한 명세 이력을 가지고 있으며, 경우에 따라 서로 다른 표준 기관이 소유권을 주장하는 충돌이 있습니다. 불행히도 이들 명세는 약간씩 다른 퍼센트 인코딩 규칙을 정의하므로, URI 또는 form-urlencoded 메시지 본문이 엄격한 검증 대상이라면 이를 고려해야 합니다. (많은 URI 파서가 기본적으로 검증을 수행하지 않거나 전혀 수행하지 않는다는 점에 유의하세요.)

이 명세는 다음 관련 표준들을 규범적으로 인용합니다:

Specification Date OAS Usage Percent-Encoding Notes
[RFC3986] 01/2005 URI/URL 문법, form-urlencoded이 아닌 내용 기반 직렬화 포함 [RFC3986] 이전의 [RFC1738] 등을 대체함
[RFC6570] 03/2012 style 기반 직렬화 [RFC3986] 쿼리 문자열에서 +를 사용하지 않음
WHATWG-URL Section 5 “living” standard 내용 기반의 form/url-encoded 직렬화, HTTP 메시지 내용 포함 WHATWG-URL Section 1.3 과거의 RFC1866, HTML401 등을 대체함

퍼센트 인코딩을 사용하는 style 기반 직렬화는 Parameter Object에서 schema가 있을 때, 그리고 Encoding Object에서 style, explode, 또는 allowReserved 중 하나 이상이 있을 때 사용됩니다. 부록 C는 RFC6570의 퍼센트 인코딩에 대한 두 가지 접근 방식과 +를 포함한 예를 설명합니다.

내용 기반 직렬화는 Media Type Object에 의해 정의되며, Parameter ObjectHeader Object에서 content 필드가 있을 때 사용되고, Encoding Object에서는 style, explode, allowReserved 필드들이 없을 때 contentType 필드에 따라 사용됩니다. URI에서 사용하려면 각 부분은 미디어 타입(예: text/plain 또는 application/json)에 따라 인코딩된 다음, 해당 미디어 타입이 이미 URI 퍼센트 인코딩을 포함하고 있지 않다면 form-urlencoded 문자열(폼 스타일 쿼리 문자열에서)이나 다른 URL 구성 요소용 일반 URI 사용을 위해 퍼센트 인코딩되어야 합니다.

E.4.1 과거 명세와의 상호운용성

이 명세의 이전 버전들은 [RFC1866]와 그에 따른 [RFC1738]의 퍼센트 인코딩 규칙을 사용하도록 요구했습니다. WHATWG-URL의 form-urlencoded 규칙은 현재 브라우저들의 합의를 나타내며 RFC1866에서 RFC1738를 애매하게 재표현한 것에서 비롯된 모호성을 피합니다.

RFC1866/RFC1738에 준수해야 하는 사용자는 툴링과 라이브러리 동작을 주의 깊게 확인하세요.

E.4.2 웹 브라우저 환경과의 상호운용성

WHATWG는 브라우저 지향 표준 그룹으로, 브라우저 문맥에서 URL을 파싱하고 직렬화하기 위한 “URL Living Standard”를 정의했습니다. 여기에는 form-urlencoded 데이터의 파싱 및 직렬화도 포함됩니다. WHATWG의 쿼리 문자열에 대한 퍼센트 인코딩 규칙은 쿼리 문자열이 form-urlencoded로 처리되는지 여부에 따라 다르며(이 경우 RFC1738보다 더 많은 퍼센트 인코딩을 요구함), 일반 문법의 일부로 처리될 때는 RFC3986과 요구사항이 다릅니다.

이 명세는 form-urlencoded 명세에 대해 WHATWG를 의존합니다. 쿼리 문자열을 다른 방식으로 사용하는 구현체는 WHATWG의 비-form-urlencoded 쿼리 문자열 규칙과 RFC3986 사이의 구분을 신중히 고려하고, WHATWG의 퍼센트 인코딩 세트 및 URL에 대한 유효한 유니코드 코드 포인트 집합을 모두 반영해야 합니다. 자세한 내용은 Percent-Encoding and Illegal or Reserved Delimiters를 참조하세요.

E.5 URI 및 form-urlencoded 문자열 디코딩

퍼센트 디코딩 알고리즘은 어떤 문자가 퍼센트 디코딩되었는지에 대해서 신경 쓰지 않으므로, 어떤 명세에 따라 퍼센트 인코딩된 URI도 올바르게 디코딩됩니다.

마찬가지로 모든 form-urlencoded 디코딩 알고리즘은 퍼센트 디코딩 알고리즘에 +-for-space 처리를 추가한 것일 뿐이며, 사용된 인코딩 명세와 상관없이 동작합니다.

그러나 +가 공백을 나타내는 경우에는 form-urlencoded 디코딩을 사용하고, +가 리터럴 + 자체를 나타내는 경우에는 일반 퍼센트 디코딩을 사용하도록 주의해야 합니다.

E.6 퍼센트 인코딩과 불법 또는 예약된 구분자

[, ], | 및 공백 문자는 각각 deepObject, pipeDelimited, spaceDelimited 스타일의 구분자로 사용되며, 이들 문자 모두는 [RFC3986]을 준수하기 위해 반드시 퍼센트 인코딩되어야 합니다(MUST). 따라서 이러한 스타일을 사용할 때는 파라미터 이름과 값에서 구분자 용도로 사용되는 문자들과 구분하기 위해 해당 문자들을 사전에 다른 방식으로 인코딩해 두어야 합니다.

공백 문자는 모든 관련 표준의 구현체에서 항상 불법이며 어떤 방식으로든 인코딩됩니다. 파라미터 이름과 값에서 공백을 spaceDelimited의 구분자(인코딩된 %20)와 구분하기 위해 form-urlencoded 관례의 +를 사용할 수 있지만, 명세들은 단일 패스의 디코딩을 정의하므로 디코딩 결과에서 서로 다른 용도를 구분할 수 없습니다(비표준 파싱 알고리즘을 사용해 먼저 한 구분자로 분리한 뒤 다른 구분자에 대해 디코딩한다면 가능하겠지만). 그러한 비표준 파싱 방식은 모든 툴 간의 상호운용성을 보장하지 못합니다.

일부 환경에서는 쿼리 문자열에서 [, ], 그리고 경우에 따라 |를 인코딩하지 않고 사용해도 문제가 없는 것으로 보입니다. WHATWG의 일반 쿼리 문자열 규칙은 비-form-urlencoded 쿼리 문자열에서 이들을 퍼센트 인코딩할 것을 요구하지 않지만, 또한 URL의 유효한 유니코드 코드 포인트 집합에서 제외합니다. 이름과 값 내에서는 정규 퍼센트 인코딩을 사용하면서 구분자만 인코딩하지 않는 코드는 모든 구현체에서의 상호운용성을 보장하지 않습니다.

최대의 상호운용성을 위해서는, 이러한 스타일에 대해 구분자를 퍼센트 인코딩하는 동시에 추가적인 이스케이프 규약을 정의하고 문서화하거나, 또는 이러한 스타일 자체를 사용하지 않는 것이 권장됩니다. 추가 인코딩/이스케이프의 정확한 방법은 API 설계자가 결정하며, 이 명세에 설명된 직렬화 및 인코딩 단계 이전에 수행되고, 이 명세의 인코딩 및 직렬화 단계가 역으로 처리된 후에 되돌려져야 합니다. 이렇게 하면 해당 처리는 이 명세가 규정하는 과정 밖에 있게 됩니다.

F. 부록 F: 기준 URI 결정 및 참조 해석 예제

이 절에서는 기준 URI의 네 가지 가능한 출처를 각각 보여주고, 이어서 상대 $self$id가 있는 예제를 제시합니다.

F.1 내용 내의 기준 URI

리소스 콘텐츠 내의 기준 URI([RFC3986]의 Section 5.1.1)는 기준 URI의 가장 높은 우선순위 출처입니다. OpenAPI 문서의 경우 이 출처는 OpenAPI Object의 $self 필드이고, $id를 포함하는 Schema Object(또는 $id를 포함하는 스키마의 하위 스키마)의 경우에는 해당 $id 필드가 기준이 됩니다:

다음 문서의 검색 URI가 file://home/someone/src/api/openapi.yaml라고 가정합니다:

openapi: 3.2.0
$self: https://example.com/api/openapi
info:
  title: Example API
  version: 1.0
paths:
  /foo:
    get:
      requestBody:
        $ref: "shared/foo#/components/requestBodies/Foo"

다음 문서의 검색 URI가 https://git.example.com/shared/blob/main/shared/foo.yaml라고 가정합니다:

openapi: 3.2.0
$self: https://example.com/api/shared/foo
info:
  title: Shared components for all APIs
  version: 1.0
components:
  requestBodies:
    Foo:
      content:
        application/json:
          schema:
            $ref: ../schemas/foo
  schemas:
    Foo:
      $id: https://example.com/api/schemas/foo
      properties:
        bar:
          $ref: bar
    Bar:
      $id: https://example.com/api/schemas/bar
      type: string

이 예제에서는 두 문서 모두 $self를 정의하므로 검색 URI는 중요하지 않습니다.

첫 번째 문서의 상대 $ref$self를 기준으로 해석되어 https://example.com/api/shared/foo#/components/requestBodies/Foo가 됩니다. 이 URI의 # 이전 부분은 두 번째 문서의 $self와 일치하므로 참조 대상은 두 번째 문서의 #/components/requestBodies/Foo로 해석됩니다.

두 번째 문서에서 Request Body Object 내부의 $ref는 그 문서의 $self를 기준으로 해석되어 https://example.com/api/schemas/foo가 됩니다. 이는 #/components/schemas/Foo/$id$id와 일치하므로 해당 Schema Object를 가리킵니다. 그 Schema Object는 $ref: bar를 가진 하위 스키마를 포함하고 있으며, 이는 $id를 기준으로 해석되어 https://example.com/api/schemas/bar가 되고, 이는 #/components/schemas/Bar/$id$id와 일치합니다.

상호운용성을 보장하려면, $id를 포함하는 Schema Object 또는 $id를 포함하는 스키마의 하위에 있는 Schema Object는 참조의 비-프래그먼트 부분에 대해 가장 가까운 그러한 $id로 참조되어야 합니다(MUST). JSON Schema 명세가 지적하듯, 가장 가까운 $id가 아닌 기준 URI를 사용하고 그 $id를 JSON Pointer 프래그먼트와 함께 건너뛰는 것은 상호운용적이지 않습니다.

또한 #/components/schemas/Foo/properties/bar/$ref에 있는 참조가 단지 JSON Pointer 프래그먼트만으로 #/components/schemas/Bar를 가리키는 것은 불가능합니다. JSON Pointer는 https://example.com/api/schemas/foo를 기준으로 해석되며 OpenAPI 문서의 기준 URI인 $self가 아니기 때문입니다.

F.2 캡슐화 엔티티로부터의 기준 URI

콘텐츠 내에서 기준 URI를 결정할 수 없는 경우, 다음으로 검색할 위치는 캡슐화 엔티티입니다([RFC3986]의 Section 5.1.2).

이는 OpenAPI 문서 내에 캡슐화된 Schema Object에서 일반적입니다. OpenAPI Object 자체가 다른 엔티티에 캡슐화된 예는 multipart/related 아카이브(RFC2557)일 수 있으며, 예를 들어 multipart/related; boundary="boundary-example"; type="application/openapi+yaml" 문서와 같습니다. 이는 단지 예시이며 이러한 multipart 문서나 OpenAPI Object를 캡슐화할 수 있는 다른 형식의 지원은 이 명세의 요구사항이 아닙니다.

RFC2557은 하이퍼링크된 문서 집합을 이메일 첨부로 전송할 수 있도록 작성되었으며, 이 경우 multipart 첨부물에 대한 검색 URI가 없을 수 있습니다(물론 HTTP에서도 형식을 사용할 수 있습니다).

--boundary-example
Content-Type: application/openapi+yaml
Content-Location: https://example.com/api/openapi.yaml

openapi: 3.2.0
info:
  title: Example API
  version: 1.0
  externalDocs:
    url: docs.html
components:
  requestBodies:
    Foo:
      content:
        application/json:
          schema:
            $ref: "#/components/api/schemas/Foo"
  schemas:
    Foo:
      properties:
        bar:
          $ref: schemas/bar
--boundary-example
Content-Type: application/schema+json
Content-Location: https://example.com/api/schemas/bar

{
  "type": "string"
}
--boundary-example
Content-Type: text/html
Content-Location: https://example.com/api/docs.html

<html>
  <head>
    <title>API Documentation</title>
  </head>
  <body>
    <p>Awesome documentation goes here</p>
  </body>
</html>
--boundary-example

이 예제에서 각 파트의 URI(그 파트의 기준 URI 역할)는 해당 파트의 Content-Location 헤더에서 제공됩니다(RFC2557에 따름). #/components/schemas/Foo에 있는 Schema Object가 $id를 포함하지 않으므로, 그 하위 스키마의 참조는 해당 파트의 Content-Location에서 가져온 OpenAPI 문서의 기준 URI를 사용합니다. 결과로 생성된 https://example.com/schemas/bar 참조는 두 번째 파트의 Content-Location과 일치하며, RFC2557에 따라 multipart 아카이브 내에서 참조 대상을 찾을 수 있습니다.

유사하게, External Documentation Objecturl 필드는 Content-Location에서 가져온 기준 URI에 대해 해석되어 https://example.com/api/docs.html이 되며 이는 세 번째 파트의 Content-Location과 일치합니다.

F.3 검색 URI로부터의 기준 URI

이전의 출처들 중 어느 것도 기준 URI를 제공하지 않는다면 다음 출처는 검색 URI입니다([RFC3986]의 Section 5.1.3).

다음 문서가 https://example.com/api/openapis.yaml에서 검색되었다고 가정합니다:

openapi: 3.2.0
info:
  title: Example API
  version: 1.0
components:
  requestBodies:
    Foo:
      content:
        application/json:
          schema:
            $ref: schemas/foo

다음 문서가 https://example.com/api/schemas/foo에서 검색되었다고 가정합니다:

{
  "type": "object",
  "properties": {
    "bar": {
      "type": "string"
    }
  }
}

OpenAPI 문서의 검색 URI에 대해 $ref: schemas/foo를 해석하면 https://example.com/api/schemas/foo가 되어 JSON Schema 문서의 검색 URI가 됩니다.

F.4 애플리케이션별 기본 기준 URI

$self나 캡슐화 엔티티, 검색 URI가 없는 상태로 메모리 내에서 OpenAPI 문서를 구성할 때, 애플리케이션은 내부(프래그먼트 전용) 참조를 해결하기 위해 기본 기준 URI를 가정할 수 있습니다([RFC3986]의 Section 5.1.4). 이러한 내부 해석은 기준 URI를 선택하지 않고도 실무에서 수행할 수 있지만, 임의로 생성된 UUID를 포함한 URN(예: urn:uuid:f26cdaad-3193-4398-a838-4ecb7326c4c5)과 같은 기준 URI를 선택하면 특수 케이스로 처리할 필요가 없어집니다.

F.5 상대 $self$id 해석

이 부록의 첫 번째 예제를 다시 고려하되, 이번에는 $self$id에 상대 URI 참조를 사용하고 이를 지원하는 검색 URI를 가정해 보겠습니다:

다음이 https://staging.example.com/api/openapi에서 검색되었다고 가정합니다:

openapi: 3.2.0
$self: /api/openapi
info:
  title: Example API
  version: 1.0
paths:
  /foo:
    get:
      requestBody:
        $ref: "shared/foo#/components/requestBodies/Foo"

다음 문서의 검색 URI가 https://staging.example.com/api/shared/foo라고 가정합니다:

openapi: 3.2.0
$self: /api/shared/foo
info:
  title: Shared components for all APIs
  version: 1.0
components:
  requestBodies:
    Foo:
      content:
        application/json:
          schema:
            $ref: ../schemas/foo
  schemas:
    Foo:
      $id: /api/schemas/foo
      properties:
        bar:
          $ref: bar
    Bar:
      $id: /api/schemas/bar
      type: string

이 예제에서 모든 $self$id 값은 절대 경로로 구성된 상대 URI 참조입니다. 이로 인해 검색 URI가 호스트(및 스킴)를 설정할 수 있으며, 이 경우 https://staging.example.com이 되어 첫 문서의 $selfhttps://staging.example.com/openapi가 되고, 두 번째 문서의 $selfhttps://staging.example.com/api/shared/foo가 되며, $id 값은 https://staging.example.com/api/schemas/foohttps://staging.example.com/api/schemas/bar가 됩니다. 이러한 유형의 상대 $self$id는 동일한 문서 세트를 다른 호스트에 배포했을 때도 작동하게 합니다.

G. 부록 G: 파싱 및 해석 지침

구현체는 전체 문서 파싱을 다음 방법들 중 어느 것으로든 지원할 수 있습니다(MAY):

루트에 OpenAPI Object 또는 Schema Object 이외의 객체가 있는 문서를 지원하기 위해 추가 메커니즘을 사용할 수 있지만, 그 결과 동작은 구현에 의해 정의된다는 점에 유의하세요:

G.1 단편적 파싱에 관한 경고

참조된 OpenAPI 콘텐츠의 조각을 나머지 포함 문서의 내용과 무관하게 파싱하는 구현체는 참조 대상의 의미와 동작을 변경하는 키워드를 놓치게 됩니다. 특히 기준 URI를 변경하는 키워드를 고려하지 않으면 참조가 의도와 다른 URI로 해석되어 예측 불가능한 결과를 초래할 수 있어 보안 위험이 발생합니다. 과거 버전의 요구사항 때문에 일부 구현체는 이러한 파싱을 지원하지만, 버전 3.1 이후로는 조각을 단독으로 파싱한 결과가 정의되지 않음이며 이 명세의 요구사항과 모순될 가능성이 큽니다.

참조를 분리된 조각으로 파싱해도 올바르게 동작하도록 OpenAPI Description을 구조화할 수는 있지만, 이를 의존하는 것은 권장되지 않습니다. 이 명세는 그런 동작이 안전한 조건을 명시적으로 나열하지 않으며, 향후 버전에서도 안전을 보장하지 않습니다.

G.2 필드 타입과 참조 문맥 간의 충돌

OAD 내의 JSON 또는 YAML 객체는 문맥에 따라 특정 객체들(예: Operation Objects, Response Objects, Reference Objects 등)으로 해석됩니다. 참조가 배열된 방식에 따라 동일한 JSON/YAML 객체가 여러 다른 문맥에서 해석될 수 있습니다:

동일한 JSON/YAML 객체가 여러 번 파싱되고 각 문맥이 서로 다른 객체 타입으로 파싱해야 한다면, 결과 동작은 구현에 따라 정의되며, 감지될 경우 오류로 처리될 수도 있습니다. 예를 들어 빈 객체는 Path Item Object와 components/schemas 아래의 빈 Schema Object 둘 다에 대해 유효하므로 호환성 측면에서 최대한 피하는 것이 권장됩니다.

G.3 암시적 연결에 관한 지침

다음 객체와 필드들은 암시적 연결의 사용을 포함합니다:

Source Target Alternative
Security Requirement Object {name} Security Scheme Object 이름 (Components Object의 하위) n/a
Discriminator Object mapping (implicit, or explicit name syntax) Schema Object 이름 (Components Object의 하위) mapping (명시적 URI 문법)
Operation Object tags Tag Object name (OpenAPI Object의 tags 배열) n/a
Link Object operationId Operation Object operationId operationRef

추가적인 암시적 연결은 Paths Object의 템플릿화된 URL 경로들을 적절한 Server Objecturl 필드에 덧붙이는 것을 포함합니다. 이 연결은 진입 문서의 Paths Object만이 API에 대한 URL을 기여하므로 모호하지 않습니다.

Security Requirement Object와 Discriminator Object의 암시적 연결은 컴포넌트 이름에 의존합니다. 이는 Components Object의 적절히 타입화된 하위 객체에 해당 컴포넌트를 보유한 속성의 이름입니다. 예를 들어 #/components/schemas/Foo에 있는 Schema Object의 컴포넌트 이름은 Foo입니다. Operation Object의 tags의 암시적 연결은 Tag Objects의 name 필드를 사용하며, 이는 Components Object처럼 루트 OpenAPI Object 아래에 있습니다. 따라서 컴포넌트 이름과 태그 이름을 해결하려면 올바른 OpenAPI Object에서 시작해야 합니다.

참조된(비-진입) 문서에서 컴포넌트 및 태그 이름 연결을 해결할 때는 도구들이 진입 문서에서 해결하도록 하는 것이 권장됩니다. 암시적 연결 해결에서 권장한 대로 진입 문서에서 해결하면, 컴포넌트와 Tag Objects를 서버 객체의 최상위 배열 옆에 배치하여 참조된 문서가 이를 인터페이스로 접근할 수 있게 할 수 있습니다.

Security Requirement Objects와 Discriminator Objects의 경우, 이 객체들이 제공하는 URI-참조 형태를 사용하면 참조된 문서 내에서 해결을 유지할 수도 있습니다.

Operation Object의 tags 필드에는 URI 기반 대안이 없습니다. OAD 작성자는 여러 문서에 걸쳐 Tag Objects를 공유하려면 OpenAPI Initiative의 Overlay Specification과 같은 외부 솔루션을 사용하는 것이 권장됩니다.

G.3.1 암시적 연결 해결 예제

이 절에서는 HTTP로 접근 가능한 멀티 문서 OpenAPI Description(OAD)을 받아 참조된(비-진입) 문서에서 Security Requirement Object를 해결하는 방법을 보여줍니다. Discriminator Object의 비-URI 매핑과 Operation Object의 tags 필드도 동일한 원칙으로 동작합니다.

먼저 파싱은 진입 문서에서 시작합니다. 진입 문서는 JWT 기반의 MySecurity 보안 스키마를 정의하고, 경로 항목을 다른 문서의 컴포넌트로 참조로 정의합니다:

GET /api/description/openapi HTTP/1.1
Host: www.example.com
Accept: application/openapi+json
"components": {
  "securitySchemes": {
    "MySecurity": {
      "type": "http",
      "scheme": "bearer",
      "bearerFormat": "JWT"
    }
  }
},
"paths": {
  "/foo": {
    "$ref": "other#/components/pathItems/Foo"
  }
}
GET /api/description/openapi HTTP/1.1
Host: www.example.com
Accept: application/openapi+yaml
components:
  securitySchemes:
    MySecurity:
      type: http
      scheme: bearer
      bearerFormat: JWT
paths:
  /foo:
    $ref: 'other#/components/pathItems/Foo'

이 진입 문서는 파일 확장자를 사용하지 않고 다른 문서 other를 참조합니다. 이는 클라이언트가 각 리소스별로 허용 가능한 형식을 선택할 유연성을 제공합니다(두 표현이 모두 사용 가능하다는 가정 하에):

GET /api/description/other HTTP/1.1
Host: www.example.com
Accept: application/openapi+json
"components": {
  "securitySchemes": {
    "MySecurity": {
      "type": "http",
      "scheme": "basic"
    }
  },
  "pathItems": {
    "Foo": {
      "get": {
        "security": [
          "MySecurity": []
        ]
      }
    }
  }
}
GET /api/description/other HTTP/1.1
Host: www.example.com
Accept: application/openapi+yaml
components:
  securitySchemes:
    MySecurity:
      type: http
      scheme: basic
  pathItems:
    Foo:
      get:
        security:
          - MySecurity: []

other 문서에서 참조된 경로 항목은 Security Requirement로 MySecurity를 요구합니다. 동일한 Security Scheme이 원래 진입 문서에도 존재합니다. 암시적 연결 해결에서 설명한 대로 MySecurity의 해석은 구현에 따라 정의될 수 있지만, 일반적으로 도구들은 진입 문서에서 컴포넌트 이름을 해결하도록 권장합니다. 모든 구현 정의 동작과 마찬가지로, 어떤 동작이 지원되는지 확인하려면 도구 문서를 확인해야 합니다.

H. 참고 문헌

H.1 규범적 참조

[ABNF]
구문 명세를 위한 확장 BNF: ABNF. D. Crocker, 편집; P. Overell. IETF. 2008년 1월. 인터넷 표준. URL: https://www.rfc-editor.org/rfc/rfc5234
[CommonMark]
CommonMark 사양. URL: https://spec.commonmark.org/
[CommonMark-0.27]
CommonMark 사양, 버전 0.27. John MacFarlane. 2016년 11월 18일. URL: https://spec.commonmark.org/0.27/
[DOM]
DOM 표준. Anne van Kesteren. WHATWG. Living Standard. URL: https://dom.spec.whatwg.org/
[IANA-HTTP-AUTHSCHEMES]
Hypertext Transfer Protocol (HTTP) 인증 스킴 레지스트리. IANA. URL: https://www.iana.org/assignments/http-authschemes/
[IANA-HTTP-STATUS-CODES]
Hypertext Transfer Protocol (HTTP) 상태 코드 레지스트리. IANA. URL: https://www.iana.org/assignments/http-status-codes/
[OpenAPI-Registry]
OpenAPI Initiative 레지스트리. OpenAPI Initiative. URL: https://spec.openapis.org/registry/index.html
[OpenID-Connect-Core]
OpenID Connect Core 1.0 (errata set 2 포함). N. Sakimura; J. Bradley; M. Jones; B. de Medeiros; C. Mortimore. OpenID Foundation. 2023년 12월 15일. 최종. URL: https://openid.net/specs/openid-connect-core-1_0.html
[OpenID-Connect-Discovery]
OpenID Connect Discovery 1.0 (errata set 2 포함). N. Sakimura; J. Bradley; M. Jones; E. Jay. OpenID Foundation. 2023년 12월 15일. 최종. URL: https://openid.net/specs/openid-connect-discovery-1_0.html
[RFC2046]
Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types. N. Freed; N. Borenstein. IETF. 1996년 11월. 초안 표준. URL: https://www.rfc-editor.org/rfc/rfc2046
[RFC2119]
요구 수준을 나타내기 위한 RFC용 핵심 용어. S. Bradner. IETF. 1997년 3월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC3986]
Uniform Resource Identifier (URI): Generic Syntax. T. Berners-Lee; R. Fielding; L. Masinter. IETF. 2005년 1월. 인터넷 표준. URL: https://www.rfc-editor.org/rfc/rfc3986
[RFC3987]
Internationalized Resource Identifiers (IRIs). M. Duerst; M. Suignard. IETF. 2005년 1월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc3987
[RFC4648]
The Base16, Base32, and Base64 Data Encodings. S. Josefsson. IETF. 2006년 10월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc4648
[RFC6265]
HTTP 상태 관리 메커니즘. A. Barth. IETF. 2011년 4월. 제안 표준. URL: https://httpwg.org/specs/rfc6265.html
[RFC6570]
URI 템플릿. J. Gregorio; R. Fielding; M. Hadley; M. Nottingham; D. Orchard. IETF. 2012년 3월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc6570
[RFC6749]
The OAuth 2.0 Authorization Framework. D. Hardt, 편집. IETF. 2012년 10월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc6749
[RFC6901]
JavaScript Object Notation (JSON) Pointer. P. Bryan, 편집; K. Zyp; M. Nottingham, 편집. IETF. 2013년 4월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc6901
[RFC7578]
폼에서 값 반환: multipart/form-data. L. Masinter. IETF. 2015년 7월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc7578
[RFC8174]
RFC2119 핵심 용어의 대소문자 애매성. B. Leiba. IETF. 2017년 5월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC8259]
JavaScript Object Notation (JSON) 데이터 교환 형식. T. Bray, 편집. IETF. 2017년 12월. 인터넷 표준. URL: https://www.rfc-editor.org/rfc/rfc8259
[RFC8414]
OAuth 2.0 권한 서버 메타데이터. M. Jones; N. Sakimura; J. Bradley. IETF. 2018년 6월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc8414
[RFC8628]
OAuth 2.0 장치 권한 부여 그랜트. W. Denniss; J. Bradley; M. Jones; H. Tschofenig. IETF. 2019년 8월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc8628
[RFC9110]
HTTP 의미론. R. Fielding, 편집; M. Nottingham, 편집; J. Reschke, 편집. IETF. 2022년 6월. 인터넷 표준. URL: https://httpwg.org/specs/rfc9110.html
[RFC9264]
Linkset: 미디어 타입과 링크 집합용 링크 관계 타입. E. Wilde; H. Van de Sompel. IETF. 2022년 7월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc9264
[RFC9512]
YAML 미디어 타입. R. Polli; E. Wilde; E. Aro. IETF. 2024년 2월. 정보성. URL: https://www.rfc-editor.org/rfc/rfc9512
[SNIFF]
MIME 스니핑 표준. Gordon P. Hemsley. WHATWG. Living Standard. URL: https://mimesniff.spec.whatwg.org/
[SPDX-Licenses]
SPDX 라이선스 목록. Linux Foundation. URL: https://spdx.org/licenses/
[WHATWG-URL]
URL 표준. Anne van Kesteren. WHATWG. Living Standard. URL: https://url.spec.whatwg.org/
[xml-names11]
XML 네임스페이스 1.1 (두 번째 판). Tim Bray; Dave Hollander; Andrew Layman; Richard Tobin 등. W3C. 2006년 8월 16일. W3C 권고. URL: https://www.w3.org/TR/xml-names11/
[YAML]
YAML Ain’t Markup Language (YAML™) Version 1.2. Oren Ben-Kiki; Clark Evans; Ingy döt Net. 2009년 10월 1일. URL: http://yaml.org/spec/1.2/spec.html

H.2 정보적 참조

[HTML]
HTML 표준. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[HTML401]
HTML 4.01 사양. Dave Raggett; Arnaud Le Hors; Ian Jacobs. W3C. 2018년 3월 27일. W3C 권고. URL: https://www.w3.org/TR/html401/
[OpenAPI-Learn]
OpenAPI - 시작하기 및 명세 설명. OpenAPI Initiative. URL: https://learn.openapis.org/
[RFC1738]
Uniform Resource Locators (URL). T. Berners-Lee; L. Masinter; M. McCahill. IETF. 1994년 12월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc1738
[RFC1866]
Hypertext Markup Language - 2.0. T. Berners-Lee; D. Connolly. IETF. 1995년 11월. Historic. URL: https://www.rfc-editor.org/rfc/rfc1866
[RFC2396]
Uniform Resource Identifiers (URI): Generic Syntax. T. Berners-Lee; R. Fielding; L. Masinter. IETF. 1998년 8월. 초안 표준. URL: https://www.rfc-editor.org/rfc/rfc2396
[RFC2557]
MIME로 집계 문서(예: HTML) 캡슐화 (MHTML). J. Palme; A. Hopmann; N. Shelness. IETF. 1999년 3월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc2557
[RFC6838]
미디어 타입 사양 및 등록 절차. N. Freed; J. Klensin; T. Hansen. IETF. 2013년 1월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc6838
[RFC7464]
JavaScript Object Notation (JSON) 텍스트 시퀀스. N. Williams. IETF. 2015년 2월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc7464
[RFC8091]
JSON 텍스트 시퀀스를 위한 미디어 타입 구조적 구문 접미사. E. Wilde. IETF. 2017년 2월. 정보성. URL: https://www.rfc-editor.org/rfc/rfc8091
[RFC9535]
JSONPath: JSON 쿼리 표현식. S. Gössner, 편집; G. Normington, 편집; C. Bormann, 편집. IETF. 2024년 2월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc9535