Copyright © 2025 the Linux Foundation
본 문서에서 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, 그리고 “OPTIONAL”이라는 키워드는 BCP 14 [RFC2119] [RFC8174]에서 설명한 대로, 대문자로 표시될 때에만 해당 의미로 해석됩니다.
본 문서는 아파치 라이선스 2.0 버전에 따라 라이선스가 부여됩니다.
OpenAPI 명세서(OAS)는 표준화된 언어 독립적 HTTP API 인터페이스를 정의하여, 소스 코드나 문서, 네트워크 트래픽 검사 없이 사람과 컴퓨터 모두 서비스의 기능을 발견하고 이해할 수 있게 합니다. 올바르게 정의될 경우, 소비자는 파싱 및 직렬화를 통해 HTTP 메시지를 데이터 모델과 주고받으면서 최소한의 구현 논리로 원격 서비스와 상호작용할 수 있습니다.
OpenAPI 설명 (OAD)는 이후 문서 생성 도구를 통해 API 표시, 코드 생성 도구를 통해 다양한 프로그래밍 언어로 서버 및 클라이언트를 생성하거나 테스트 도구 등 다양한 용도에 활용될 수 있습니다.
OpenAPI 사용 예시 및 추가 문서는 [OpenAPI-Learn] 페이지를 참고하시기 바랍니다.
OpenAPI Initiative가 공개한 확장 레지스트리 및 기타 명세, 그리고 본 명세서의 공식 렌더링은 spec.openapis.org에서 확인하실 수 있습니다.
OpenAPI 명세서는 major.minor.patch 버전 체계를 사용합니다. 버전 문자열의
major.minor 부분(예: 3.1)은 OAS의 기능 집합을 SHALL로 표시합니다. .patch 버전은 기능 집합이 아니라 본 문서의 오류 수정이나 명확한 설명을
위한 것입니다. OAS 3.1을 지원하는 툴은 모든 OAS 3.1.* 버전과 SHOULD 호환되어야 합니다. 패치 버전은 SHOULD NOT 도구에 의해 고려되어야 하며, 예를 들어 3.1.0과 3.1.1은 차이가
없어야 합니다.
특정 필드 또는 기능은 사용 중단됨으로 표시될 수 있습니다. 이러한 필드와 기능도 여전히 명세의 일부이며 다른 필드 및 기능처럼 사용할 수 있습니다. 그러나 OpenAPI 설명 작성자는 가능하면 새로운 필드와 기능을 사용해서 사용 중단된 항목을 대체해야 합니다.
현재로서는 이러한 요소는 다음 메이저 버전까지 OAS의 일부로 남을 것으로 예상되며, 향후 마이너 버전에서는 사용 중단된 요소의 제거 정책을 정의할 수 있습니다.
때때로, 이익이 크다고 판단될 경우 OAS의 minor 버전에서 호환되지 않는 변경이 이루어질 수 있습니다.
이 명세서는 특정 상황을 정의되지 않은 또는 구현-정의 동작으로 간주합니다.
정의되지 않은 동작은 일부 상황에서 명세를 위반하는 결과를 초래할 수 있으며, 이러한 모순의 검출이 불가능하거나 비현실적일 때 사용됩니다. 구현체는 MAY 과거의 불명확한 문구 등 역사적 이유로 정의되지 않은 시나리오를 지원할 수 있습니다. 이런 지원이 많은 경우 올바른 결과를 낼 수 있지만, 모든 도구에서, 그리고 미래 명세 버전에서도 작동한다는 NOT RECOMMENDED 보장이 없으니 의존하지 않는 것이 좋습니다.
구현-정의 동작은 여러 가지 다른(그러면서도 명세에 부합하는) 방법 중 구현이 하나를 선택할 수 있음을 의미합니다. 이것은 API 설명 작성자가 상호 운용성을 최대화하기 위해 RECOMMENDED 피해야 하는 모호한 요구 사항을 문서화합니다. 정의되지 않은 동작과는 달리, 모든 관련 도구가 동일한 동작을 지원한다고 그리고 그럴 경우에만 보장된다면 구현-정의 동작을 신뢰해도 안전합니다.
OpenAPI 명세서를 준수하는 OpenAPI 문서는 JSON 객체 자체이며, 이는 JSON 또는 YAML 형식으로 표현될 수 있습니다. 본 명세서의 예시는 간결함을 위해 YAML로 표시됩니다.
명세서의 모든 필드 이름은 대소문자-구분됩니다. 이는 맵의 키로 사용되는 모든 필드를 포함하며, 명시적으로 대소문자-구분 안함이라고 명시된 경우를 제외합니다.
OAS 객체는 이름이 선언된 고정 필드와 패턴이 선언된 패턴 필드 두 종류의 필드를 가집니다.
패턴 필드는 포함된 객체 내에서 이름이 고유해야 합니다(MUST).
참고: OpenAPI 설명은 YAML 또는 JSON 형식 모두로 API를 기술할 수 있으나, API 요청 및 응답 본문 등은 JSON 또는 YAML일 필요는 없습니다.
YAML과 JSON 형식 간 변환 가능성을 보존하기 위하여 RECOMMENDED로 YAML version 1.2 및 [RFC9512] Section 3.4에 명시된 추가 제한사항을 권장합니다.
이전 명세서의 “JSON” 스키마 규칙 적용 권고는 이름과 달리 JSON에서 표현 불가한 일부 값을 포함할 수 있었습니다. OAD 작성자는 그런 JSON-호환 불가 YAML 값을 SHOULD NOT 의존해서는 안 됩니다.
OpenAPI 명세서의 대부분의 필드명과 값이 대소문자-구분이기 때문에, 본 문서는 대소문자-구분 없는 이름이나 값을 명시하려고 노력합니다. 다만, HTTP의 개념과 직접적으로 연결되는 필드명과 값은 본 문서에서 모든 개념을 따로 표기하지 않더라도 HTTP의 대소문자 구분 규칙을 따릅니다.
명세서 전반에서 description 필드는 [CommonMark] 마크다운 형식을 지원한다고 명시되어 있습니다.
OpenAPI 툴링에서 서식 있는 텍스트를 렌더링할 경우 최소한 [CommonMark-0.27]에서
설명한 마크다운 문법을 MUST 지원해야 합니다. 툴링은 MAY 보안 이슈 해소를 위해 일부
CommonMark 또는 확장 기능을 무시할 수 있습니다.
CommonMark 0.27이 최소 요구조건으로 설정됨에 따라, 툴링은 MAY 그 위에 확장 기능을 구현할 수 있습니다. 다만 그러한 확장 기능은 정의상 구현-정의이며 상호 운용성이 없으니, OpenAPI 설명 작성자는 기본 지원만 제공하는 도구로 확장 추가 마크다운을 렌더링하는 방식을 꼭 고려해야 합니다(SHOULD).
이 섹션에서는 OpenAPI 설명 형식의 구조를 설명합니다. 이 내용이 형식에 대한 유일한 규범적 설명입니다. JSON 스키마는 정보용으로 spec.openapis.org에서 제공됩니다. 만약 JSON 스키마가 본 섹션과 다르다면, 반드시 (MUST) 이 섹션을 권위 있게 해석해야 합니다.
아래 설명에서 필드가 명시적으로 REQUIRED 또는 MUST, SHALL로 설명되지 않은 경우 OPTIONAL로 간주할 수 있습니다.
이 객체는 OpenAPI 설명의 루트 객체입니다.
필수 필드 외에도, 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).
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 내용을 올바르게 파싱할 수 없습니다.
OAD의 각 문서는 반드시(MUST) 참조 대상 탐지를 위해 완전히 파싱되어야 합니다.
이는 JSON
Schema Specification Draft 2020-12의 파싱 요구사항을 포함하며, URI의 상대 참조에 관한 기본 URI에 대한 적절한 수정 사항을
적용해야 합니다.
참조 대상은 OpenAPI Object의 $self 필드, Schema Object의 $id, $anchor,
$dynamicAnchor 키워드를 포함한 필드들로 정의됩니다.
구현체는 OAD의 가능한 일부로 제공된 모든 문서를 완전히 파싱하기 전에는 참조를 미해결 상태로 간주해서는 안 됩니다(MUST NOT).
참조를 해결할 때 문서의 해당 부분만 파싱하면 구현-정의 또는 정의되지 않은 동작이 나타날 수 있으며, 자세한 설명은 부분적 파싱에 대한 경고 및 부록 G를 참고하세요.
OpenAPI 설명 내에서 사용되는 참조 URI나 외부 문서, 라이선스와 같은 보조 정보 대상 URI들은 식별자로 해결되며, 본 명세에서는
URI로 설명됩니다(API URL과는
다릅니다).
일부 URI 필드는 역사적으로 url이라는 이름을 가졌지만, 설명 텍스트에는 올바른 "URI" 용어가 사용됩니다.
문서 파싱에서 언급했듯, 여러 필드들로 OpenAPI 문서 또는 Schema Object와 URI가 연결될 수 있으며, 이는 문서나 스키마의 실제 위치와 일치하지 않을 수 있습니다. 이렇게 하면 로컬 파일시스템, 제한된 네트워크 등 다양한 배포 환경에서 동일한 참조를 사용할 수 있게 됩니다.
달리 명시되지 않은 한, URI 필드는 모두 [RFC3986] Section 4.2에서 정의한 대로 상대 참조가 가능해야 합니다(MAY).
상대 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).
URI에 프래그먼트 식별자가 포함된 경우, 해당 프래그먼트는 참조된 문서의 프래그먼트 해석 방식에 따라 해결되어야 합니다. 참조된 문서가 JSON 또는 YAML 형식이면, 프래그먼트 식별자는 반드시(SHOULD) [RFC6901]의 JSON Pointer로 해석해야 합니다.
CommonMark 하이퍼링크 내부의 상대 참조는 렌더링 컨텍스트에서 해결되며, 이는 API 설명의 컨텍스트와 다를 수 있습니다.
이 명세의 여러 기능은 URI를 기반으로 하지 않는 연결을 OAD 내의 다른 부분에 대해 해결해야 합니다.
단일 문서 OAD에서는 이러한 연결이 명확하게 해결되지만, 다중 문서 OAD에서의 해결 과정은 본 섹션에 설명된 제약 내에서 구현-정의입니다. 경우에 따라, URI 기반 대안이 명확하게 제공될 수 있으며, 상호 운용성을 최대화하려면 이 대안을 사용하는 것이 권장됩니다(RECOMMENDED).
참조(비엔트리) 문서에서 Components Object 및 Tag
Object 이름을 해결할 때, 툴이 현재 문서가 아니라 엔트리 문서에서 해결하도록 하는 것이 권장됩니다(RECOMMENDED). Operation Object를
operationId로 기반해 해결하려면 모든 문서에서 파싱된 Operation Object를 고려해야 합니다(RECOMMENDED).
암시적 연결 해석에서는 URI 해석 방식이나 타겟 범위가 절대적으로 변경되지 않습니다.
상세 내용 및 암시적 연결을 사용하는 객체와 필드 목록은 부록 G: 파싱 및 해석 가이드를 참조하세요.
이 객체는 API에 대한 메타데이터를 제공합니다. 메타데이터는 필요에 따라 클라이언트에서도 사용할 수 있으며(MAY), 편의를 위해 편집 또는 문서 생성 툴에서도 표시될 수 있습니다(MAY).
| 필드 이름 | 타입 | 설명 |
|---|---|---|
| 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).
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
공개된 API의 연락처 정보입니다.
| 필드 이름 | 유형 | 설명 |
|---|---|---|
| name | string |
연락처 개인/조직의 식별 이름입니다. |
| url | string |
연락처 정보의 URI입니다. 이 값은 반드시 (MUST) URI 형식이어야 합니다. |
string |
연락처 개인/조직의 이메일 주소입니다. 이 값은 반드시 (MUST) 이메일 주소 형식이어야 합니다. |
이 객체는 MAY 명세서 확장으로 확장될 수 있습니다.
name: API Support
url: https://www.example.com/support
email: support@example.com
공개된 API의 라이선스 정보입니다.
| 필드 이름 | 유형 | 설명 |
|---|---|---|
| name | string |
REQUIRED. API에 사용되는 라이선스 이름입니다. |
| identifier | string |
API에 대한 [SPDX-Licenses] 표현입니다.
identifier 필드는 url 필드와 상호 배타적입니다.
|
| url | string |
API에 사용되는 라이선스의 URI입니다. 이 값은 반드시 (MUST) URI 형식이어야 합니다.
url 필드는 identifier 필드와 상호 배타적입니다.
|
이 객체는 MAY 명세서 확장으로 확장될 수 있습니다.
name: Apache 2.0
identifier: Apache-2.0
서버를 나타내는 객체입니다.
| 필드 이름 | 유형 | 설명 |
|---|---|---|
| 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 명세서 확장으로 확장될 수 있습니다.
API 엔드포인트는 정의상 위치로 접근되며, 본 명세에서는 이를 URLs로 설명합니다.
달리 명시되지 않는 한, URL인 모든 필드는 [RFC3986] Section 4.2에 정의된 대로 상대 참조일 수 있습니다(MAY).
API는 OpenAPI 문서와 별개의 엔터티이므로, OpenAPI 문서에 대한 RFC3986의 기본 URI 규칙은 적용되지 않습니다. 달리 명시되지 않는 한, 상대 참조는 Server Object에 정의된 URL을 기본 URL로 사용하여 해결됩니다. 이 기본 URL들도 참조 문서에 대해 상대적일 수 있다는 점에 유의하세요(MAY).
다음 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이 됩니다.
단일 서버는 다음과 같이 기술됩니다:
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
서버 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, ucschar 및 iprivate 정의는
[RFC6570]에서 가져온 것이며, literals에 대한 수정 사항은 Errata 6937를 포함합니다.
각 서버 변수는 URL 템플릿에 두 번 이상 나타나서는 안 됩니다(MUST NOT).
전체 요청 URL 구성에 대한 안내는 경로 객체를 참조하세요.
| 필드 이름 | 유형 | 설명 |
|---|---|---|
| enum | [string] |
치환 옵션이 제한된 집합인 경우 사용할 문자열 값들의 열거입니다. 이 배열은 비어 있어서는 안 됩니다(MUST NOT). |
| default | string |
REQUIRED. 치환에 사용할 기본 값입니다. 대체 값이 제공되지 않으면 이 값이
전송되어야 합니다(SHALL). enum가 정의된 경우, 이 값은 반드시 열거값 중 하나여야
합니다(MUST). 이 동작은 데이터를 삽입하는 것이 아니라 수신자의 동작을 문서화하는 Schema Object의 default 키워드와는 다릅니다. |
| description | string |
서버 변수에 대한 선택적 설명입니다. [CommonMark] 문법을 사용하여 서식 있는 텍스트로 표현할 수 있습니다(MAY). |
이 객체는 MAY 명세서 확장으로 확장될 수 있습니다.
OAS의 여러 측면에 대한 재사용 가능한 객체 집합을 보관합니다. Components Object 내에 정의된 모든 객체는 Components Object 외부에서 명시적으로 참조되지 않는 한 API에 영향을 주지 않습니다.
| 필드 이름 | 유형 | 설명 |
|---|---|---|
| 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
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
개별 엔드포인트와 그 오퍼레이션으로의 상대 경로를 보관합니다. 이 경로는 전체 URL을 구성하기 위해 Server Object의 URL에 추가됩니다. 보안 접근 제어 목록(Access Control List (ACL) 제약) 때문에 Paths Object는 MAY 비어 있을 수 있습니다.
| 필드 패턴 | 유형 | 설명 |
|---|---|---|
| /{path} | Path Item Object | 개별 엔드포인트로의 상대 경로입니다. 필드 이름은 반드시(MUST) 슬래시(/)로 시작해야
합니다. Server Object의 url 필드에서 얻은 URL은 해석되고 템플릿
변수가 치환된 다음, 전체 URL을 구성하기 위해 이 경로가 덧붙여집니다 (상대 URL 해석은 적용되지 않음). 경로 템플릿 사용이 허용됩니다. URL 매칭 시에는 구체적인(템플릿이 없는) 경로가 템플릿 경로보다
먼저 매칭됩니다. 동일한 계층 구조를 가지면서 템플릿 이름만 다른 템플릿 경로는 동일하므로 존재해서는 안 됩니다(MUST
NOT). 모호한 매칭이 발생하는 경우 어떤 것을 사용할지는 툴링에 따라 결정됩니다. |
이 객체는 MAY Specification Extensions로 확장될 수 있습니다.
경로 템플릿이란 중괄호({})로 구분된 템플릿 표현식을 사용하여 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-template는 RFC 3986,
section 3.3에서 직접 파생되었습니다.
각 템플릿 표현식은 단일 경로 템플릿 내에서 두 번 이상 나타나서는 안 됩니다(MUST NOT).
추가 지침은 부록 C: RFC6570 기반 직렬화 사용을 참조하세요.
다음 경로들을 가정하면, 구체적 정의인 /pets/mine가 사용될 경우 먼저 매칭됩니다:
/pets/{petId}
/pets/mine
다음 경로들은 동일하다고 간주되어 무효입니다:
/pets/{petId}
/pets/{name}
다음과 같은 경우 모호한 해석이 발생할 수 있습니다:
/{entity}/me
/books/{id}
/pets:
get:
description: 사용자가 접근할 수 있는 시스템의 모든 반려동물을 반환합니다.
responses:
'200':
description: 반려동물 목록입니다.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/pet'
단일 경로에서 사용할 수 있는 오퍼레이션을 설명합니다. Path Item은 접근 제어 목록(ACL 제약) 때문에 비어 있을 수 있습니다(MAY). 경로 자체는 문서 뷰어에 노출되지만 어떤 오퍼레이션과 파라미터가 사용 가능한지는 알 수 없게 됩니다.
| 필드 이름 | 유형 | 설명 |
|---|---|---|
| $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로 확장될 수 있습니다.
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'
경로에서의 단일 API 오퍼레이션을 설명합니다.
| 필드 이름 | 유형 | 설명 |
|---|---|---|
| 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
Object나 OpenAPI Object 수준에서 servers 배열이
지정되어 있으면, 이 값으로 대체됩니다. |
이 객체는 MAY Specification Extensions로 확장될 수 있습니다.
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
확장된 문서화를 위해 외부 리소스를 참조할 수 있게 합니다.
| Field Name | Type | Description |
|---|---|---|
| description | string |
대상 문서에 대한 설명입니다. [CommonMark] 문법을 사용하여 서식 있는 텍스트로 표현할 수 있습니다(MAY). |
| url | string |
REQUIRED. 대상 문서의 URI입니다. 이 값은 반드시 (MUST) URI 형식이어야 합니다. |
이 객체는 MAY Specification Extensions로 확장될 수 있습니다.
description: Find more info here
url: https://example.com
단일 오퍼레이션 파라미터를 설명합니다.
고유한 파라미터는 name과 location의 조합으로 정의됩니다.
퍼센트 인코딩 관련 세부 사항(및 application/x-www-form-urlencoded 쿼리 문자열 형식과의 상호 작용)에 관해서는 부록 E를 참조하세요.
in 필드로 지정할 수 있는 파라미터 위치는 다섯 가지입니다:
/items/{itemId}에서 경로 파라미터는
itemId입니다.
/items?id=###에서 쿼리 파라미터는 id입니다; MUST NOT 같은 오퍼레이션(또는 해당 오퍼레이션의 path-item)에
in: "querystring" 파라미터와 함께 나타나서는 안 됩니다.
content 필드를 사용하여 지정해야 하며, 보통 미디어 타입
application/x-www-form-urlencoded와 함께 Encoding
Objects를 사용하여 요청 본문과 동일한 방식으로 처리됩니다; MUST NOT 여러 번 나타나서는 안 되며,
어떤 경우에도 동일 오퍼레이션(또는 해당 오퍼레이션의 path-item)에 있는 in: "query" 파라미터와 함께 나타나서는 안 됩니다.
파라미터 직렬화 규칙은 두 가지 방식 중 하나로 지정됩니다.
Parameter Objects는 content 필드 또는 schema 필드 중 하나를 반드시 포함해야 하며, 둘을 동시에 가질 수
없습니다(MUST).
다양한 타입의 값을 문자열 표현으로 변환하는 것에 관해서는 부록 B를 참고하세요.
이들 필드는 content 또는 schema와 함께 모두 사용할 수 있습니다(MAY).
example와 examples 필드는 상호 배타적입니다; 검증 요구사항에 대한 지침은 Working with Examples를 참조하세요.
| Field Name | Type | Description |
|---|---|---|
| name | string |
REQUIRED. 파라미터의 이름입니다.
파라미터 이름은 대소문자 구분됩니다.
|
| 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"를 사용하세요.
단순한 시나리오의 경우, schema와 style로 파라미터의 구조와 문법을 설명할 수 있습니다.
이 필드들은 in: "querystring"와 함께 사용해서는 안 됩니다(MUST NOT).
in: "header" 또는 in: "cookie", style: "cookie"인 schema가 있는
파라미터의 경우 주의가 필요합니다:
이런 경우 구현체는 값을 변경하거나 인용/이스케이프하려고 시도하기보다는 있는 그대로 전달해야 합니다(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입니다. 이 필드는 자동으로 퍼센트 인코딩을 수행하는
in 및 style 조합에만 적용됩니다.
|
| schema | Schema Object | 파라미터에 사용되는 타입을 정의하는 스키마입니다. |
추가 지침은 부록 C: RFC6570 기반 직렬화 사용을 참조하세요.
보다 복잡한 시나리오에서는 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). |
단순 파라미터를 직렬화하는 일반적인 방식을 지원하기 위해 일련의 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).
|
모든 API URL은 [RFC3986] 규칙을 사용하여 성공적으로 파싱되고 퍼센트-디코드되어야 합니다(MUST).
application/x-www-form-urlencoded 형식의 콘텐츠(예: Parameter
Objects가 in: "query"로 생성하는 쿼리 문자열 포함)는 [WHATWG-URL]
규칙을 사용하여 성공적으로 파싱되고 퍼센트-디코드되어야 합니다(MUST), 이때 비퍼센트 인코딩된 +는 공백으로
처리됩니다.
이 요구사항들은 퍼센트-디코딩 규칙 관점에서 명세되며, 이는 관련 표준 버전들 간에 일관되게 관용적입니다.
퍼센트-인코딩은 여러 곳에서 수행됩니다:
퍼센트 인코딩 시 가장 안전한 방법은 RFC3986의 "unreserved" 집합에 속하지 않는 모든 문자를 인코딩하는 것이며, form-urlencoded의
경우 역사적 요구사항과의 정렬을 위해 물결표(~)도 인코딩하는 것이 권장됩니다. 본 명세의 예시에서 이 접근법을 사용합니다.
form-urlencoded에서는 [WHATWG-URL]가 공백을 +로
인코딩하도록 요구하지만, %20로 인코딩하는 것도 위 요건을 충족합니다. 본 명세의 예시에서는 RFC6570의 기본(non-reserved) 폼 스타일
확장을 사용할 때는 %20을 선호하고, 그렇지 않은 경우에는 +를 사용합니다.
예약 문자는 MUST NOT 퍼센트 인코딩되어서는 안 됩니다(예: &=+는
form-urlencoded에서 구분자 용도로 사용). 수동 퍼센트 인코딩을 통해 데이터에 비퍼센트 인코딩 구분자를 삽입하면 구현체가 결과를 올바르게
파싱하지 못할 수 있으며 그 결과는 정의되지 않습니다. 일부 경우(예: 경로 파라미터 값에 / 삽입)는 본 명세에 의해 명시적으로 금지됩니다.
또한 참조:
이 섹션의 규칙은 Parameter 및 Header Objects 모두에 적용됩니다. 두 객체는 동일한 메커니즘을 사용합니다.
Example Object의 serializedValue 또는
externalValue 필드와 같이 직렬화된 예시를 표시할 때, 대부분의 경우 표시할 값은 관련 퍼센트 인코딩 또는 다른 인코딩/이스케이프가 적용된 값
자체이며, style과 explode 구성에 의해 생성된 모든 구분자도 포함됩니다.
이름이 직렬화 구성의 고유한 일부인 경우(예: style: "form"으로 생성되는 name=value 쌍 또는
style: "simple", explode: true 조합), 이름과 이름-값 사이의 구분자는 반드시 포함되어야 합니다(MUST).
matrix와 label 스타일은 항상 선행 구분자를 생성하며, 이는 직렬화의 유효한 부분이므로 반드시 포함되어야 합니다(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를
참조하세요.
예를 들어 color라는 파라미터가 다음 값 중 하나를 가지는 경우, 오른쪽의 값이 Example Object의 dataValue
필드에 표시되는 값입니다:
string -> "blue"
array -> ["blue", "black", "brown"]
object -> { "R": 100, "G": 200, "B": 150 }
다음 표는 Example Object의 serializedValue 필드에 표시되는 것과 같은 다양한 직렬화 예시를 보여줍니다.
allowEmptyValue 필드와는 관련이 없습니다.empty 열을 대체한 undefined 열은 [RFC6570]의
용어와 더 잘 정렬되도록 변경된 것입니다.form 및 RFC6570이 아닌 쿼리 문자열 스타일인 spaceDelimited,
pipeDelimited, deepObject의 경우 여러 파라미터로부터 쿼리 문자열을 구성하는 방법에 대해서는 부록 C를, form 및
cookie 파라미터에 대한 경고는 부록 D를
참조하세요.
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 |
많은 프레임워크가 파라미터 이름에 배열 인덱스를 첨부하거나 중첩 객체의 여러 수준을 표시하는 등 복잡한 값에 대한 쿼리 문자열 구문을 정의합니다. 이러한 방식은
deepObject의 능력을 넘어서는 경우가 많습니다.
이들은 표준이 아니며 서로 충돌하는 경우가 많기 때문에 OAS는 직접적으로 이들을 지원하려고 하지 않습니다.
in: "querystring"에 대해 이러한 형식을 지원하는 두 가지 방법은 다음과 같습니다:
content와 text/plain을 사용하고 스키마로 type: "string"을 지정하여
OpenAPI 외부에서 형식을 정의합니다. OpenAPI 관점에서는 이 형식이 단순 문자열로 보이므로 문서화 및 구성/파싱에 더 많은 작업이 필요하지만 가장 유연한
옵션입니다.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"
이후의 예시들도 모두 원문 코드 블록 그대로 유지되어 있습니다.
단일 요청 본문을 설명합니다.
| 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로 확장될 수 있습니다.
참조된 스키마 정의를 가진 요청 본문 예시입니다.
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
각 Media Type Object는 해당 키로 식별되는 미디어 타입에 따라 구조화된 콘텐츠를 설명합니다. 여러 Media Type Object는 여러 다른 미디어 타입 중 어느 하나로 나타날 수 있는 콘텐츠를 설명하는 데 사용될 수 있습니다.
example 또는 examples가 제공된 경우, 예시는 지정된 schema와 일치하고 미디어 타입 및 그 인코딩에서
요구하는 올바른 형식이어야 합니다(SHOULD). example과 examples 필드는 상호
배타적입니다. 비-JSON/YAML 값을 포함한 다양한 예시 지정 방식에 대한 추가 안내는 Working With
Examples를 참조하세요.
| 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로 확장될 수 있습니다.
미디어 타입은 IANA 미디어 타입 레지스트리(IANA media types registry)에 공개적으로 등록됩니다(등록 절차는 [RFC6838]에 문서화되어 있습니다).
API는 가끔 GitHub의 application/vnd.github.v3+json과 같은 비공개 미디어 타입을 정의하거나,
application/schema+json처럼 등록 전에 널리 사용되는 타입을 정의하기도 합니다.
다양한 미디어 타입과 함께 스키마를 사용하는 방법에 대한 지침은 Parsing and Serializing (해당 Schema Object 섹션)을 참조하세요.
OpenAPI Initiative는 이 명세에서 기대되는 미디어 타입 지원을 요약하고 각 미디어 타입과 연관된 섹션을 색인화하는 Media Type Registry를 운영합니다. 또한 IANA 등록(존재하는 경우) 및 각 미디어 타입과 관련된 주요 명세 문서들을 연결합니다. 이 레지스트리에 추가된 미디어 타입(확장 또는 이후 버전의 OpenAPI 명세에 추가된 것)은 이 버전의 OAS 구현체에서 MAY 지원될 수 있습니다.
schema 필드는 미디어 타입과 문맥(Request Body Object,
Response Object, Parameter Object, 또는
Header Object)에 의해 정의된 전체 콘텐츠에 적용되어야 합니다(MUST). 이는 콘텐츠를 전체 메모리에 로드해야 함을 의미하므로 스트리밍 콘텐츠에 도전과제를 제기합니다. 클라이언트가 언제 읽기를
멈출지 선택하게 하는 사용 사례는 스트림의 명확한 종료가 없기 때문에 특히 까다롭습니다.
본 명세에서 연속적 미디어 타입(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도 참고하세요.
itemSchema 필드는 연속적 미디어 타입의 스트리밍 사용 사례를 지원하기 위해 제공되며, 스트리밍 위치 기반 multipart 미디어 타입의 인코딩 메커니즘으로
itemEncoding를 제공합니다.
schema와 달리(전체 콘텐츠에 적용됨), itemSchema는 스트림의 각 항목에 독립적으로 적용되어 스트림에서
항목을 읽는 즉시 각 항목을 처리할 수 있도록 지원해야 합니다(MUST).
schema와 itemSchema는 동일한 Media Type Object에서 함께 사용될 수 있습니다(MAY). 다만 이렇게 하는 것은 schema 필드 내의 items
키워드를 사용하는 것보다 큰 이점이 없는 경우가 대부분입니다.
maxLength 키워드는 문자열 데이터(인코딩된 바이너리 데이터 포함) 또는 비인코딩 바이너리 데이터로 구성된 스트리밍 페이로드의 예상 상한 길이를
설정하는 데 MAY 사용될 수 있습니다. 비인코딩 바이너리 데이터의 경우 길이는 옥텟 수입니다. 이 사용 사례에서
maxLength는 JSON Schema가 바이너리 데이터에 직접 적용되지 않기 때문에 정규 JSON Schema 평가 외부에서 구현될 수 있습니다.
인코딩된 바이너리 스트림을 전체 메모리에 저장하는 것은 비현실적일 수 있습니다.
text/event-stream의 경우, 구현체는 text/event-stream
명세에 따라 이벤트 스트림을 파싱한 이후의 이벤트 데이터와 작업해야 하며, 특정 필드(주석 포함)와 값을 무시하거나 여러 줄에 걸쳐 분할된 값을 결합하는 등 모든
지침을 따라야 합니다(MUST).
필드 값 타입은 text/event-stream 명세에 지정된 대로 처리되어야 합니다(예: retry 필드 값은 JSON 숫자로
모델링되어 JSON Schema의 type: integer로 예상됨). 명시적 값 타입이 없는 필드는 문자열로 처리되어야 합니다(MUST).
text/event-stream 사용자의 일부는 특히 data 필드에 대해 필드 값으로 JSON 형식을 사용하는 경우가 있습니다. 이럴
때 문자열로 인코딩된 데이터의 내용을 다루기 위해 JSON Schema의 contentMediaType와 contentSchema
키워드를 사용하여 문자열 관련 검증 키워드(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
이들 인코딩 필드는 각 Encoding Object를 데이터의 특정 값에 어떻게 매핑할지 정의합니다. 각 필드는 사용할 수 있는 미디어 타입 세트가 있으며, 해당 미디어 타입이 아닌 다른 타입에 대해서는 세 필드 모두 무시되어야 합니다(SHALL).
encoding 필드의 동작은 웹 폼을 지원하도록 설계되었으므로, 반복 값을 허용하는 이름-값 쌍으로 구조화된 미디어 타입에 대해서만 정의됩니다. 특히
application/x-www-form-urlencoded와 multipart/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를
참조하세요.
대부분의 multipart 미디어 타입(모든 multipart 타입의 구문 분석 규칙을 정의하는
multipart/mixed 포함)은 명명된 파트를 가지지 않습니다. 이러한 미디어 타입의 데이터는 한 파트당 하나의 항목을 가지는 배열로
모델링됩니다(순서 중요).
prefixEncoding 및/또는 itemEncoding 필드를 사용하려면 itemSchema 또는
배열 형태의 schema가 있어야 합니다(MUST). 이들 필드는 JSON Schema의
prefixItems 및 items 키워드와 유사하며, prefixEncoding은 데이터 배열에서
동일한 위치의 값에 각각 적용되는 Encoding Objects 배열을 제공하고, itemEncoding은 배열의 나머지 항목 전체에 단일
Encoding Object를 적용합니다. 인스턴스 배열이 prefixEncoding 배열보다 짧아도 오류가 아니며, 추가 Encoding
Objects는 무시되어야 합니다(SHALL).
itemEncoding 필드는 스트리밍 multipart 콘텐츠 지원을 위해 itemSchema와 함께
사용할 수도 있습니다.
prefixEncoding 필드는 고정된 파트 순서를 요구하기 위해 어떤 multipart 콘텐츠와도 함께 사용할 수 있습니다.
이에는 Encoding Object의 headers 필드를 사용해 Content-Disposition 및 파트 이름을 제공해야
하는 multipart/form-data가 포함됩니다(속성 이름이 자동으로 제공되지 않기 때문입니다).
이전 버전의 명세는 multipart 미디어 타입(특히 multipart/form-data 외의 경우)에 대해 각 파트의
Content-Disposition: form-data 헤더의 name parameter를
사용하도록 권고하여 encoding 필드의 한계를 우회하도록 제안했습니다. 구현체는 이 워크어라운드를 선택적으로 지원할 수 있지만, 이 사용 방식은
일반적이지 않으므로 비-form-data multipart 미디어 타입 구현체는 이를 지원할 가능성이 낮습니다.
폼 관련 및 multipart 미디어 타입 예시는 Encoding Object를 참고하세요.
이 예시는 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'
시퀀스의 항목이 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를 보여주며, schema와
itemSchema의 관계와 각각을 언제 사용해야 하는지를 설명합니다.
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!"
}
이 예시에서는 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}"}
OpenAPI 2.0과 달리, OAS 3.x에서의 file 입력/출력 콘텐츠는 다른 스키마 타입과 동일한 의미론으로 기술됩니다.
OAS 3.0과 달리, OAS 3.1에서는 format 키워드가 스키마의 콘텐츠 인코딩에 영향을 주지 않습니다. 대신 JSON Schema의
contentEncoding 및 contentMediaType 키워드를 사용합니다. 다양한 시나리오를 이 키워드들로 모델링하는 방법과
이전의 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를 참조하세요.
단일 값을 대상으로 적용되는 단일 인코딩 정의입니다. Encoding Objects와 값의 매핑은 Media Type Object에서 설명한 바와 같이 Encoding Usage and Restrictions에 의해 결정됩니다.
다양한 타입의 값을 문자열 표현으로 변환하는 논의는 Appendix B를 참조하세요.
폼 미디어 타입의 퍼센트 인코딩 관련 상세 검토는 Appendix E를 참조하세요.
이들 필드는 아래 섹션에 정의된 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 Object의 encoding 필드와 동일한
방식으로 중첩 Encoding Objects를 적용합니다.
|
| prefixEncoding | [Encoding Object] | Media Type Object의 prefixEncoding 필드와
동일한 방식으로 중첩 Encoding Objects를 적용합니다. |
| itemEncoding | Encoding Object | Media Type Object의 itemEncoding 필드와
동일한 방식으로 중첩 Encoding Objects를 적용합니다. |
이 객체는 MAY Specification Extensions로 확장될 수 있습니다.
contentType의 기본값은 다음과 같습니다. contentEncoding 열의 n/a는
contentEncoding의 존재 또는 값이 무관함을 의미합니다.
이 표는 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를 참조하세요.
| 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 중 적어도 하나가 명시적으로 존재하는 것은
schema와 in: "query" Parameter Objects를 사용하는 것과 동등합니다.
이들 세 필드가 모두 없는 경우는 content를 사용하는 것과 동등하지만, 미디어 타입은 Media Type Object를 통해서가 아니라
contentType에 의해 지정된다는 점이 다릅니다.
인코딩이 필요한 중첩 포맷(특히 중첩된 multipart/mixed)은 이 객체의 encoding,
prefixEncoding, 및/또는 itemEncoding 필드로 지원할 수 있습니다.
구현체는 한 수준의 중첩을 반드시 지원해야 하며(MUST), 추가 수준의 지원은 선택사항입니다(MAY).
[WHATWG-URL] 규칙에 따라 form url 인코딩 콘텐츠를 다루려면 Media Type Object에서 application/x-www-form-urlencoded
미디어 타입을 사용하세요.
이 설정은 복잡한 객체가 먼저 문자열 표현으로 직렬화된 후 해당 미디어 타입 규칙에 따라 퍼센트-인코딩되어야 함을 의미합니다(MUST).
폼 미디어 타입의 퍼센트 인코딩 문제에 대한 상세 검토는 Appendix E를 참조하세요.
encoding 필드가 없을 때 직렬화 전략은 Encoding Object의 기본값에 기반합니다:
requestBody:
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
id:
type: string
format: uuid
address:
type: object
properties: {}
이 예에서 id가 f81d4fae-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
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
예: name이 example이고 icon이 빨간색 2x2 PNG라면 요청 본문은 다음과 같습니다:
name=example&icon=iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAIAAAD91JpzAAAABGdBTUEAALGPC_xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAqADAAQAAAABAAAAAgAAAADO0J6QAAAAEElEQVQIHWP8zwACTGCSAQANHQEDqtPptQAAAABJRU5ErkJggg%3D%3D
= 패딩 문자는 contentEncoding: base64url 같은 "URL safe" 인코딩을 사용하더라도
퍼센트-인코딩되어야 합니다.
일부 base64 디코더는 RFC4648 섹션에 따라 패딩 없이도 처리할 수 있지만 보장되지 않으므로 호환성을 위해 패딩을 유지하고 퍼센트-디코딩에 의존하는 것이 더 안전할
수 있습니다.
스키마 속성과 파트를 연관시키는 방법에 대한 지침은 Encoding Usage and Restrictions를 참조하세요.
multipart 미디어 타입에서 사용할 수 있는 헤더에는 일반적으로 상당한 제한이 있음을 유의하세요([RFC2046] Section 5.1) 및 특히
multipart/form-data에 관해서는 [RFC7578] Section 4.8을
참조하세요.
contentType에 여러 값이 지정된 경우에도 파트의 실제 Content-Type이 문서에 포함되므로 파싱은 간단합니다.
인코딩 및 직렬화 시 구현체는 애플리케이션이 의도한 미디어 타입을 표시할 수 있는 메커니즘을 반드시 제공해야 합니다(MUST). 구현체는 대안으로 미디어 타입 스니핑([SNIFF])을 제공할 수 있지만, 보안 위험 때문에 기본 동작으로 이것을 사용해서는 안 됩니다(MUST NOT).
멀티파트 필드에 대해 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를 참조하세요.
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'
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
[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 미디어 타입을 나타냅니다.
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/*
[RFC2557]에 설명된 바와 같이, 웹 페이지를 구성하는 리소스 집합은
multipart/related 페이로드로 전송될 수 있으며, 각 파트에 Content-Location 헤더를 정의하여
text/html 문서에서 보조 리소스로의 링크를 보존할 수 있습니다.
첫 번째 파트는 루트 리소스로 사용되므로(Content-ID 사용은 권장되지 않음) prefixItems와
prefixEncoding을 사용하여 첫 파트가 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'
이 예시는 대량의 사진을 캡처하여 호출자에게 스트리밍하는 장치를 가정합니다.
이전 예와 달리 여기서는 각 이미지를 도착했을 때(또는 소규모 배치로) 처리할 것으로 기대하므로 itemSchema를 사용합니다. 전체 스트림을
버퍼링하면 메모리가 부족해지기 때문입니다.
multipart/mixed:
itemSchema:
$comment: A single data image from the device
itemEncoding:
contentType: image/jpg
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
이는 첫 번째 파트가 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
오퍼레이션의 예상 응답을 담는 컨테이너입니다. 이 컨테이너는 HTTP 응답 코드를 해당 예상 응답에 매핑합니다.
문서화는 모든 가능한 HTTP 응답 코드를 반드시 다루지 않을 수 있습니다. 이는 사전에 알 수 없는 코드가 있을 수 있기 때문입니다. 하지만 문서에는 성공적인 오퍼레이션 응답과 알려진 오류들은 포함되어야 합니다.
default는 Responses Object에 개별적으로 포함되지 않은 모든 HTTP 코드에 대한 기본 Response Object로서 MAY 사용될 수 있습니다.
Responses Object는 최소 하나의 응답 코드를 포함해야 합니다(MUST). 만약 하나의 응답 코드만 제공된다면, 그 코드는 성공적인 오퍼레이션 호출에 대한 응답인 것이 SHOULD 권장됩니다.
| Field Name | Type | Description |
|---|---|---|
| default | Response Object | Reference Object | 특정 HTTP 응답 코드에 대해 선언된 것 이외의 응답들을 문서화합니다. 선언되지 않은 응답을 다루기 위해 이 필드를 사용하세요. |
| Field Pattern | Type | Description |
|---|---|---|
| HTTP Status Code | Response Object | Reference Object | 어떤 HTTP 상태 코드도 속성 이름으로 사용할 수 있습니다. 단, 코드별로 하나의 속성만
허용되며, 해당 HTTP 상태 코드에 대한 예상 응답을 설명합니다. 이 필드는 JSON과 YAML 간의 호환성을 위해 반드시(MUST) 따옴표로 묶여야 합니다(예: “200”). 응답 코드 범위를 정의하려면, 이 필드에 대문자 와일드카드
문자 X를 사용할 수 있습니다(MAY). 예를 들어 2XX는
200에서 299까지의 모든 응답 코드를 나타냅니다. 허용되는 범위 정의는 다음만 허용됩니다:
1XX, 2XX, 3XX, 4XX,
5XX. 만약 응답이 명시적 코드로 정의되어 있다면, 그 명시적 코드 정의가 해당 코드에 대한 범위 정의보다 우선합니다.
|
이 객체는 MAY Specification Extensions로 확장될 수 있습니다.
HTTP 상태 코드는 실행된 오퍼레이션의 상태를 나타내는 데 사용됩니다. 상태 코드는 IANA Status Code Registry에 등록된 사용 가능한 상태 코드들 중에서 선택하는 것이 SHOULD 권장됩니다.
성공한 오퍼레이션에 대한 200 응답과 기타(오류를 암시하는) 경우에 대한 기본 응답 예시:
'200':
description: 반환될 애완동물
content:
application/json:
schema:
$ref: '#/components/schemas/Pet'
default:
description: 예상치 못한 오류
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorModel'
API 오퍼레이션으로부터의 단일 응답을 설명합니다. 또한 응답을 기반으로 하는 설계 시점의 정적 links를 포함할 수 있습니다.
| 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로 확장될 수 있습니다.
복잡한 타입의 배열을 응답으로 반환하는 예시:
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: 객체 생성됨
부모 오퍼레이션과 관련된 가능한 비동기 콜백들의 맵입니다. 맵의 각 값은 API 제공자가 시작할 수 있는 일련의 요청과 예상 응답들을 설명하는 Path Item Object입니다. Path Item Object를 식별하는 데 사용되는 키 값은 런타임에 평가되는 표현식으로, 콜백 오퍼레이션에 사용할 URL을 식별합니다.
다른 API 호출과 독립적으로 API 제공자로부터 들어오는 요청을 설명하려면 webhooks 필드를 사용하세요.
| Field Pattern | Type | Description |
|---|---|---|
| {expression} | Path Item Object | 콜백 요청과 예상 응답을 정의하는 데 사용되는 Path Item Object입니다. 완전한 예시를 참고하세요. |
이 객체는 MAY Specification Extensions로 확장될 수 있습니다.
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 |
다음 예시는 사용자 제공 쿼리 문자열 파라미터 queryUrl을 사용하여 콜백 URL을 정의합니다. 이는 웹훅과 유사하지만, 콜백은 초기 요청에서 queryUrl을 전송했기 때문에 발생한다는 점에서 다릅니다.
myCallback:
'{$request.query.queryUrl}':
post:
requestBody:
description: 콜백 페이로드
content:
application/json:
schema:
$ref: '#/components/schemas/SomePayload'
responses:
'200':
description: 콜백이 성공적으로 처리됨
다음 예시는 서버가 하드코딩되어 있지만 쿼리 문자열 파라미터가 요청 본문의 id와 email 속성으로 채워지는 콜백 예시입니다.
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: 콜백이 성공적으로 처리됨
내부 또는 외부 예시 값을 기본 summary 및 description 메타데이터와 함께 그룹화한 객체입니다.
예시들은 스키마 검증에 적합한 데이터나 포함하는 Media Type Object, Parameter Object, 또는 Header Object에 요구되는
직렬화된 데이터를 보여줄 수 있습니다.
이 객체는 일반적으로 복수형 examples 필드에 사용되며, 참조 가능한(referenceable)
대안으로 오래된 단수형 example 필드를 대체합니다.
다양한 필드와 예시 유형에 대한 자세한 설명은 Working With Examples에서 확인할 수 있습니다.
| 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
권장됩니다. 이 필드가 존재하면 value와 externalValue는 반드시 부재해야 합니다.
|
| externalValue | string |
직렬화된 예시를 별도의 문서로 식별하는 URI로, 유니코드 문자열로 쉽게 표현하기 어려운 값을 허용합니다. 만약 dataValue가
존재한다면, 이 필드는 주어진 데이터의 직렬화를 식별하는 것이 SHOULD 권장됩니다. 그렇지 않다면, 이 값은
자체적으로 dataValue에 대해 유효한 직렬화를 식별해야 합니다. 이 필드가 존재하면
serializedValue와 value는 반드시 부재해야 합니다. 또한 Relative References 규칙을
따르세요.
|
| value | Any | 임베디드 리터럴 예시입니다. value 필드와 externalValue 필드는 상호 배타적입니다. JSON이나
YAML로 자연스럽게 표현할 수 없는 미디어 타입의 예시는 문자열 값을 사용하여 예시를 포함하고 필요 시
이스케이프하세요.비-JSON 직렬화 대상에 대해 권장 중단: 구문과 의미가 명확한 dataValue 및/또는 serializedValue 사용을 권장합니다.
|
이 객체는 MAY Specification Extensions로 확장될 수 있습니다.
모든 경우에 예시 값은 연관된 스키마와 호환되는 것이 SHOULD 권장됩니다. 툴링 구현체는 자동으로 호환성을 검증하고, 호환되지 않을 경우 예시 값을 거부할 수 있습니다(MAY). 각 필드에 대한 “호환성”의 정확한 의미는 Validating Examples를 참조하세요.
Example Object는 Parameter Objects, Header
Objects, 및 Media Type
Objects에서 사용될 수 있습니다.
세 객체 모두에서 이는 복수형 examples 필드를 통해 이루어집니다.
하지만 예시를 제공하는 다른 방법들도 존재합니다: 단수형 example 필드(복수형 examples와 상호 배타적)와, 스키마 내부의
키워드들(스키마의 단수형 example과 복수형 examples) 등입니다.
우리는 Parameter, Header, 또는 Media Type Object에서의 단수형 example 필드를 “약식
example”이라고 지칭합니다(이는 value 필드만 가진 단일 Example Object와 동일한 동작).
각각의 필드는 약간씩 다른 고려사항을 가집니다.
value와 약식 example 필드는 serializedValue(또는
externalValue)와 동일한 의미론을 가지도록 의도되었지만, JSON(또는 JSON-호환 YAML)
표현과 최종 직렬화 형태 사이에 차이가 없을 때 더 편리한 문법을 허용합니다.
application/json 또는 +json 미디어 타입에 대해 이 문법을 사용할 때, 이들 필드는 사실상
dataValue처럼 동작하므로 안전하게 사용할 수 있습니다.
데이터가 단일 문자열로 이루어지고 그 직렬화 대상이 text/plain처럼 문자열이 추가 이스케이프 없이 보장되어 직렬화되는 경우에도 이러한 필드는
안전하게 사용할 수 있습니다.
다른 직렬화 대상의 경우, “JSON 또는 YAML로 자연스럽게 표현될 수 있음”이라는 모호성 때문에 비호환성 문제가 발생할 수 있습니다. 실무에서는 비-JSON 대상에 대해
value와 약식 example의 동작이 구현체마다 달라질 수 있으므로 OAD 작성자는 상호운용성을 위해 다른 필드를 사용하는
것을 SHOULD 권장합니다.
이전 섹션의 주의사항을 염두에 두고, 약식 example이 단일 Example Object에 대해서는 value 대신 사용될 수
있다는 점을 고려하여 다음 지침을 따르세요.
스키마로 검증될 예시를 보여주려면:
examples 배열(JSON Schema draft 2020-12)을
사용하세요.
example을 사용하세요.dataValue 필드를 사용하세요.
value 필드를 사용하세요.
HTTP/1.1 메시지를 구성하기 위해 실제 직렬화된 예시를 보여주려면:
serializedValue를 사용하세요.
value를 사용하세요.externalValue를 사용하세요.serializedValue와 externalValue는 모두 직렬화된 형태를 반드시(MUST) 보여주어야 합니다.
Media Type Objects의 경우 이는 적절한 미디어 타입의 문서이며, Encoding Object의 효과가 적용되어야 합니다.
Parameter 및 Header Objects가 schema와 style를 사용하는 경우 직렬화 값의 정의는 Style Examples를 참조하세요.
다음 조건 중 하나라도 만족하면 직렬화는 serializedValue에 유효한 유니코드 문자열로 표현될 수 있습니다:
charset 파라미터를 허용하는 미디어 타입으로, 모든 유니코드 인코딩(UTF-8, UTF-16 등)이나 그 유효한
부분집합(예: US-ASCII)을 지정하는 경우.charset으로
오버라이드되지 않는 경우.multipart/mixed로 구성된 파트들이
application/json과 application/xml; charset=utf-8인 경우).
이 모든 경우에 OAD의 문자 집합(일반적으로 JSON의 상호운용 문자 집합으로서 UTF-8로 가정)은 유니코드 코드 포인트로 변환된 다음 실제 직렬화 문자 집합으로 변환되는 과정이 잘 정의되어야 합니다.
externalValue의 경우 문자 집합이 명시되지 않았거나 형식/미디어 타입 명세로 결정되지 않으면 구현체는 UTF-8을 가정하는 것이 SHOULD 권장됩니다.
툴링 구현체는 예시의 호환성을 자동으로 검증하고, 호환되지 않을 경우 예시 값을 거부할 수 있습니다(MAY). 스키마-준비된 데이터 형식의 예시는 검증이 간단합니다.
직렬화된 예시의 경우 여러 표현이 동일한 데이터를 표현할 수 있는 포맷들이 있으며(부록 B 참조), 어떤 경우에는 직렬화된 예시를 파싱하여 결과 데이터를 검증함으로써 모호성을 제거할 수 있지만, 일부 경우 파싱 자체도 모호할 수 있습니다. 따라서 특정 직렬화 예시의 검증은 본질적으로 최선의 노력을 필요로 함을 주의하세요.
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
}
완전한 바이너리 데이터는 externalValue를 사용하여 표시합니다:
content:
image/png:
schema: {}
examples:
Red:
externalValue: ./examples/2-by-2-red-pixels.png
불리언 값을 직렬화하는 표준이 없기 때문에(부록 B 참조) 이 예시는 해당 파라미터에 대해 dataValue와
serializedValue를 사용하여 불리언이 어떻게 직렬화되는지를 보여줍니다:
name: flag
in: query
required: true
schema:
type: boolean
examples:
"true":
dataValue: true
serializedValue: flag=true
"false":
dataValue: false
serializedValue: flag=false
Link Object는 응답에 대한 설계 시점에서 가능한 링크를 나타냅니다. 링크의 존재가 호출자가 해당 링크를 성공적으로 호출할 수 있음을 보장하는 것은 아니며, 대신 응답과 다른 오퍼레이션 간의 알려진 관계 및 탐색 메커니즘을 제공합니다.
동적 링크(즉 응답 페이로드 내에 제공되는 링크)와는 달리, OAS의 링크 메커니즘은 런타임 응답에 링크 정보를 포함할 것을 요구하지 않습니다.
링크를 계산하고 실행하는 방법을 제공하기 위해, 연결된 오퍼레이션을 호출할 때 오퍼레이션의 값을 접근하고 매개변수로 사용하는 데 runtime expression이 사용됩니다.
| 필드 이름 | 유형 | 설명 |
|---|---|---|
| operationRef | string |
OAS 오퍼레이션에 대한 URI 참조입니다. 이 필드는 operationId 필드와 상호 배타적이며, MUST Operation Object를 가리켜야
합니다. 상대적인 operationRef 값은 OpenAPI Description 내의 기존 Operation Object를 찾는 데 MAY 사용될
수 있습니다.
|
| operationId | string |
고유한 operationId로 정의된 기존으로 해석 가능한 OAS 오퍼레이션의 이름입니다. 이 필드는
operationRef 필드와 상호 배타적입니다.
|
| parameters | Map[string, Any | {expression}] |
operationId로 지정되었거나 operationRef로 식별된 오퍼레이션에 전달할 매개변수를 나타내는
맵입니다. 키는 사용될 매개변수 이름(선택적으로 매개변수 위치로 한정, 예: 경로의 id 파라미터를 위한
path.id)이고, 값은 상수이거나 평가되어 연결된 오퍼레이션에 전달될 표현식일 수 있습니다.
|
| requestBody | Any | {expression} | 대상 오퍼레이션을 호출할 때 요청 본문으로 사용할 리터럴 값 또는 {expression}입니다. |
| description | string |
링크에 대한 설명입니다. [CommonMark] 문법을 사용하여 풍부한 텍스트 표현을 할 수 있습니다(MAY). |
| server | Server Object | 대상 오퍼레이션에서 사용할 서버 객체입니다. |
이 객체는 MAY Specification Extensions로 확장될 수 있습니다.
연결된 오퍼레이션은 MUST operationRef 또는 operationId 중 하나로
식별되어야 합니다.
식별되거나 참조된 오퍼레이션은 유일해야 하며, operationId의 경우 OpenAPI Description(OAD) 범위 내에서 반드시(MUST) 해석되어야 합니다.
이름 충돌 가능성 때문에 다중 문서 OAD에서는 operationRef 문법이 선호됩니다.
다만 오퍼레이션 사용은 Paths Object의 URL 경로 템플릿에 의존하기 때문에, OAD 내에서 여러 번 참조되는 Path Item Object로부터 온 오퍼레이션은 명확하게 해석될 수 없습니다.
이러한 애매한 경우에는 결과 동작이 구현체별로 정의되며 오류가 발생할 수 있습니다(MAY).
parameters에 런타임 표현식 문법과 동일한 구문을 갖는 상수 값을 제공하는 것은 불가능하다는 점에 유의하세요.
예를 들어 name: "id", in: "path"와 name: "path.id", in: "query"처럼 모호한 매개변수 이름이
존재할 수 있습니다; 이는 권장되지 않으며(NOT RECOMMENDED) 동작이 구현체별로 정의됩니다. 그러나 구현체는 항상 한정된
해석(예: path.id를 경로 매개변수로 해석)을 선호해야 합니다(SHOULD), 왜냐하면 이름을 명확히 하기
위해 언제든지 한정자(예: 쿼리 파라미터의 경우 query.path.id)를 사용할 수 있기 때문입니다.
요청 오퍼레이션에서 링크를 계산하는 예로, $request.path.id가 연결된 오퍼레이션으로 요청 파라미터를 전달하는 데 사용되는 경우입니다.
paths:
/users/{id}:
parameters:
- name: id
in: path
required: true
description: the user identifier, as userId
schema:
type: string
get:
responses:
'200':
description: the user being returned
content:
application/json:
schema:
type: object
properties:
uuid: # the unique user id
type: string
format: uuid
links:
address:
# the target link operationId
operationId: getUserAddress
parameters:
# get the `id` field from the request path parameter named "id"
userid: $request.path.id
# the path item of the linked operation
/users/{userid}/address:
parameters:
- name: userid
in: path
required: true
description: the user identifier, as userId
schema:
type: string
# linked operation
get:
operationId: getUserAddress
responses:
'200':
description: the user's address
런타임 표현식이 평가에 실패하면 대상 오퍼레이션으로 전달되는 매개변수 값은 없습니다.
응답 본문의 값은 연결된 오퍼레이션을 구동하는 데 사용할 수 있습니다.
links:
address:
operationId: getUserAddressByUUID
parameters:
# get the `uuid` field from the `uuid` field in the response body
userUuid: $response.body#/uuid
클라이언트는 자유 판단에 따라 모든 링크를 따를 수 있습니다. 권한이나 해당 링크를 성공적으로 호출할 수 있는 능력은 단지 관계의 존재만으로 보장되지 않습니다.
operationId는 Operation Object에서 선택적 필드이므로, 참조는 대신
operationRef로 URI 참조를 통해 이루어질 수 있습니다(MAY).
아래 예시들 모두 오퍼레이션의 경로 템플릿이 모호하지 않도록 Paths Object를 통해 식별 가능한 오퍼레이션을
참조한다는 점에 유의하세요.
상대 URI 참조형 operationRef 예시:
links:
UserRepositories:
# returns array of '#/components/schemas/repository'
operationRef: '#/paths/~12.0~1repositories~1%7Busername%7D/get'
parameters:
username: $response.body#/username
비상대(절대) URI operationRef 예시:
links:
UserRepositories:
# returns array of '#/components/schemas/repository'
operationRef: https://na2.gigantic-server.com/#/paths/~12.0~1repositories~1%7Busername%7D/get
parameters:
username: $response.body#/username
operationRef를 사용할 때 JSON Pointer를 URI fragment에서 사용할 경우 이스케이프된
슬래시(~1)가 필요하며, 경로 템플릿의 중괄호 { 및 }는 각각
%7B와 %7D로 URL 인코딩해야 합니다.
위 예시에서 비-인코딩된, 퍼센트-디코드된 경로 템플릿은 /2.0/repositories/{username}가 됩니다.
Runtime expression은 실제 API 호출의 HTTP 메시지 내에서만 사용 가능하게 되는 정보에 기반하여 값을 정의할 수 있게 합니다. 이 메커니즘은 Link Objects 및 Callback Objects에서 사용됩니다.
런타임 표현식은 다음의 [ABNF] 문법으로 정의됩니다
expression = "$url" / "$method" / "$statusCode" / "$request." source / "$response." source
source = header-reference / query-reference / path-reference / body-reference
header-reference = "header." token
query-reference = "query." name
path-reference = "path." name
body-reference = "body" ["#" json-pointer ]
json-pointer = *( "/" reference-token )
reference-token = *( unescaped / escaped )
unescaped = %x00-2E / %x30-7D / %x7F-10FFFF
; %x2F ('/') and %x7E ('~') are excluded from 'unescaped'
escaped = "~" ( "0" / "1" )
; representing '~' and '/', respectively
name = *char
token = 1*tchar
tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "."
/ "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA
여기서 json-pointer는 [RFC6901]에서 가져오며,
char는 [RFC8259]에서, token은 [RFC9110]에서 가져옵니다.
name 식별자는 대소문자 구분이며, 반면 token은 대소문자 구분이 아닙니다.
아래 표는 런타임 표현식의 예시와 값으로 사용할 때의 사용 예를 제공합니다:
| 출처 위치 | 예시 표현식 | 비고 |
|---|---|---|
| HTTP Method | $method |
$method에 허용되는 값은 HTTP 오퍼레이션에서의 값들입니다. |
| 요청 미디어 타입 | $request.header.accept |
|
| 요청 파라미터 | $request.path.id |
요청 파라미터는 부모 오퍼레이션의 parameters 섹션에 선언되어 있어야 평가될
수 있습니다. 이것은 요청 헤더도 포함합니다. |
| 요청 본문 속성 | $request.body#/user/uuid |
페이로드를 허용하는 오퍼레이션에서는 requestBody의 일부 또는 전체 본문을
참조할 수 있습니다. |
| 요청 URL | $url |
|
| 응답 값 | $response.body#/status |
페이로드를 반환하는 오퍼레이션에서는 응답 본문의 일부 또는 전체를 참조할 수 있습니다. |
| 응답 헤더 | $response.header.Server |
단일 헤더 값만 사용할 수 있습니다 |
런타임 표현식은 참조된 값의 타입을 보존합니다.
표현식은 중괄호 {}로 감싸서 문자열 값 안에 포함시킬 수 있습니다.
HTTP 응답의 헤더와 multipart 표현의 개별 파트에 대한 단일 헤더를 설명합니다; 관련된 제약 사항은 해당 Response Object 및 Encoding Object 문서를 참조하세요.
Header Object는 Parameter Object의 구조를 따르며, schema 또는
content의 존재 여부에 따라 직렬화 전략을 결정합니다. 다만 다음과 같은 변경점이 있습니다:
name는 MUST NOT 지정되어야 하며, 해당 값은 상응하는 headers 맵에서
제공됩니다.
in은 MUST NOT 지정되어야 하며, 암묵적으로 header에 위치합니다.
style). 이는 allowEmptyValue가 MUST NOT 사용되어야 함을 의미하며, style을 사용하는 경우 허용값은
"simple"로 제한되어야 합니다.
이들 필드는 content 또는 schema와 함께 사용할 수 있습니다(MAY).
example와 examples 필드는 상호 배타적입니다; 검증 요구사항에 대한 안내는 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로 확장될 수 있습니다.
단순한 시나리오의 경우, schema와 style로 헤더의 구조와 문법을 설명할 수 있습니다.
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를 참조하세요.
더 복잡한 시나리오의 경우, content 필드는 헤더의 미디어 타입과 스키마를 정의하고 사용
예시를 제공할 수 있습니다.
| 필드 이름 | 유형 | 설명 |
|---|---|---|
| content | Map[string, Media Type Object | Reference Object] |
헤더에 대한 표현들을 포함하는 맵입니다. 키는 미디어 타입이고 값이 그것을 설명합니다. 이 맵은 항목을 하나만 포함해야 합니다(MUST). |
[RFC9264]는 application/linkset 및
application/linkset+json 미디어 타입을 정의합니다.
전자는 HTTP Link 헤더 값의 형식과 정확히 일치하되 가독성을 위해 추가 공백을 허용하며, 후자는 그러한 헤더의 등가 JSON 표현입니다.
이 미디어 타입들을 사용하려면, Media Type Object의 schema는 MUST 해당 링크들을
application/linkset+json 형식으로 구조화되는 방식으로 기술해야 합니다.
Media Type Object의 부모 키가 application/linkset+json이면 직렬화는 자명하지만, 이 형식은 HTTP
Link 헤더에 사용할 수 없습니다.
부모 키가 application/linkset이면 직렬화는 schema로 모델링된 링크들의 동등한 표현이어야 합니다(MUST).
Header Object(또는 in: "header"인 Parameter Object)의 content 필드에서
application/linkset 미디어 타입을 사용할 경우, 직렬화는 [RFC9264]의 HTTP 필드 문법과 호환되도록 만들어져야
합니다(MUST).
다음 예시는 동일한 데이터 모델을 컬렉션 페이지네이션 링크셋에 대해 메시지 콘텐츠로서의 JSON 형식 또는 HTTP Link 헤더로서 사용하는 방법을
보여줍니다:
components:
schemas:
SimpleLinkContext:
type: array
items:
type: object
required:
- href
properties:
href:
type: string
format: uri-reference
CollectionLinks:
type: object
required:
- linkset
properties:
linkset:
type: array
items:
type: object
required: [first, prev, next, last]
properties:
anchor:
type: string
format: uri
additionalProperties:
$ref: '#/components/schemas/SimpleLinkContext'
responses:
CollectionWithLinks:
content:
application/json:
schema:
type: array
headers:
Link:
required: true
content:
application/linkset:
schema:
$ref: '#/components/schemas/CollectionLinks'
StandaloneJsonLinkset:
content:
application/linkset+json:
schema:
$ref: '#/components/mediaTypes/CollectionLinks'
정수형 타입의 단순한 헤더 예시:
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"'
Operation Object에서 사용되는 단일 태그에 메타데이터를 추가합니다. Operation Object 인스턴스에 정의된 각 태그마다 Tag Object를 반드시 가질 필요는 없습니다.
| 필드 이름 | 유형 | 설명 |
|---|---|---|
| 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).
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
OpenAPI 설명 내에서 내부 및 외부의 다른 컴포넌트를 참조할 수 있게 해주는 단순한 객체입니다.
The $ref 문자열 값은 식별되는 값을 가리키는 URI [RFC3986]을 포함합니다.
상대 참조 해석 규칙을 참조하십시오.
| 필드 이름 | 유형 | 설명 |
|---|---|---|
| $ref | string |
REQUIRED. 참조 식별자입니다. 이 값은 URI 형식이어야 합니다 (MUST). |
| summary | string |
기본적으로 참조된 컴포넌트의 요약을 재정의하는 짧은 요약입니다( SHOULD ). 참조된 객체 유형이
summary 필드를 허용하지 않으면 이 필드는 효과가 없습니다.
|
| description | string |
기본적으로 참조된 컴포넌트의 설명을 재정의하는 설명입니다( SHOULD ). [CommonMark] 문법을 사용하여 리치 텍스트 표현을 할 수 있습니다 (MAY). 참조된 객체 유형이 description 필드를 허용하지 않으면 이 필드는
효과가 없습니다. |
이 객체는 추가 속성으로 확장할 수 없으며, 추가된 모든 속성은 무시되어야 합니다 (SHALL).
이 추가 속성에 대한 제한은 $ref 키워드를 포함하는 스키마 객체와의 차이점입니다.
$ref: '#/components/schemas/Pet'
$ref: Pet.yaml
$ref: definitions.yaml#/Pet
스키마 객체는 입력 및 출력 데이터 타입을 정의할 수 있게 합니다.
이러한 타입은 객체일 수도 있고, 원시 타입이나 배열일 수도 있습니다. 이 객체는 JSON Schema 명세 초안
2020-12의 상위 집합입니다. 빈 스키마(모든 인스턴스를 허용)는 불리언 값 true로 표현될 수 있으며, 어떤 인스턴트도 허용하지 않는 스키마는
불리언 값 false로 표현될 수 있습니다 (MAY).
키워드에 대한 자세한 내용은 JSON Schema Core 및 JSON Schema Validation을 참조하십시오.
명시되지 않은 한, 키워드 정의는 JSON Schema와 동일하며 추가 의미를 부여하지 않습니다; 여기에는 $schema, $id,
$ref, 및 $dynamicRef와 같은 키워드가 URL이 아니라 URI로 취급되는 점이 포함됩니다.
JSON Schema가 동작을 애플리케이션에 위임한다고 명시할 때(예: 주석의 경우), OAS 또한 OpenAPI 문서를 소비하는 애플리케이션에 의미 정의를 위임합니다.
OpenAPI 스키마 객체의 dialect는 JSON Schema 명세 초안 2020-12에 명시된 어휘들에 추가하여 OAS 기본 어휘를 요구하도록 정의됩니다.
이 버전의 사양에 대한 OpenAPI 스키마 객체 방언은 URI https://spec.openapis.org/oas/3.1/dialect/base로
식별됩니다 (이것이 “OAS 방언 스키마 ID”입니다).
다음 키워드들은 JSON Schema 명세에서 가져왔지만 OAS에 의해 정의가 확장되었습니다:
OAS 방언을 구성하는 JSON Schema 키워드 외에도, 스키마 객체는 다른 어휘의 키워드 또는 완전히 임의의 속성을 지원합니다.
JSON Schema 구현은 OpenAPI 명세의 기본 어휘에 의해 정의된 키워드를 알 수 없는 키워드로 처리할 수 있습니다 (unknown
keywords) — 이는 해당 어휘가 $vocabulary
값으로 false를 가지기 때문입니다.
OAS 기본 어휘는 다음 키워드들로 구성됩니다:
| 필드 이름 | 유형 | 설명 |
|---|---|---|
| discriminator | 판별자 객체 | 판별자는 페이로드가 만족해야 할 스키마 집합 중 어떤 것인지에 대한 힌트를 제공합니다. 자세한 내용은 구성 및 상속을 참조하십시오. |
| xml | XML 객체 | 이 스키마의 XML 표현을 설명하기 위한 추가 메타데이터를 추가합니다. |
| externalDocs | 외부 문서 객체 | 이 스키마에 대한 추가 외부 문서입니다. |
| example | Any | 이 스키마 인스턴스의 예시를 포함하기 위한 자유 형식 필드입니다. JSON이나 YAML로 자연스럽게 표현할 수 없는 예시는 문자열 값을 사용하여 필요한
이스케이프를 포함할 수 있습니다. Deprecated: example 필드는 JSON
Schema의 examples 키워드로 대체되었습니다. example 사용은 권장되지 않으며, 이후 버전에서
제거될 수 있습니다. |
이 객체는 명세 확장으로 확장될 수 있으며(MAY), 다만 이
객체 내의 추가 속성은 x- 접두사를 생략할 수 있습니다.
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 자체는 그 구분을 하지 않기 때문입니다. 정수는 수학적으로 정의됩니다. 이는 1과 1.0이
등가로 간주된다는 것을 의미합니다.
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: number와
type: integer는 데이터 모델에서 모두 숫자로 간주됩니다.
API 데이터에는 여러 형태가 있습니다:
format 및 contentType과 같은 JSON Schema 키워드가 전달하는 추가 정보와 클래스
계층 구조 등 본 사양 범위를 벗어나는 정보를 포함할 수 있습니다. 다만 이러한 정보는 판별자 객체나 데이터 모델링 기법와 같은 사양 요소를 기반으로 할 수 있습니다.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 명세에 따라 제공되는 것만을 요구합니다.
비-JSON 직렬화는 대응되는 데이터 형태와 상당히 다를 수 있으며, 파싱을 위해 여러 단계를 요구할 수 있습니다.
예를 들어 이전의 "when" 예를 application/x-www-form-urlencoded로 직렬화하면 ASCII 문자열
when=1985-04-12T23%3A20%3A50.52처럼 보입니다.
이 예는 여전히 모두 문자열 데이터이기 때문에 간단합니다. JSON과의 차이는 URI 퍼센트 인코딩과 구분자 문법(=가 JSON 문법 및 인용 대신
사용)뿐입니다.
그러나 많은 비-JSON 텍스트 기반 포맷은 복잡할 수 있으며, 텍스트를 올바르게 스키마 준비된 데이터 구조로 파싱하려면 적절한 스키마들을 검사해야 할 수 있습니다. 이러한 포맷으로 직렬화하려면 유효화된 데이터를 사용하거나 동일한 스키마 검사를 수행해야 합니다.
스키마를 검사할 때, 시작 스키마가 주어지면 구현체는 MUST 해당 스키마와 그로부터 $ref와
allOf 키워드만을 따라 도달할 수 있는 모든 스키마를 검사해야 합니다.
이러한 스키마들은 어떤 인스턴스에도 적용되는 것으로 보장됩니다.
스키마에서 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 값을 결정하기 위해 검사가 필요할 수 있습니다.
검증된 데이터에 접근할 수 없다면, 스키마 검사 과정은 파싱을 위한 경우와 동일합니다.
이 예에서 code와 count는 원시 타입이고 encoding 필드에 나타나지 않으므로 일반 텍스트로
직렬화됩니다.
그러나 extra 필드는 객체로 기본적으로 JSON으로 직렬화되지만, encoding 필드의 extra
항목은 이를 XML로 직렬화하라고 지시합니다.
OAS는 원시(raw) 또는 인코딩된(encoded) 바이너리 데이터를 설명할 수 있습니다.
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
헤더는 없습니다.
base64url를 contentEncoding으로 사용하면 쿼리 문자열 및
application/x-www-form-urlencoded 유형의 메시지 본문에 필요한 URL 인코딩이 이미 인코딩된 바이너리 데이터를 추가로
인코딩할 필요가 없습니다.
contentMediaType 키워드는 미디어 타입이 이미 설정되어 있으면 중복입니다:
encoding 객체의 contentType 필드에서스키마 객체가 OAS를 인식하지 못하는 JSON Schema 구현체에 의해 처리될 경우, 중복이더라도 contentMediaType을 포함하는 것이
유용할 수 있습니다. 그러나 contentMediaType이 관련 미디어 타입 객체나 인코딩 객체와 모순되면
contentMediaType은 무시되어야 합니다 (SHALL).
스트리밍 바이너리 페이로드에 대한 지침은 완전 콘텐츠 대 스트리밍 콘텐츠를 참조하십시오.
바이너리 데이터를 직접 지원하는 JSON Schema 구현체는 많지 않습니다. 이는 JSON Schema의 필수 부분이 아니기 때문입니다.
바이너리 인스턴스를 직접 지원하지 않는 JSON Schema 구현체를 가진 OAS 구현체는 바이너리 데이터 다루기에 따라 스키마를 검사하고 적용해야 합니다. 전체 인스턴스가 바이너리일 경우에는 관련 키워드가 적기 때문에 비교적 간단합니다.
그러나 multipart 미디어 타입은 바이너리와 텍스트 기반 데이터를 혼합할 수 있어 구현체는 스키마 평가에 대해 두 가지 옵션을 가질 수
있습니다:
properties, prefixItems 등)를 찾아 서브스키마를 분해하고
바이너리와 JSON 호환 데이터에 각각 따로 적용한다.다음 표는 OAS 3.0의 바이너리 데이터 설명에서 마이그레이션하는 방법을 보여줍니다. 예로 image/png를 계속 사용합니다:
| OAS < 3.1 | OAS >= 3.1 | 설명 |
|---|---|---|
type: stringformat: binary |
contentMediaType: image/png |
중복되는 경우 생략 가능하며, 종종 빈 스키마 객체가 됩니다 |
type: stringformat: byte |
type: stringcontentMediaType: image/pngcontentEncoding: base64 |
base64 문자열을 URL 안전하게 다시 인코딩하는 것을 피하기 위해 base64url를 사용할 수 있습니다 |
JSON Schema Draft 2020-12는 주석
수집을 지원하며, 인식되지 않은
키워드를 주석으로 처리하는 것을 포함합니다.
OAS 구현체는 이러한 주석을, 선언된 JSON Schema 어휘의 일부로 인식되지 않는 확장을 포함하여 추가 검증의 근거로 사용할 수 있습니다 (MAY).
JSON Schema Draft 2020-12는 확장에 대해 x- 접두사를 요구하지 않는다는 점에 유의하십시오.
format
키워드(기본 format-annotation 어휘 사용 시)와 contentMediaType,
contentEncoding, 및 contentSchema 키워드는 데이터에 대한 제약을 정의하지만, 직접적으로
검증되는 대신 주석으로 취급됩니다.
확장 검증은 이러한 제약을 강제할 수 있는 한 방법입니다 (MAY).
readOnly 및 writeOnly 키워드는 주석입니다. JSON Schema는 검증하는 데이터가 어떻게 사용되는지 알지
못합니다.
이러한 키워드의 검증은 주석, 읽기/쓰기 방향, (관련 있는 경우) 필드의 현재 값을 확인하여 수행할 수 있습니다 (MAY).
JSON
Schema Validation Draft 2020-12 섹션 9.4는 이러한 키워드의 기대 동작을 정의하며, 리소스(“소유 권한자”로 설명)는 MAY readOnly 필드를 무시하거나 오류로 처리할 수 있습니다.
필드가 요구되며 동시에 읽기 전용인 경우, 특히 값이 변경되지 않았다면 PUT에서 readOnly: true 제약을 무시하는 것이 유익할 수 있습니다.
이는 GET에서 필드를 올바르게 요구하면서 동일한 표현 및 스키마를 PUT에도 계속 사용할 수 있게 합니다.
읽기 전용 필드를 제거하는 것은 클라이언트에게 부담이 되며, 특히 JSON 데이터가 복잡하거나 중첩되어 있는 경우 그렇습니다.
readOnly의 동작은 특히 이 사양의 3.0 버전에서 지정된 것과 다르다는 점에 유의하십시오.
OpenAPI 명세는 JSON Schema의 allOf 키워드를 사용하여 모델 정의를 결합하고 확장할 수 있게 하여 모델 구성을 제공합니다.
allOf는 개별적으로 검증되지만 함께 단일 객체를 구성하는 객체 정의의 배열을 취합니다.
구성은 모델 확장성을 제공하지만 모델 간 계층을 의미하지는 않습니다.
JSON Schema는 또한 anyOf 및 oneOf 키워드를 제공하여, 각각 배열 내의 스키마 중 적어도 하나 또는 정확히
하나가 유효해야 함을 정의할 수 있게 합니다. allOf의 경우와 마찬가지로, 스키마들은 독립적으로 검증됩니다.
이러한 키워드는 단일 필드가 여러 타입의 값을 허용할 수 있는 다형성을 설명하는 데 사용될 수 있습니다.
OpenAPI 명세는 discriminator 필드를 추가하여 JSON Schema의
다형성 지원을 확장합니다. 이 필드의 값은 판별자 객체입니다.
사용될 때 판별자 객체는 anyOf 또는 oneOf의 어떤 스키마가 모델 구조를 검증할 것으로 예상되는지 힌트를 제공합니다.
판별 속성은 필수로 정의될 수도 있고 선택적으로 정의될 수도 있지만, 선택적 속성으로 정의된 경우 판별자 객체는 판별 속성이 없을 때 어느 스키마가 사용될지 지정하는
defaultMapping 필드를 반드시 포함해야 합니다 (MUST).
상속 인스턴스의 판별 속성 값을 정의하는 방법은 두 가지가 있습니다.
구현체는 JSON Schema의 동적 참조 기능을 사용하여 제네릭 또는 템플릿 데이터 구조를 정의하는 것을 SHOULD 지원해야 합니다:
$dynamicAnchor는 $dynamicRef가 해석될 수 있는 가능한 스키마 집합(기본 플레이스홀더 스키마
포함)을 식별합니다.$dynamicRef는 스키마 진입점에서 참조까지의 경로에서 첫 번째로 일치하는 $dynamicAnchor로
해석됩니다(데이터 사양에 설명된 대로).예제는 아래의 스키마 객체 예제 섹션에 포함되어 있으며, 추가 정보는 Learn OpenAPI 사이트의 “Dynamic References” 페이지를 참조하십시오.
스키마 객체의 enum 키워드는 개별 값에 설명이나 다른 정보를 연결하는 것을 허용하지 않습니다.
구현체는 각 서브스키마가 const 키워드와 title 또는 description 같은 주석을 포함하는
oneOf 또는 anyOf를 열거형으로 인식하는 것을 지원할 수 있습니다(MAY). 이 패턴의 정확한 동작은 JSON Schema에서 요구하는 것 이상의 부분은 구현체에 의해 정의됩니다.
xml 필드는 JSON 정의를 XML로 변환할 때 추가 정의를 허용합니다. XML 객체는 사용 가능한 옵션에 대한 추가 정보를 포함합니다.
툴링이 특정 리소스를 어떤 방언 또는 메타스키마(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).
type: string
format: email
type: object
required:
- name
properties:
name:
type: string
address:
$ref: '#/components/schemas/Address'
age:
type: integer
format: int32
minimum: 0
간단한 문자열-문자열 매핑의 경우:
type: object
additionalProperties:
type: string
문자열-모델 매핑의 경우:
type: object
additionalProperties:
$ref: '#/components/schemas/ComplexModel'
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
type: object
properties:
id:
type: integer
format: int64
name:
type: string
required:
- name
examples:
- name: Puma
id: 1
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
다음 예제는 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
다음 예제는 이전 섹션의 예제를 확장하여 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
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
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
요청 본문이나 응답 페이로드가 여러 다른 스키마 중 하나일 수 있는 경우, 가능한 스키마를 설명하기 위해 JSON Schema의 anyOf 또는
oneOf 키워드를 사용해야 합니다(참조: 구성 및 상속).
다형성 스키마는 MAY 판별자 객체(Discriminator Object)를 포함할 수 있으며, 이 객체는 anyOf
또는 oneOf 중 어느 스키마가 모델의 구조를 검증할 것으로 예상되는지에 대한 힌트로 사용할 수 있는 속성의 이름을 정의합니다.
이 힌트는 직렬화, 역직렬화 및 검증을 지원하는 데 사용될 수 있습니다.
판별자 객체는 명시적 또는 암시적으로 명명된 속성의 가능한 값들을 대체 스키마와 연관시킴으로써 이를 수행합니다.
참고: discriminator는 스키마의 검증 결과를 변경해서는 안 됩니다(MUST NOT).
| 필드 이름 | 유형 | 설명 |
|---|---|---|
| propertyName | string |
REQUIRED. 페이로드에서 판별 값이 들어가는 판별 속성의 이름입니다.
판별 속성은 MAY 필수로 정의되거나 선택적으로 정의될 수 있지만, 선택적으로 정의된 경우
Discriminator Object는 판별 속성이 없을 때 어떤 스키마가 모델 구조를 검증할 것으로 예상되는지 지정하는
defaultMapping 필드를 반드시 포함해야 합니다.
|
| mapping | Map[string, string] |
페이로드 값과 스키마 이름 또는 URI 참조 간의 매핑을 담는 객체입니다. |
| defaultMapping | string |
페이로드에 판별 속성이 없거나 명시적/암시적 매핑이 없는 값을 포함할 때 모델의 구조를 검증할 것으로 예상되는 스키마 이름 또는 스키마에 대한 URI 참조입니다. |
이 객체는 MAY 명세 확장(Specification Extensions)으로 확장될 수 있습니다.
판별자 객체는 합성 키워드 중 하나인 oneOf, anyOf, allOf을 사용할 때에만 합법적입니다.
oneOf 및 anyOf의 경우, 해당 키워드가 discriminator와 인접해 있다면 모든 가능한 스키마는
MUST 명시적으로 나열되어야 합니다.
중복을 피하기 위해, 판별자는 부모 스키마 정의에 추가될 수 있으며 부모 스키마를 allOf로 확장하는 모든 스키마는 대체 스키마로 사용될 수 있습니다.
allOf 형태의 discriminator는 검증 용도 이외의 사용 사례에만 유용합니다; 이 형태의
discriminator로 부모 스키마를 검증하는 것은 자식 스키마를 검색하거나 검증에 사용하는 동작을 수행하지 않습니다.
이는 discriminator가 검증 결과를 변경할 수 없고, 부모 스키마를 자식 스키마와 연결하는 표준 JSON Schema 키워드가 없기 때문입니다.
위에서 설명하지 않은 oneOf, anyOf, allOf 및 discriminator의
어떤 구성도 정의되지 않습니다.
propertyName에 명시된 이름의 속성 값은 Components Object 아래의 관련
스키마 이름으로 사용됩니다. 단, 해당 값에 대해 mapping이 존재하는 경우는 예외입니다.
mapping 엔트리는 특정 속성 값을 다른 스키마 컴포넌트 이름이나 URI로 식별된 스키마에 매핑합니다.
암시적 또는 명시적 스키마 컴포넌트 이름을 사용할 때는 인라인 oneOf 또는 anyOf 서브스키마는 고려되지 않습니다.
스키마 이름과 유효한 상대 URI 참조 둘 다가 될 수 있는 mapping 값 또는 defaultMapping 값의 동작은 구현에
따라 결정되지만, 스키마 이름으로 취급하는 것이 권장됩니다.
모호한 값(예: "foo")을 모든 구현체에서 상대 URI 참조로 처리하려면 작성자는 반드시 "." 경로 세그먼트(예:
"./foo")로 접두사를 붙여야 합니다.
매핑 키는 MUST 문자열 값이어야 하지만, 도구는 비교를 위해 응답 값을 문자열로 변환할 수 MAY 있습니다. 다만 이러한 변환의 정확한 방식은 구현에 따라 다릅니다.
판별 속성이 선택적으로 정의된 경우, Discriminator Object는 페이로드에 판별 속성이 없거나
명시적/암시적 매핑이 없는 값을 포함할 때 모델의 구조를 검증할 것으로 예상되는 스키마를 지정하는 defaultMapping 필드를 반드시 포함해야 합니다.
이는 판별 속성이 누락되더라도 스키마가 여전히 올바르게 검증되도록 합니다.
선택적 판별 속성의 주요 사용 사례는 판별자를 추가해도 판별 속성을 제공하지 않는 기존 클라이언트를 깨뜨리지 않도록 허용하는 것입니다.
판별 속성이 선택적일 때, 판별 속성 값을 정의하는 각 서브스키마는 해당 속성을 필수로 정의하는 것이 중요합니다. 이는 더 이상 부모 스키마에서 강제되지 않기 때문입니다.
defaultMapping 스키마는 판별 속성이 존재하지만 명시적/암시적 매핑이 없는 값을 포함할 때에도 모델의 구조를 검증할 것으로 예상됩니다. 이는
일반적으로 defaultMapping 스키마에서 판별 속성의 매핑된 값들을 제외하는 방식으로 표현됩니다, 예:
OtherPet:
type: object
properties:
petType:
not:
enum: ['cat', 'dog']
이렇게 하면 defaultMapping 스키마가 매핑된 판별 값이 포함된 페이로드를 검증하는 것을 방지하여, 다형성이 oneOf로
설명될 때 검증 실패를 일으키지 않게 합니다.
이 예제들에서는 모든 스키마가 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 Object는 oneOf의 검증 결과를 변경할 수
없으며, 단지 역직렬화를 더 효율적으로 하고 오류 메시지를 개선하는 데 도움을 줄 뿐입니다. 어떤 필드가 인스턴스와 일치할 것으로 예상되는 스키마를 알려주는지 명시할 수 있습니다:
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에 대응합니다.
XML 모델 정의를 더 세밀하게 조정할 수 있게 하는 메타데이터 객체입니다. Schema Object를 XML과 함께 사용할 때 XML Object가 없으면 동작은 XML Object의 기본 필드 값에 의해 결정됩니다.
| 필드 이름 | 유형 | 설명 |
|---|---|---|
| nodeType | string |
element, attribute, text, cdata, 또는
none 중 하나입니다(자세한 내용은 XML 노드 유형 참조). 기본값은 포함된
Schema Object에 $ref, $dynamicRef
또는 type: "array"가 있으면 none이고, 그렇지 않으면 element입니다.
|
| name | string |
스키마에 대응하는 요소/속성의 이름을 설정하여 XML 노드 이름에 따라 추론된 이름을 대체합니다. 이
필드는 nodeType이 text, 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 명세 확장으로 확장될 수 있습니다.
각 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 구성에 유용합니다.
역사적 호환성을 위해, type: "array"인 스키마는 기본적으로 nodeType: "none"으로 설정되어 각 배열 항목의
노드를 부모 노드 바로 아래에 배치합니다.
이는 또한 XML 노드 이름에 정의된 추론된 이름 동작과 일치합니다.
목록을 감싸는 요소를 생성하려면 type: "array" 스키마에 명시적으로 nodeType: "element"를 설정하세요.
이 경우 래핑 요소 또는 항목 요소 중 하나에 명시적 이름을 설정하여 동일한 추론된 이름이 사용되는 것을 피하는 것이 좋습니다. 기대되는 동작에 대한 예제를 참조하세요.
만약 element 노드가 원시 타입(primitive type)을 가지면, 해당 element 노드의 내용에 대한 스키마에
의해 암시적 text 노드가 생성됩니다. 이 노드의 이름은 속성 이름(또는 name 필드)으로 지정됩니다.
요소가 속성과 내용을 모두 가질 경우에는 명시적 text 노드가 필요합니다.
두 개의 text 노드를 인접하게 배치하는 것은 파싱에 모호성을 야기하므로 결과 동작은 구현에 따라 정의됩니다.
element 및 attribute 노드 유형은 이름이 필요하며, 이 이름은 name 필드로 재정의되지 않는 한
다음 규칙에 따라 스키마에서 추론되어야 합니다(MUST).
schemas 필드 바로 아래 있는 스키마의 경우,
컴포넌트 이름이 추론된 이름입니다.name 필드를 가진 XML Object가 반드시 존재해야 합니다(MUST).
배열을 사용할 때 단수형 대 복수형은 추론되지 않으므로 명시적으로 설정해야 합니다.
namespace 필드는 XML 네임스페이스의 문법과 일치하도록 의도되었지만 몇 가지
유의사항이 있습니다:
XML은 기본적으로 null에 해당하는 개념이 없으며, 이 명세의 3.1.1 이전 버전과의 호환성을 유지하기 위해 null 값의 직렬화
동작은 구현에 따라 정의됩니다.
그러나 구현체는 다음과 같이 null 값을 처리하는 것이 SHOULD 합니다:
xsi:nil="true" 속성을 가진 빈 요소를 생성합니다.속성의 경우, 이는 null 값이나 누락된 속성이 모두 속성의 생략으로 직렬화되는 것을 의미합니다.
Schema Object는 인메모리 표현을 검증하므로 null과 필수 속성의 조합을 처리할 수 있습니다.
그러나 속성으로서 null을 표현할 분명한 방법이 없으므로 속성 속성은 null을 사용하기보다는 선택적으로 만드는 것이 권장됩니다.
정확한 왕복 동작을 보장하려면, 속성이 생략된 요소를 파싱할 때 구현체는 해당 스키마가 그 값을 허용하면(예: type: ["number", "null"])
해당 속성에 null을 설정하고, 그렇지 않으면 속성을 생략해야 합니다(예: type: "number").
Schema Objects 다음에는 해당 스키마에 대해 생성된 예제 XML 표현이 따라옵니다.
attribute 또는 wrapped를 사용하는 예제는 OpenAPI 사양 버전 3.1을 참조하세요.
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>
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>
루트 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>
요소 이름 변경 예:
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 필드는 기본 nodeType이
none이기 때문에 효과가 없습니다:
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>
명시적으로 nodeType를 element로 설정하여 래핑 요소를 생성하더라도 이름이 명시적으로 정의되지 않으면 래핑 요소와
항목 요소에 동일한 이름이 사용됩니다:
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>
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>
이 예제에서는 $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>
요소의 정확한 순서를 제어하려면 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>
스키마는 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>
작업에서 사용할 수 있는 보안 스키마를 정의합니다.
지원되는 스킴은 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 플로우가 권장됩니다.
| 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로 확장될 수 있습니다.
type: http
scheme: basic
type: apiKey
name: api-key
in: header
type: http
scheme: bearer
bearerFormat: JWT
type: mutualTLS
description: Cert must be signed by example.com CA
type: oauth2
flows:
implicit:
authorizationUrl: https://example.com/api/oauth/dialog
scopes:
write:pets: modify pets in your account
read:pets: read your pets
지원되는 OAuth 플로우를 구성할 수 있게 합니다.
| 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로 확장될 수 있습니다.
지원되는 OAuth 플로우에 대한 구성 세부사항
| 필드 이름 | 유형 | 적용 대상 | 설명 |
|---|---|---|---|
| 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로 확장될 수 있습니다.
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
이 작업을 수행하기 위해 필요한 보안 스키마들을 나열합니다.
각 속성에 사용된 이름은 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) 접근을 허용함을 나타냅니다.
| 필드 패턴 | 유형 | 설명 |
|---|---|---|
| {name} | [string] |
각 이름 또는 URI는 위에서 설명한 보안 스키마에 대응해야 합니다(MUST). 보안 스키마가
"oauth2" 또는 "openIdConnect" 타입인 경우 값은 실행에 필요한 스코프 이름들의 목록이며,
특정 스코프가 필요하지 않다면 목록은 비어 있을 수 있습니다. 다른 보안 스키마 타입의 경우 배열에는 실행에 필요한 역할(role) 이름들의 목록이 포함될 수
있으나 이는 별도로 정의되거나 인밴드(in-band)로 교환되지 않습니다.
|
멀티 문서 OpenAPI 설명에서 Security Requirement Objects를 사용하는 예제는 Implicit Connection Resolution Examples와 부록 G: 파싱 및 해석 지침을 참조하세요.
api_key: []
이 예제는 Security Scheme에 대한 컴포넌트 이름을 사용합니다.
petstore_auth:
- write:pets
- read:pets
이 예제는 Security Scheme에 대해 상대 URI 참조를 사용합니다.
OpenAPI Object 또는 Operation Object에 정의될 수 있는 선택적 OAuth2 보안 예:
security:
- {}
- petstore_auth:
- write:pets
- read:pets
OpenAPI 명세는 대부분의 사용 사례를 수용하려고 시도하지만, 특정 지점에서 명세를 확장하기 위해 추가 데이터를 첨부할 수 있습니다.
확장 속성은 항상 x-로 접두사되는 패턴화된 필드로 구현됩니다.
| 필드 패턴 | 유형 | 설명 |
|---|---|---|
| ^x- | Any | OpenAPI 스키마에 대한 확장을 허용합니다. 필드 이름은 x-로 시작해야 합니다(MUST), 예:
x-internal-id. x-oai- 및 x-oas-로 시작하는 필드 이름은 OpenAPI Initiative에서 정의한 용도로 예약되어 있습니다. 값은 유효한 JSON
값(null, 원시값, 배열, 또는 객체)일 수 있습니다.
|
OpenAPI Initiative는 확장 레지스트리를 여러 개 유지하며, 여기에는 개별 확장 키워드 및 확장 키워드 네임스페이스에 대한 레지스트리가 포함됩니다.
확장은 명세에 제안된 추가 기능의 실현 가능성을 입증하는 가장 좋은 방법 중 하나입니다. 따라서 구현체가 커뮤니티 실험을 지원하도록 확장 가능하게 설계되는 것이 RECOMMENDED합니다.
어떤 단일 확장에 대한 지원은 OPTIONAL이며, 하나의 확장을 지원한다고 해서 다른 확장들을 지원한다는 의미는 아닙니다.
OpenAPI 설명서는 JSON, YAML 및 JSON Schema를 조합하여 사용하므로 이들과 관련된 보안 고려사항을 공유합니다:
또한 OpenAPI 설명서는 클라이언트 코드 생성, 문서 생성, 서버 측 라우팅, API 테스트 등 다양한 목적으로 광범위한 도구에 의해 처리됩니다. OpenAPI 설명서 작성자는 OpenAPI 설명서가 사용될 수 있는 시나리오들의 위험을 고려해야 합니다.
OpenAPI 설명서는 정의된 리소스를 보호하는 데 사용되는 보안 스키마를 설명합니다. 사용 가능한 보안 스키마는 서로 다른 수준의 보호를 제공합니다. 데이터의 민감도와 보안 침해의 잠재적 영향을 고려하여 API 리소스에 적합한 보안 스키마를 선택해야 합니다. 일부 보안 스키마(예: basic auth 및 OAuth Implicit flow)는 기존 API와의 호환성을 위해 지원되지만, OpenAPI에 포함된다고 해서 특히 민감한 데이터나 작업에 대해 그 사용을 권장하는 것은 아닙니다.
Security Requirement Object를 Security Scheme Object에 연결하는 규칙은 악용될 여지가 있는 방식으로 모호할 수 있습니다. 구체적으로:
OpenAPI 명세의 일부 객체는 본질적으로 API 문서의 핵심임에도 불구하고 선언되었지만 비어 있거나 완전히 제거될 수 있습니다.
이는 문서에 대한 추가적인 접근 제어 계층을 허용하기 위한 이유입니다. 명세 자체의 일부는 아니지만, 특정 라이브러리는 인증/권한 부여의 일부 형태에 따라 문서의 일부 접근을 허용하도록 선택할 수 있습니다(MAY).
예시는 다음과 같습니다:
OpenAPI 설명서는 도구가 자동으로 역참조할 수 있는 외부 리소스에 대한 참조를 포함할 수 있습니다. 외부 리소스는 신뢰할 수 없는 서로 다른 도메인에 호스팅될 수 있습니다.
OpenAPI 설명서의 참조는 순환을 일으킬 수 있습니다. 도구는 리소스 고갈을 방지하기 위해 순환을 감지하고 처리해야 합니다.
특정 필드는 HTML(스크립트 포함)을 포함할 수 있는 마크다운 사용을 허용합니다. 마크다운을 적절히 정화하는 것은 도구의 책임입니다.
| 버전 | 날짜 | 비고 |
|---|---|---|
| 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 명세 첫 출시 |
타입이 지정된 데이터를 일반 텍스트로 직렬화하는 것은 text/plain 메시지 본문이나 multipart 파트, 또는 URL 쿼리 문자열이나 메시지
본문에서의 application/x-www-form-urlencoded 형식에서 발생할 수 있으며, 이는 상당한 구현 또는 애플리케이션 정의 동작을 포함합니다.
Schema Objects는 JSON 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과 같이 덜 명확한 포맷도
있습니다. 다만 인식되지 않는 포맷은 무시되므로 관련 도구들이 특정 포맷을 지원하는지 주의해야 합니다.
미리 포맷된, 스키마 검증된 문자열을 입력으로 요구하면 모든 프로그래밍 언어와 환경이 동일한 데이터 타입을 지원하지 않기 때문에 왕복 상호 운용성이 향상됩니다.
직렬화는 세 가지 시나리오에서 [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-Disposition의 name 매개변수에 배치되고 값은 해당 파트 본문에 배치됩니다; 이때 ?,
=, & 문자는 사용되지 않으며, URI 퍼센트 인코딩도 적용되지 않습니다. 부록 E에서 파일 이름에 대한 퍼센트 인코딩 허용 등 추가 지침을 참고하세요.
모든 RFC6570 구현체가 OpenAPI 사용에 필요한 모든 네 수준의 연산자를 지원하는 것은 아니므로, 지원 수준이 낮은 구현체를 사용하면 제한을 우회하기 위해 URI 템플릿을 수동으로 구성해야 할 수 있습니다.
일부 필드 값은 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로 다루는 단일 수준을 넘어선 복합 값에 대한 동작을 지정하지 않습니다. 명확한 동작이 지정되어 있지 않은 객체나 배열을 사용하는 결과는
구현에 따라 달라집니다.
배열이나 객체 값을 style: "simple"로 조인할 때 사용되는 ,와 같은 RFC6570 확장에서의 구분자들은
allowReserved가 false인 한 자동으로 퍼센트 인코딩됩니다. RFC6570은 URI 템플릿을 기반으로 변수를 파싱하는 방법을
지정하지 않으므로, 사용자는 먼저 구분자로 값을 분할한 다음 구분자를 포함할 수 있는 값을 퍼센트 디코딩해야 합니다.
allowReserved가 true인 경우에는 구분자로 값을 결합하기 전에 퍼센트 인코딩을 하고(또는 분할 후 퍼센트 디코딩을) 적절한 시점에
수동으로 수행해야 합니다.
부록 E에서 spaceDelimited,
pipeDelimited, 및 deepObject와 같이 RFC6570 등가성이 없는 style 값들을 구분자로
사용할 때의 퍼센트 인코딩 처리에 대한 추가 지침을 확인하세요.
직접적인 [RFC6570] 등가성이 없는 구성은 RFC6570에 따라 처리하는 것이 SHOULD합니다. 구현체는 개별 이름과 값을 위한 변수를 포함하는 올바르게 구분된 URI 템플릿을 RFC6570 정규 또는 예약 확장으로 생성할 수 있습니다(MAY).
여기에는 다음이 포함됩니다:
pipeDelimited, spaceDelimited, 및 deepObject
form 스타일과 allowReserved: true의 조합(한 번에 하나의 접두 연산자만 사용할 수 있으므로 허용되지 않음)
Parameter Object의 name 필드는 RFC6570의 변수 이름 문법보다 훨씬 관대합니다. 허용된 RFC6570 변수 문자
집합을 벗어나는 문자를 포함하는 파라미터 이름은 URI 템플릿에서 사용되기 전에 퍼센트 인코딩되어야 합니다(MUST).
예를 들어 formulas는 explode되고 words는 explode되지 않는 폼 쿼리 문자열에 다음 데이터를 사용한다고 가정해
보겠습니다:
formulas:
a: x+y
b: x/y
c: x^y
words:
- math
- is
- fun
이 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
하지만 어떤 이유로 b 수식의 /를 쿼리 문자열에 그대로 표시하고 싶고, words를 공백으로 구분된 문구처럼
보이게 하고 싶다고 합시다. 이를 위해 formulas에 allowReserved: 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는 그대로 유지되었지만, 허용되지 않는 ^ 문자(값 내부)와 템플릿에 있는 공백
문자(확장 변수 외부)는 퍼센트 인코딩되었습니다.
수동으로 템플릿을 구성할 때 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
이 예에서는 하트 이모지가 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
HTTP 헤더는 허용되는 문자와 일부 또는 모든 허용되지 않는 문자를 어떻게 이스케이프하여 포함할 수 있는지에 대해 일관되지 않은 규칙을 가집니다. [RFC9110]의
quoted-string ABNF 규칙은 가장 일반적인 이스케이프 솔루션이지만 자동으로 적용하기에는 충분히 보편적이지 않습니다. 예를 들어 강력한
ETag는 "foo"처럼 보이고(내용과 관계없이 따옴표 포함), 약한 ETag는 W/"foo"처럼
보입니다(값의 일부만 인용됨). 이 헤더의 따옴표 안 내용도 quoted-string의 내용처럼 이스케이프되지 않습니다.
이러한 이유로 Parameter 또는 Header Object를 통해 헤더로 전달되는 모든 데이터는 OAS 구현에 전달하기 전에 인용되고 이스케이프되어야 하며, 파싱된 헤더 값은 따옴표와 이스케이프를 포함하는 것으로 예상됩니다.
참고: 이 절에서는 읽기 편의를 위해 application/x-www-form-urlencoded와
multipart/form-data 미디어 타입을 각각 form-urlencoded 및
form-data로 약어로 표기합니다.
퍼센트 인코딩은 URI와 그 문법을 따르는 미디어 타입에서 사용됩니다. 퍼센트 인코딩의 기본 규칙은 다음과 같습니다:
+ 문자를 디코딩하는 방식은 application/x-www-form-urlencoded 규칙을
따르는지 아니면 보다 일반적인 URI 규칙을 따르는지에 따라 달라집니다. 이것은 디코딩 알고리즘의 선택이
결과를 바꿀 수 있는 유일한 경우입니다.
이 부록의 나머지 부분은 위 규칙을 바탕으로 보다 자세한 지침을 제공합니다.
이 절에서는 세 가지 문자 클래스를 다루며, 명세에 따라 이름이 다를 수 있지만 이 절의 목적상 다음과 같이 정의합니다:
form-urlencoded는 =, &,
+에 대해 특별 동작을 정의합니다).
특별한 언급이 없는 한, 이 절은 RFC3986의 reserved와 unreserved 정의를 사용하며, unsafe 집합은 이 두 집합에 포함되지 않는 모든 문자로 정의합니다.
각 URI 구성 요소(예: 쿼리 문자열)는 일부 reserved 문자를 안전하지 않은 것으로 간주합니다.
이는 해당 문자들이 구성 요소 간의 구분자 역할을 하기 때문(예: #)이거나, 과거에 전역적으로
안전하지 않다고 여겨졌지만 제한된 목적을 위해 나중에 reserved로 지정된 경우(예: [ 및
]) 때문입니다.
구성 요소 내에서 특별한 의미가 정의되지 않은 reserved 문자는 퍼센트 인코딩하지 않고 남겨둘 수 있습니다. 그러나 다른 명세가 특별한 의미를 정의할 수 있으며, 그런 경우에는 해당 특별 의미와 관계없는 문자는 퍼센트 인코딩이 요구됩니다.
form-urlencoded 미디어 타입은 =와 &를 구분자로,
+를 공백을 대신하는 표기로 특별한 의미를 정의합니다(이는 %20 대신 사용).
이는 이 세 문자가 RFC3986에 의해 쿼리 문자열에서 허용되더라도, form-urlencoded 쿼리
문자열에서는 form-urlencoded 용도로 사용될 때를 제외하고 반드시 퍼센트 인코딩되어야
함을 의미합니다. +를 폼 값에서 처리하는 예는 부록
C를 참조하세요.
[RFC7578]의 Section 2는 파일 이름과 같은 파트별 텍스트 헤더
데이터를 ASCII 문자 집합 내에 유지하기 위한 메커니즘으로 RFC3986 기반의 퍼센트 인코딩을 제안합니다.
이 제안은 2015년 이전의 오래된 form-data 명세에는 포함되지 않았으므로 상호운용성을 위해 주의가 필요합니다.
퍼센트 인코딩을 이 방식으로 사용하려는 사용자는 데이터를 퍼센트 인코딩된 형태로 제공해야 합니다(MUST).
이 미디어 타입에서는 어떤 Encoding Object 필드를 사용하든 퍼센트 인코딩이 자동으로 적용되지 않습니다.
form-data 미디어 타입은 파트에 임의의 텍스트 또는 바이너리 데이터를 허용하므로,
일반적으로 퍼센트 인코딩이나 유사한 이스케이프가 필요하지 않습니다.
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 Object와 Header Object에서
content 필드가 있을 때 사용되고, Encoding Object에서는
style, explode, allowReserved 필드들이 없을 때
contentType 필드에 따라 사용됩니다.
URI에서 사용하려면 각 부분은 미디어 타입(예: text/plain 또는 application/json)에 따라 인코딩된 다음,
해당 미디어 타입이 이미 URI 퍼센트 인코딩을 포함하고 있지 않다면 form-urlencoded 문자열(폼 스타일 쿼리 문자열에서)이나 다른 URL 구성 요소용
일반 URI 사용을 위해 퍼센트 인코딩되어야 합니다.
이 명세의 이전 버전들은 [RFC1866]와 그에 따른
[RFC1738]의 퍼센트 인코딩 규칙을 사용하도록 요구했습니다.
WHATWG-URL의 form-urlencoded 규칙은 현재 브라우저들의 합의를 나타내며 RFC1866에서 RFC1738를
애매하게 재표현한 것에서 비롯된 모호성을 피합니다.
RFC1866/RFC1738에 준수해야 하는 사용자는 툴링과 라이브러리 동작을 주의 깊게 확인하세요.
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를 참조하세요.
퍼센트 디코딩 알고리즘은 어떤 문자가 퍼센트 디코딩되었는지에 대해서 신경 쓰지 않으므로, 어떤 명세에 따라 퍼센트 인코딩된 URI도 올바르게 디코딩됩니다.
마찬가지로 모든 form-urlencoded 디코딩 알고리즘은 퍼센트 디코딩 알고리즘에 +-for-space 처리를 추가한 것일 뿐이며,
사용된 인코딩 명세와 상관없이 동작합니다.
그러나 +가 공백을 나타내는 경우에는 form-urlencoded 디코딩을 사용하고,
+가 리터럴 + 자체를 나타내는 경우에는 일반 퍼센트 디코딩을 사용하도록 주의해야 합니다.
[, ], | 및 공백 문자는 각각 deepObject,
pipeDelimited, spaceDelimited 스타일의 구분자로 사용되며,
이들 문자 모두는 [RFC3986]을 준수하기 위해 반드시
퍼센트 인코딩되어야 합니다(MUST).
따라서 이러한 스타일을 사용할 때는 파라미터 이름과 값에서 구분자 용도로 사용되는 문자들과 구분하기 위해
해당 문자들을 사전에 다른 방식으로 인코딩해 두어야 합니다.
공백 문자는 모든 관련 표준의 구현체에서 항상 불법이며 어떤 방식으로든 인코딩됩니다.
파라미터 이름과 값에서 공백을 spaceDelimited의 구분자(인코딩된 %20)와 구분하기 위해
form-urlencoded 관례의 +를 사용할 수 있지만, 명세들은 단일 패스의 디코딩을
정의하므로 디코딩 결과에서 서로 다른 용도를 구분할 수 없습니다(비표준 파싱 알고리즘을 사용해
먼저 한 구분자로 분리한 뒤 다른 구분자에 대해 디코딩한다면 가능하겠지만).
그러한 비표준 파싱 방식은 모든 툴 간의 상호운용성을 보장하지 못합니다.
일부 환경에서는 쿼리 문자열에서 [, ], 그리고 경우에 따라 |를
인코딩하지 않고 사용해도 문제가 없는 것으로 보입니다.
WHATWG의 일반 쿼리 문자열 규칙은 비-form-urlencoded 쿼리 문자열에서 이들을 퍼센트 인코딩할 것을 요구하지 않지만,
또한 URL의 유효한 유니코드 코드 포인트 집합에서 제외합니다.
이름과 값 내에서는 정규 퍼센트 인코딩을 사용하면서 구분자만 인코딩하지 않는 코드는 모든 구현체에서의
상호운용성을 보장하지 않습니다.
최대의 상호운용성을 위해서는, 이러한 스타일에 대해 구분자를 퍼센트 인코딩하는 동시에 추가적인 이스케이프 규약을 정의하고 문서화하거나, 또는 이러한 스타일 자체를 사용하지 않는 것이 권장됩니다. 추가 인코딩/이스케이프의 정확한 방법은 API 설계자가 결정하며, 이 명세에 설명된 직렬화 및 인코딩 단계 이전에 수행되고, 이 명세의 인코딩 및 직렬화 단계가 역으로 처리된 후에 되돌려져야 합니다. 이렇게 하면 해당 처리는 이 명세가 규정하는 과정 밖에 있게 됩니다.
이 절에서는 기준 URI의 네 가지 가능한 출처를 각각 보여주고, 이어서 상대 $self와
$id가 있는 예제를 제시합니다.
리소스 콘텐츠 내의 기준 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가 아니기
때문입니다.
콘텐츠 내에서 기준 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 Object의 url 필드는
Content-Location에서 가져온 기준 URI에 대해 해석되어 https://example.com/api/docs.html이
되며 이는 세 번째 파트의 Content-Location과 일치합니다.
이전의 출처들 중 어느 것도 기준 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가 됩니다.
$self나 캡슐화 엔티티, 검색 URI가 없는 상태로 메모리 내에서 OpenAPI 문서를 구성할 때,
애플리케이션은 내부(프래그먼트 전용) 참조를 해결하기 위해 기본 기준 URI를 가정할 수 있습니다([RFC3986]의 Section 5.1.4).
이러한 내부 해석은 기준 URI를 선택하지 않고도 실무에서 수행할 수 있지만,
임의로 생성된 UUID를 포함한 URN(예: urn:uuid:f26cdaad-3193-4398-a838-4ecb7326c4c5)과 같은
기준 URI를 선택하면 특수 케이스로 처리할 필요가 없어집니다.
이 부록의 첫 번째 예제를 다시 고려하되, 이번에는 $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이 되어
첫 문서의 $self는 https://staging.example.com/openapi가 되고,
두 번째 문서의 $self는 https://staging.example.com/api/shared/foo가 되며,
$id 값은 https://staging.example.com/api/schemas/foo 및
https://staging.example.com/api/schemas/bar가 됩니다.
이러한 유형의 상대 $self와 $id는 동일한 문서 세트를 다른 호스트에 배포했을 때도 작동하게 합니다.
구현체는 전체 문서 파싱을 다음 방법들 중 어느 것으로든 지원할 수 있습니다(MAY):
openapi 필드를 통해 OpenAPI 문서 감지루트에 OpenAPI Object 또는 Schema Object 이외의 객체가 있는 문서를 지원하기 위해 추가 메커니즘을 사용할 수 있지만, 그 결과 동작은 구현에 의해 정의된다는 점에 유의하세요:
참조된 OpenAPI 콘텐츠의 조각을 나머지 포함 문서의 내용과 무관하게 파싱하는 구현체는 참조 대상의 의미와 동작을 변경하는 키워드를 놓치게 됩니다. 특히 기준 URI를 변경하는 키워드를 고려하지 않으면 참조가 의도와 다른 URI로 해석되어 예측 불가능한 결과를 초래할 수 있어 보안 위험이 발생합니다. 과거 버전의 요구사항 때문에 일부 구현체는 이러한 파싱을 지원하지만, 버전 3.1 이후로는 조각을 단독으로 파싱한 결과가 정의되지 않음이며 이 명세의 요구사항과 모순될 가능성이 큽니다.
참조를 분리된 조각으로 파싱해도 올바르게 동작하도록 OpenAPI Description을 구조화할 수는 있지만, 이를 의존하는 것은 권장되지 않습니다. 이 명세는 그런 동작이 안전한 조건을 명시적으로 나열하지 않으며, 향후 버전에서도 안전을 보장하지 않습니다.
OAD 내의 JSON 또는 YAML 객체는 문맥에 따라 특정 객체들(예: Operation Objects, Response Objects, Reference Objects 등)으로 해석됩니다. 참조가 배열된 방식에 따라 동일한 JSON/YAML 객체가 여러 다른 문맥에서 해석될 수 있습니다:
동일한 JSON/YAML 객체가 여러 번 파싱되고 각 문맥이 서로 다른 객체 타입으로 파싱해야 한다면, 결과 동작은 구현에 따라 정의되며, 감지될 경우 오류로 처리될 수도 있습니다. 예를 들어 빈 객체는 Path Item Object와 components/schemas 아래의 빈 Schema Object 둘 다에 대해 유효하므로 호환성 측면에서 최대한 피하는 것이 권장됩니다.
다음 객체와 필드들은 암시적 연결의 사용을 포함합니다:
| 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
Object의
url 필드에 덧붙이는 것을 포함합니다. 이 연결은 진입 문서의 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과 같은 외부 솔루션을 사용하는 것이 권장됩니다.
이 절에서는 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의 해석은 구현에 따라 정의될 수 있지만, 일반적으로 도구들은 진입 문서에서 컴포넌트 이름을
해결하도록 권장합니다. 모든 구현 정의 동작과 마찬가지로, 어떤 동작이 지원되는지 확인하려면 도구 문서를 확인해야 합니다.