사물 웹(WoT) 사물 설명 2.0

W3C 최초 공개 작업 초안

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2025/WD-wot-thing-description-2.0-20251104/
최신 게시 버전:
https://www.w3.org/TR/wot-thing-description-2.0/
최신 편집자 초안:
https://w3c.github.io/wot-thing-description/
이력:
https://www.w3.org/standards/history/wot-thing-description-2.0/
커밋 이력
최신 권고안:
https://www.w3.org/TR/2023/REC-wot-thing-description11-20231205/
편집자:
Ege Korkan (Siemens AG)
이전 편집자:
Sebastian Kaebisch (Siemens AG)
Michael McCool (Intel Corp.)
Takuki Kamiya (Fujitsu Research of America)
Victor Charpenay (Siemens AG 재직 당시)
Matthias Kovatsch (Huawei 재직 당시)
피드백:
GitHub w3c/wot-thing-description (풀 리퀘스트, 새 이슈, 열린 이슈)
public-wot-wg@w3.org에 제목 줄 [wot-thing-description-2.0] … 메시지 주제 … 사용 (아카이브)
기여자
GitHub 저장소에서 확인
저장소
GitHub에 있습니다
버그 신고

초록

이 문서는 Web of Things(WoT) Thing Description(TD), 버전 2.0을 위한 형식적 정보 모델과 공통 표현을 설명한다. Thing Description은 사물의 메타데이터와 인터페이스를 설명하며, 여기서 사물은 Web of Things에 상호작용을 제공하고 참여하는 물리적 또는 가상 엔터티의 추상화이다. Thing Description은 다양한 장치를 통합하고 다양한 애플리케이션이 상호 운용될 수 있게 하는 작은 어휘를 기반으로 한 상호작용 집합을 제공한다. Thing Description은 기본적으로 JSON 형식으로 인코딩되며, 이 형식은 JSON-LD 처리도 허용한다. 후자는 기계가 이해할 수 있는 방식으로 사물에 대한 지식을 표현하기 위한 강력한 기반을 제공한다. Thing Description 인스턴스는 사물 자체에서 호스팅될 수도 있고, 사물에 리소스 제한(예: 제한된 메모리 공간)이 있거나 Web of Things 호환 레거시 장치에 Thing Description을 개조하여 적용하는 경우 외부에서 호스팅될 수도 있다. 또한 이 문서는 Thing Model을 도입하며, 이는 작성자가 Internet of Things(IoT) 엔터티의 모델 또는 클래스만을 설명할 수 있게 한다. Thing Model은 Thing Description 인스턴스를 위한 템플릿으로 볼 수 있지만, 특정 통신 메타데이터에 대한 요구사항이 없거나 적은 등 더 완화된 제약을 가진다.

이 명세는 [WOT-THING-DESCRIPTION11]의 작업을 계속하며, 하위 호환성은 보장하지 않는다. 하위 호환성이 없는 경우, 구현자가 새 버전으로 마이그레이션하기 위한 구체적인 지침이 제공될 것이다.

이 문서의 상태

이 섹션은 이 문서가 게시된 시점의 문서 상태를 설명한다. 현재 W3C 간행물 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 색인에서 확인할 수 있다.

이 문서는 Web of Things Working Group권고안 트랙을 사용하여 최초 공개 작업 초안으로 게시했다.

최초 공개 작업 초안으로 게시되었다는 사실이 W3C 및 그 회원의 승인을 의미하지는 않는다.

이 문서는 초안 문서이며 언제든지 업데이트, 대체 또는 폐기될 수 있다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 부적절하다.

이 문서는 W3C Patent Policy에 따라 운영되는 그룹이 작성했다. W3C는 그룹의 산출물과 관련하여 이루어진 특허 공개의 공개 목록을 유지하며, 해당 페이지에는 특허 공개 지침도 포함되어 있다. 개인이 자신이 알고 있는 특허가 필수 청구항을 포함한다고 믿는 경우, 그 개인은 W3C Patent Policy의 섹션 6에 따라 정보를 공개해야 한다.

이 문서는 2025년 8월 18일 W3C Process Document의 적용을 받는다.

1. 소개

이 섹션은 비규범적이다.

1.1 Thing Description

WoT Thing Description(TD)은 W3C Web of Things(WoT)의 중심 구성 요소이며, Thing의 진입점으로 간주할 수 있다(웹 사이트의 index.html과 매우 유사하다). TD 인스턴스에는 다섯 가지 주요 구성 요소가 있다. Thing 자체에 대한 텍스트 메타데이터, Interaction Affordance들의 집합, Thing을 어떻게 사용할 수 있는지 나타내는 것, 기계 이해 가능성을 위해 Thing과 교환되는 데이터의 스키마, 상호작용에 사용해야 하는 보안 메커니즘에 대한 메타데이터를 제공하는 Security Definition, 그리고 마지막으로 다른 Thing이나 웹상의 문서와의 공식적 또는 비공식적 관계를 표현하는 웹 링크이다.

W3C WoT의 Interaction Model은 세 가지 유형의 Interaction Affordance를 정의한다. Properties(PropertyAffordance 클래스)는 현재 값을 가져오거나 동작 상태를 설정하는 것과 같은 감지 및 제어 매개변수에 사용할 수 있다. Actions(ActionAffordance 클래스)는 물리적(따라서 시간이 걸리는) 프로세스의 호출을 모델링하지만, 기존 플랫폼의 RPC와 유사한 호출을 추상화하는 데에도 사용할 수 있다. Events(EventAffordance 클래스)는 알림, 개별 이벤트 또는 값의 스트림이 수신자에게 비동기적으로 전송되는 통신의 push 모델에 사용된다. 자세한 내용은 [wot-architecture11]을 참조하라.

일반적으로 TD는 URI 스킴 [RFC3986]으로 식별되는 서로 다른 Protocol Binding에 대한 메타데이터를 제공한다. (예: http, coap 등 [IANA-URI-SCHEMES]), 미디어 타입 [RFC2046]에 기반한 콘텐츠 타입 (예: application/json, application/xml, application/cbor, application/exi 등 [IANA-MEDIA-TYPES]), 그리고 보안 메커니즘(인증, 권한 부여, 기밀성 등)에 대한 것이다. TD 인스턴스의 직렬화는 JSON [RFC8259]을 기반으로 하며, JSON 이름은 이 명세 문서에서 정의된 TD 어휘의 용어를 가리킨다. 또한 TD의 JSON 직렬화는 확장과 풍부한 의미론적 처리를 가능하게 하기 위해 JSON-LD 1.1 [JSON-LD11]의 구문을 따른다.

예 1은 TD 인스턴스를 보여 주며, 제목이 MyLampThing인 램프 Thing을 설명함으로써 Properties, Actions, Events가 포함된 Interaction Model을 보여 준다.

이 TD 예로부터 제목이 status인 하나의 Property affordance가 존재함을 알 수 있다. 또한 이 Property가 URI https://mylamp.example.com/status에서 GET 메서드를 사용하는 HTTP 프로토콜의 (보안 형식)을 통해 접근 가능하며 (forms 구조 안에서 href 멤버로 알림), 문자열 기반 상태 값을 반환한다는 정보가 제공된다. GET 메서드의 사용은 명시적으로 언급되어 있지 않지만, 이 문서에서 정의하는 기본 가정 중 하나이다.

유사한 방식으로, POST 메서드를 사용하여 https://mylamp.example.com/toggle 리소스에서 스위치 상태를 토글하는 Action affordance가 지정되어 있으며, 여기서도 POST는 Actions 호출에 대한 기본 가정이다.

Event affordanceThing이 비동기 메시지를 보낼 수 있게 하는 메커니즘을 제공한다. 여기서는 HTTP와 그 long polling 하위 프로토콜을 https://mylamp.example.com/oh에서 사용하여 램프의 가능한 과열 이벤트에 대한 알림 구독을 얻을 수 있다.

이 예는 접근에 사용자 이름과 비밀번호를 요구하는 basic 보안 스킴도 지정한다. 보안 스킴은 먼저 securityDefinitions에서 이름이 부여되고, 그런 다음 security 섹션에서 그 이름을 지정하여 활성화된다는 점에 유의하라. HTTP 프로토콜의 사용과 결합하여 이 예는 HTTP Basic Authentication의 사용을 보여 준다. 최상위 수준에서 하나 이상의 보안 스킴을 지정하는 것은 필수이며, 모든 리소스에 대한 기본 접근 요구사항을 제공한다. 그러나 보안 스킴은 form별로도 지정할 수 있으며, form 수준에서 제공된 구성은 Thing 수준에서 제공된 구성을 재정의하므로 세밀한 접근 제어의 지정을 가능하게 한다. 접근 제어 메커니즘이 사용되지 않음을 나타내기 위해 특수한 nosec 보안 스킴을 사용할 수도 있다. 추가 예는 나중에 제공된다.

Thing Description은 어떤 네임스페이스 안에 컨텍스트 정의를 추가할 수 있는 가능성을 제공한다. 이 메커니즘은 주어진 네임스페이스 아래에서 애플리케이션의 특정 도메인에 대한 논리 규칙과 같은 형식적 지식을 찾을 수 있는 경우, Thing Description 인스턴스의 콘텐츠에 추가 의미론을 통합하는 데 사용할 수 있다. 컨텍스트 정보는 forms 필드에 선언된 기반 통신 프로토콜의 일부 구성과 동작을 지정하는 데에도 도움이 될 수 있다. 예 2@context에 두 번째 정의를 도입하여 접두사 saref가 Smart Appliance Reference Ontology인 SAREF를 참조한다고 선언함으로써 예 1의 TD 샘플을 확장한다 [SMARTM2M]. 이 IoT 온톨로지는 @type 필드의 값으로 설정할 수 있는 의미론적 레이블로 해석되는 용어들을 포함하며, Things와 그 Interaction Affordance들의 의미론을 제공한다. 아래 예에서 Thingsaref:LightSwitch로 레이블링되고, status Propertysaref:OnOffState로, 그리고 toggle Actionsaref:ToggleCommand로 레이블링된다.

어떤 @context 내부의 선언 메커니즘은 JSON-LD에 의해 지정된다. TD 인스턴스는 그 명세의 버전 1.1을 준수한다 [json-ld11]. 따라서 TD 인스턴스는 RDF 문서로도 처리될 수 있다 (의미론적 처리에 대한 자세한 내용은 부록 D. JSON-LD Context Usage 및 네임스페이스 IRI 아래의 문서, 예: https://www.w3.org/2019/wot/td를 참조하라).

1.2 Thing Model

Thing Description의 주요 의도 중 하나는 ConsumerThing과 성공적으로 상호작용하는 데 필요한 모든 세부 정보를 제공하는 것이다. 일부 IoT 애플리케이션 시나리오에서는 예를 들어 통신 메타데이터가 포함된 완전히 상세한 Thing Description이 필요하지 않거나(예: IoT 생태계가 통신을 별도로 암묵적으로 처리할 수 있음), 새 엔터티가 아직 배포되지 않았기 때문에 사용할 수 없을 수 있다 (예: IP 주소가 아직 알려지지 않음). 때로는 생성되는 모든 인스턴스에서 사용 가능해야 하는 기능 정의를 강제하는 일종의 클래스 정의가 필요하기도 하다(예: 새 장치의 대규모 생산).

위에서 언급한 시나리오나 다른 시나리오를 다루기 위해, Thing Model을 사용할 수 있으며, 이는 주로 ThingsProperties, Actions 및/또는 Events 안의 데이터 모델 정의를 제공하고, Thing Description 인스턴스를 생성하기 위한 템플릿으로 잠재적으로 사용될 수 있다. 다음에는 1Thing Description 인스턴스의 모델로 볼 수 있는 샘플 Thing Model이 제시된다.

3: Thing Model 샘플
{
    "@context": ["https://www.w3.org/ns/wot-next/td"],
    "@type": "tm:ThingModel",
    "title": "Lamp Thing Model",
    "properties": {
        "status": {
            "description": "current status of the lamp (on|off)",
            "type": "string",
            "readOnly": true
        }
    },
    "actions": {
        "toggle": {
            "description": "Turn the lamp on or off"
        }
    },
    "events": {
        "overheating": {
            "description": "Lamp reaches a critical temperature (overheating)",
            "data": {"type": "string"}
        }
    }
}

Thing Model 정의는 "@type": "tm:ThingModel"로 식별된다. 예가 보여 주듯이, 통신 및 보안 메타데이터가 없기 때문에 단일 Thing 인스턴스에 대한 세부 정보를 제공하지 않는다. 이 명세는 이러한 Thing Model 정의로부터 유효한 Thing Description 인스턴스를 파생하는 메커니즘을 제시한다. 또한 기존 Thing Model 정의를 재정의, 확장 및 재사용하는 방법을 포함한 다른 설계 개념도 지정된다.

2. 적합성

비규범적으로 표시된 섹션뿐 아니라, 이 명세의 모든 작성 지침, 다이어그램, 예 및 참고는 비규범적이다. 이 명세의 나머지 모든 것은 규범적이다.

이 문서의 키워드 MAY, MUST, MUST NOT, RECOMMENDED, SHOULD, 그리고 SHOULD NOT은 여기에 표시된 것처럼 모두 대문자로 나타날 때에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석된다.

Thing Description 인스턴스는 Thing Description 직렬화와 관련하여 5. TD Information Model6. TD Representation Format의 규범적 문장을 따르는 경우 이 명세를 준수한다.

Thing Description 인스턴스를 검증하기 위한 JSON Schema [JSON-SCHEMA]는 부록 B. TD 인스턴스 검증을 위한 JSON Schema에 제공된다.

3. 용어

이 섹션은 비규범적이다.

Thing, Consumer, Producer, Thing Description (TD), Partial TD, Thing Model (TM), Interaction Model, Interaction Affordance, IoT Platform, Property, Action, Event, Data Schema, Content Type, Protocol Binding, Servient, Vocabulary, Term, Vocabulary Term, WoT Interface, 그리고 WoT Runtime와 같은 기본 WoT 용어는 WoT Architecture 명세 [wot-architecture11]의 섹션 3에서 정의된다.

또한 이 명세는 다음 정의를 도입한다:

Semantic Tag, Semantic Annotation
Thing Description 문서의 정의를 (RDF) 온톨로지의 개념에 연결하는 JSON-LD 메커니즘. 이를 통해 Thing Description 작성자는 추가 컨텍스트를 제공하고 도메인 지식을 표준화된 방식으로 표현할 수 있다. Thing Description 문서에서는 @type 멤버를 사용하고, 콜론(:)을 사용하는 문자열 접두사를 통해 이를 달성할 수 있다.
TD Context Extension
Thing Description을 추가 Vocabulary Term으로 확장하는 메커니즘. 이는 의미론적 주석과 Protocol Binding, Security Scheme, Data Schema와 같은 핵심 메커니즘에 대한 확장의 기반이다.
TD Information Model
제약이 적용되는 사전 정의된 Vocabulary로부터 구성된 Class 정의의 집합이며, 이로써 이러한 Vocabulary의 의미론을 정의한다. Class 정의는 일반적으로 Signature(Vocabulary Term의 집합)와 그 Signature 위의 함수의 관점에서 표현된다. TD Information Model은 또한 Class 위의 전역 함수로 정의된 Default Value를 포함한다.
TD Processor
Thing Description의 어떤 내부 표현을 주어진 형식으로 직렬화하거나, 그 형식으로부터 역직렬화할 수 있는 시스템. TD Processor는 의미론적으로 일관되지 않은 Thing Description, 즉 Thing 클래스의 Instance Relation에 대한 제약을 만족할 수 없는 Thing Description을 감지하기 위해 검증 단계를 따를 수 있다. 이를 위해 TD Processor는 가능한 모든 Default Value가 할당된 Thing Description의 형식을 채워 넣어 계산할 수 있다. TD Processor는 일반적으로 WoT Runtime의 하위 시스템이다. TD Processor의 구현은 TD 문서로 직렬화할 수 있는 TD producer이거나, TD 문서로부터 역직렬화할 수 있는 TD consumer이거나, 또는 둘 다일 수 있다.
TD Serialization 또는 TD Document
Servient 간에 저장되고 교환될 수 있는 Thing Description의 텍스트 또는 이진 표현. TD Serialization은 주어진 표현 형식을 따르며, 네트워크를 통해 교환될 때 미디어 타입으로 식별된다. Thing Description의 기본 표현 형식은 이 명세에서 정의한 JSON 기반 형식이다.
Levels of a TD (Thing Level, Affordance Level, Data Schema Level, Forms Level 포함)
주어진 계층 수준에서 TD 또는 TM 인스턴스의 범위. 예를 들어, @context와 같은 용어가 정의되는 TD의 루트는 Thing level이고, forms는 Affordance level 내에서 정의되며, type, maximum은 Data Schema level 내에서 정의되고, href는 Forms level 내에서 정의된다. 정의되어 있지 않더라도, Links level과 같은 다른 수준을 사용할 수 있다.
Binding Specification
바인딩 명세는 프로토콜, 페이로드 형식, 또는 둘 모두에 대한 바인딩을 지정하는 문서이다. 모든 바인딩은 WoT Binding Registry [WOT-BINDING-REGISTRY]의 규칙을 따른다.
Binding Instance
바인딩 인스턴스는 특정 바인딩을 포함하고 Binding Specification을 구현하는 Thing Description의 form 인스턴스이다. 예를 들어, HTTP Binding 인스턴스는 hrefhttp:// 또는 https://로 시작하는 Form이다.

이러한 정의는 5.2 예비 정의에서 더 발전된다.

4. 네임스페이스

이 명세의 5. TD Information Model에서 정의된 TD Information Model의 버전은 다음 IRI로 식별된다:

https://www.w3.org/ns/wot-next/td

이 IRI [RFC3987]는 URI [RFC3986]이기도 하며, JSON-LD context 파일을 얻기 위해 역참조될 수 있다 [json-ld11]. 이를 통해 TD Document의 압축 문자열을 전체 IRI 기반 Vocabulary Term으로 확장할 수 있다. 그러나 이 처리는 JSON 기반 TD Document를 RDF로 변환할 때만 요구되며, 이는 TD Processor 구현의 선택적 기능이다.

참고

이 네임스페이스는 명세가 권고안 상태에 도달할 때까지 임시라는 점에 유의하라. 그 시점에 영구 네임스페이스가 할당될 것이다. 임시 네임스페이스를 사용하는 모든 문서는 명세의 git 저장소의 main 브랜치를 가리키므로 안정적이지 않다.

현재 명세에서 Vocabulary Term은 항상 압축 형식으로 제시된다. 그 확장 형식은 해당 용어가 속한 Vocabulary의 네임스페이스 IRI 아래에서 접근할 수 있다. 이러한 네임스페이스는 5.3 Class Definitions의 구조를 따른다. TD Information Model에서 사용되는 각 Vocabulary는 다음과 같이 자체 네임스페이스 IRI를 가진다:

1 TD에서 사용되는 네임스페이스
Vocabulary Namespace IRI
Core https://www.w3.org/ns/wot-next/td-ontology
Data Schema https://www.w3.org/ns/wot-next/json-schema-ontology
Security https://www.w3.org/ns/wot-next/security-ontology
Hypermedia Controls https://www.w3.org/ns/wot-next/security-ontologyy

Thing Model 정의에 추가로 사용되는 모든 vocabulary는 다음 네임스페이스 IRI를 가진다:

2 TM에서 사용되는 네임스페이스
Vocabulary Namespace IRI
Thing Model https://www.w3.org/ns/wot-next/tm-ontology

Vocabulary들은 서로 독립적이다. 이들은 다른 W3C 명세에서 재사용되고 확장될 수 있다. 어떤 Vocabulary의 설계에서 모든 중단적 변경은 새로운 연도 기반 네임스페이스 URI의 할당을 요구한다. TD Information Model의 일반적인 일관성을 유지하기 위해, 관련 JSON-LD context 파일은 각 버전이 자체 URI(v1, v1.1, v2, ...)를 가지도록 버전 관리되며, 특히 새로운 Term의 추가와 같은 비중단적 변경도 식별한다는 점에 유의하라.

어떤 네임스페이스 IRI 아래의 Vocabulary는 비중단적 변경만 겪을 수 있으므로, 그 콘텐츠는 애플리케이션에서 안전하게 캐시하거나 포함할 수 있다. 네임스페이스 IRI 아래에 비교적 정적인 콘텐츠를 노출하는 한 가지 장점은 제약된 장치 간에 교환되는 메시지의 페이로드 크기를 최적화하는 것이다. 또한 사설 네트워크에서 공개적으로 사용 가능한 vocabulary에 접근하는 장치로 인해 발생하는 개인정보 유출도 방지한다(또한 12. 개인정보 보호 고려사항 참조).

5. TD Information Model

이 섹션은 TD Information Model을 소개한다. TD Information Model은 Thing Description의 처리와 직렬화를 위한 개념적 기반 역할을 하며, 이는 6. TD Representation Format에서 별도로 설명된다.

5.1 개요

TD Information Model은 다음의 독립적인 Vocabulary를 기반으로 구축된다:

이러한 각 Vocabulary는 본질적으로 데이터 구조를 구축하는 데 사용할 수 있는 Term의 집합이며, 전통적인 객체 지향적 의미에서 객체로 해석된다. 객체는 클래스의 인스턴스이며 속성을 가진다. W3C WoT의 맥락에서 이들은 Thing과 그 Interaction Affordance를 나타낸다. 객체의 형식적 정의는 5.2 예비 정의에 제공된다. 그런 다음 TD Information Model의 주요 요소는 5.3 Class Definitions에 제시된다. Default Value가 존재하는 경우, 특정 객체 속성은 TD에서 생략될 수 있다. 기본값 목록은 5.4 Default Value Definitions에 제공된다.

다음에 표시된 UML 다이어그램은 TD Information Model의 개요를 제공한다. 이 다이어그램은 모든 클래스를 표로 나타내고, Thing 클래스에서 시작하여 클래스 간에 존재하는 연관을 방향 화살표로 나타낸다. 가독성을 위해 이 다이어그램은 네 가지 기반 Vocabulary 각각에 대해 네 부분으로 나뉘었다.

TD 핵심 vocabulary를 위한 TD information model의 UML 다이어그램
그림 1 TD 핵심 vocabulary

Data schema vocabulary를 위한 TD information model의 UML 다이어그램
그림 2 Data schema vocabulary

WoT security vocabulary를 위한 TD information model의 UML 다이어그램
그림 3 WoT security vocabulary

hypermedia controls vocabulary를 위한 TD information model의 UML 다이어그램
그림 4 Hypermedia controls vocabulary

5.2 예비 정의

트리 기반 문서에 대한 단순한 규칙(즉, 원시 JSON 처리)과 풍부한 Semantic Web 도구(즉, JSON-LD 처리) 모두에서 쉽게 처리될 수 있는 모델을 제공하기 위해, 이 문서는 TD Information Model을 그에 맞게 구성하기 위한 다음의 형식적 예비 정의를 정의한다.

이 섹션의 모든 정의는 집합을 참조하며, 집합은 직관적으로 그 자체가 집합일 수 있는 요소들의 모음이다. 임의로 복잡한 모든 데이터 구조는 집합의 관점에서 정의될 수 있다. 특히 Object는 다음과 같이 재귀적으로 정의된 데이터 구조이다:

이 정의는 Object가 동일한 이름을 가진 여러 이름-값 쌍을 포함하는 것을 막지는 않지만, 이 명세에서는 일반적으로 이를 고려하지 않는다. 요소들이 이름으로 숫자만 가지는 ObjectArray라고 한다. 마찬가지로, 요소들이 이름으로 어떤 Vocabulary에도 속하지 않는 Term만을 가지는 ObjectMap이라고 한다. Map의 어떤 이름-값 쌍에 나타나는 모든 이름은 Map의 범위 내에서 고유하다고 가정한다.

또한 Object는 어떤 Class의 인스턴스일 수 있다. Vocabulary Term으로 표시되는 Class는 먼저 Signature라고 불리는 Vocabulary Term의 집합으로 정의된다. Signature가 비어 있는 ClassSimple Type이라고 한다.

ClassSignatureClass를 더 정의하는 두 함수를 구성할 수 있게 한다: Assignment FunctionType Function. ClassAssignment Function은 해당 ClassSignature에 속한 Vocabulary Term을 입력으로 받아 출력으로 true 또는 false를 반환한다. 직관적으로 Assignment FunctionClass를 인스턴스화할 때 Signature의 요소가 필수인지 선택사항인지를 나타낸다. ClassType Function도 해당 ClassSignature에 속한 Vocabulary Term을 입력으로 받아 출력으로 또 다른 Class를 반환한다. 이러한 함수는 부분 함수이다. 그 정의역은 정의 중인 ClassSignature로 제한된다.

이 두 함수를 기반으로, ObjectClass로 구성된 쌍에 대해 Instance Relation을 정의할 수 있다. 이 관계는 만족되어야 하는 제약으로 정의된다. 즉 Object는 다음 두 제약이 모두 만족될 때 Class의 인스턴스이다:

위의 정의에 따르면, Object는 그 구조와 상관없이 모든 Simple Type의 인스턴스가 될 것이다. 대신, Simple Type에 대해서는 Instance Relation의 또 다른 정의가 도입된다. Object는 주어진 어휘 형식을 가진 Term인 경우 Simple Type의 인스턴스이다 (예: boolean 타입의 경우 true, false, unsignedInt 타입의 경우 1, 2, 3, ... 등).

또한 Parameterized Classes라고 불리는 추가 Class는 일반적인 MapArray 구조로부터 파생될 수 있다. Object는, 그것이 포함하는 모든 이름-값 쌍의 값이 어떤 Class의 인스턴스가 되도록 하는 Map인 경우, 어떤 ClassMap, 즉 어떤 Class매개변수화된 Map 타입의 인스턴스이다. 동일한 내용은 Array에도 적용된다.

마지막으로, Class는 전자의 모든 인스턴스가 후자의 인스턴스이기도 한 경우, 어떤 다른 ClassSubclass이다.

위의 모든 정의를 바탕으로, TD Information ModelClass 정의의 집합으로 이해되어야 하며, 여기에는 Class 이름 (Vocabulary Term), Signature (Vocabulary Term의 집합), Assignment Function, 그리고 Type Function이 포함된다. 이러한 Class 정의는 5.3 Class Definitions의 표로 제공된다. 각 표에서 assignment 열의 값 "mandatory"(각각 "optional")는 Assignment Function이 대응하는 Vocabulary Term에 대해 true(각각 false)를 반환함을 나타낸다.

관례상 Simple Type은 소문자로 시작하는 이름으로 표시된다. TD Information Model은 XML Schema [XMLSCHEMA11-2-20120405]에 정의된 다음 Simple Type을 참조한다: string, anyURI, dateTime, integer, unsignedInt, double, 그리고 boolean. 이들의 정의(즉, 어휘 형식의 명세)는 TD Information Model의 범위를 벗어난다.

또한 TD Information ModelVocabulary Term의 쌍에 대한 전역 함수를 정의한다. 이 함수는 입력으로 Class 이름과 또 다른 Vocabulary Term을 받아 Object를 반환한다. 반환된 Objectnull과 다르면, 이는 입력 Class의 인스턴스에서 입력 Vocabulary Term에 대한 어떤 할당의 Default Value를 나타낸다. 이 함수는 위에서 정의한 Assignment Function에 대한 제약을 완화할 수 있게 한다. 즉, Object는 모든 필수 할당을 포함하거나 또는 누락된 할당에 대해 Default Value가 존재하는 경우 Class의 인스턴스이다. 모든 Default Value5.4 Default Value Definitions의 표에 제공된다. 5.3 Class Definitions의 각 표에서 assignment 열은 TD Information ModelClassVocabulary Term의 대응 조합에 대해 Default Value를 사용할 수 있는 경우 "with default" 값을 포함한다.

여기서 도입된 형식화는 추상 데이터 구조로서의 ObjectThing과 같은 물리 세계 객체 사이의 가능한 관계를 고려하지 않는다. 그러나 TD Information Model에 관련된 모든 Vocabulary Term을 RDF 리소스로 재해석하여 물리 세계의 더 큰 모델(온톨로지)에 통합할 수 있는 가능성에 주의를 기울였다. 의미론적 처리에 대한 자세한 내용은 D. JSON-LD Context Usage와 네임스페이스 IRI 아래의 문서, 예: https://www.w3.org/2019/wot/td를 참조하라.

5.3 클래스 정의

TD Processor5.3.1 핵심 어휘 정의, 5.3.2 데이터 스키마 어휘 정의, 5.3.3 보안 어휘 정의, 그리고 5.3.4 하이퍼미디어 제어 어휘 정의에서 정의된 모든 Class에 대한 Class 인스턴스화 제약을 MUST 만족해야 한다.

특히 모든 어휘 용어와 값은 대소문자를 구분한다는 점에 유의하라. 이는 정보 모델의 직렬화에도 해당된다(섹션 6. TD 표현 형식).

5.3.1 핵심 어휘 정의

5.3.1.1 Thing

메타데이터와 인터페이스가 WoT Thing Description으로 설명되는 물리적 또는 가상 엔터티의 추상화이며, 여기서 가상 엔터티는 하나 이상의 Things의 조합이다.

3 Thing 수준의 어휘 용어
어휘 용어 설명 할당 타입
@context TD 문서 전체에서 사용되는 terms라고 불리는 축약 이름을 정의하는 JSON-LD 키워드. 필수 anyURI 또는 Array
@type 객체에 semantic tags (또는 types)를 레이블링하는 JSON-LD 키워드. 선택사항 string 또는 Array of string
id URI 형식의 Thing 식별자 [RFC3986] (예: 안정적인 URI, 임시 및 변경 가능한 URI, 로컬 IP 주소를 가진 URI, URN 등). 선택사항 anyURI
title 기본 언어를 기반으로 사람이 읽을 수 있는 제목을 제공한다(예: UI 표현을 위한 텍스트 표시). 필수 string
titles 다국어 사람이 읽을 수 있는 제목을 제공한다 (예: 다른 언어로 UI 표현을 위한 텍스트 표시). MultiLanguage도 참조하라. 선택사항 Map of MultiLanguage
description 기본 언어를 기반으로 추가적인(사람이 읽을 수 있는) 정보를 제공한다. 선택사항 string
descriptions 다른 언어로 (사람이 읽을 수 있는) 정보를 지원하는 데 사용할 수 있다. MultiLanguage도 참조하라. 선택사항 Map of MultiLanguage
version 버전 정보를 제공한다. 선택사항 VersionInfo
created TD 인스턴스가 생성된 시점에 대한 정보를 제공한다. 선택사항 dateTime
modified TD 인스턴스가 마지막으로 수정된 시점에 대한 정보를 제공한다. 선택사항 dateTime
support TD 유지관리자에 대한 정보를 URI 스킴으로 제공한다 (예: mailto [RFC6068], tel [RFC3966], https [RFC9112]). 선택사항 anyURI
base TD 문서 전체에서 모든 상대 URI 참조에 사용되는 기본 URI를 정의한다. TD 인스턴스에서 모든 상대 URI는 [RFC3986]에 정의된 알고리즘을 사용하여 기본 URI에 상대적으로 해석된다.

base@context에서 사용되는 URI와 TD 인스턴스에 의미론적 처리가 적용될 때 관련되는 Linked Data [LINKED-DATA] 그래프 안에서 사용되는 IRI에 영향을 주지 않는다.
선택사항 anyURI
properties Thing의 모든 Property 기반 Interaction Affordance. 선택사항 Map of PropertyAffordance
actions Thing의 모든 Action 기반 Interaction Affordance. 선택사항 Map of ActionAffordance
events Thing의 모든 Event 기반 Interaction Affordance. 선택사항 Map of EventAffordance
forms 작업을 수행하는 방법을 설명하는 form 하이퍼미디어 제어의 집합. Forms는 Protocol Bindings의 직렬화이다. Thing level forms는 interaction affordances 그룹에 대한 엔드포인트를 설명하는 데 사용된다. 선택사항 Array of Form
security securityDefinitions에서 정의된 것들 중에서 선택된 보안 정의 이름의 집합. 리소스 접근을 위해 이들은 모두 만족되어야 한다. 필수 string 또는 Array of string
securityDefinitions 이름이 지정된 보안 구성의 집합(정의만 해당). 이름이 security 이름-값 쌍에서 사용되지 않는 한 실제로 적용되지 않는다. 필수 Map of SecurityScheme
profile 이 Thing Description과 해당 Thing 구현이 따르는 WoT Profile 메커니즘을 나타낸다. 선택사항 anyURI 또는 Array of anyURI
schemaDefinitions 이름이 지정된 데이터 스키마의 집합. AdditionalExpectedResponse 객체 안의 schema 이름-값 쌍에서 사용된다. 선택사항 Map of DataSchema
uriVariables DataSchema 선언을 기반으로 한 컬렉션으로 [RFC6570]에 따른 URI 템플릿 변수를 정의한다. Thing level uriVariablesThing level forms 또는 Interaction Affordances에서 사용할 수 있다. 개별 변수 DataSchema는 ObjectSchema나 ArraySchema일 수 없다. 각 변수는 작업 실행 시 href 안에서 문자열로 직렬화되어야 하기 때문이다. 동일한 변수가 Thing level uriVariables와 Interaction Affordance level 모두에 선언된 경우, Interaction Affordance level 변수가 우선한다. 선택사항 Map of DataSchema
참고

다음 @context URL 규칙에 대한 목록 항목은 큰 변경을 거치게 될 것이다.

@context에 대해 다음 규칙이 Thing Description 인스턴스에 대해 정의된다:

  • @context 이름-값 쌍은 문서를 TD 1.1로 식별하여 Consumers가 새로 도입된 terms를 사용할 수 있도록 하기 위해 anyURI https://www.w3.org/2022/wot/td/v1.1를 포함해야 MUST 한다.
  • TD 1.0 consumers가 있을 가능성이 있는 경우, anyURI https://www.w3.org/2019/wot/td/v1가 첫 번째 항목이어야 MUST 하며, https://www.w3.org/2022/wot/td/v1.1는 두 번째 항목이어야 MUST 한다.
  • TD 1.1 consumers는 W3C WoT Thing Description 1.0 [wot-thing-description10] 명세를 만족하는 TD를 수용해야 MUST 한다.
  • @contextArray인 경우, anyURI https://www.w3.org/2022/wot/td/v1.1 뒤에는 임의의 순서로 anyURI 타입 또는 Map 타입의 요소가 올 수 MAY 있지만, @context Array 안의 모든 이름-값 쌍을 포함하는 하나의 Map만 포함하는 것이 RECOMMENDED된다.
  • @context Array에 포함된 Maps는 이름-값 쌍을 포함할 수 MAY 있으며, 이때 값은 anyURI 타입의 네임스페이스 식별자이고 이름은 해당 네임스페이스를 나타내는 Term 또는 접두사이다.
  • @context Array에 포함된 하나의 Map은 Thing Description의 기본 언어를 정의하는 이름-값 쌍을 포함해야 SHOULD 하며, 여기서 이름은 Term @language이고 값은 [BCP47]에서 정의한 올바른 형식의 언어 태그이다 (예: en, de-AT, gsw-CH, zh-Hans, zh-Hant-HK, sl-nedis).

Thing DescriptionThing Model 인스턴스의 사람이 읽을 수 있는 모든 텍스트의 기본 방향을 결정하기 위해, 이 명세는 기본 방향 메타데이터를 연결하는 내장 메커니즘이 없을 때 [STRING-META] 가이드라인의 문자열별 방향 정보를 따를 것을 권장한다.

TD Processors는 양방향 텍스트를 처리할 때 특정 특수 사례를 인식해야 한다. TD Processors는 특히 주변 텍스트에 삽입할 때(예: Web 사용자 인터페이스) 사용자에게 문자열을 표시할 때 bidi isolation을 사용하도록 주의해야 SHOULD 한다. 혼합 방향 텍스트는 언어가 올바르게 식별된 경우에도 어떤 언어에서든 발생할 수 있다.

TD producers는 단순한 사용자 에이전트가 성공적으로 표시할 수 있는 방식으로 혼합 방향 문자열을 제공하려고 시도해야 SHOULD 한다. 예를 들어, RTL 문자열이 LTR 런(예: 숫자 또는 라틴 문자로 된 브랜드나 상표명)으로 시작하는 경우, 문자열 시작 부분에 RLM 문자를 포함하거나 반대 방향 런을 bidi controls로 감싸면 올바른 표시를 도울 수 있다.

Strings on the Web: Language and Direction Metadata [string-meta]는 양방향 텍스트를 사용할 때의 여러 함정을 설명하고 지침을 제공한다.

properties, actions, 그리고 events Maps에서 명시적으로 제공되는 Interaction Affordance 외에도, Thing은 선택적 forms Array 안의 Form 인스턴스로 표시되는 meta-interactions도 제공할 수 있다. Thing 인스턴스의 forms ArrayForm 인스턴스를 포함하는 경우, 이는 op 멤버를 포함해야 MUST 하며, 이름 op에 할당된 문자열 값은 직접 또는 Array 안에서 다음 operation types 중 하나여야 MUST 한다: readallproperties, writeallproperties, readmultipleproperties, writemultipleproperties, observeallproperties, unobserveallproperties, queryallactions, subscribeallevents, 또는 unsubscribeallevents. (Thing 인스턴스에서 form을 사용하는 예는 를 참조하라.)

각 property meta-interaction의 데이터 스키마는 각 PropertyAffordance 인스턴스의 데이터 스키마를 단일 ObjectSchema 인스턴스 안에 결합하여 구성되며, 여기서 ObjectSchema 인스턴스의 properties Map은 대응하는 PropertyAffordances 인스턴스의 이름으로 식별되는 각 PropertyAffordances의 데이터 스키마를 포함한다.

달리 지정되지 않는 한(예: TD Context Extension을 통해), readmultipleproperties 작업의 요청 데이터는 의도한 PropertyAffordances 인스턴스 이름을 포함하는 Array이며, Form 인스턴스가 지정한 콘텐츠 타입으로 직렬화된다.

5.3.1.2 InteractionAffordance

가능한 선택지를 Consumers에게 보여 주어, Consumers가 Thing과 상호작용할 수 있는 방법을 제안하는 Thing의 메타데이터. 잠재적인 affordance에는 여러 유형이 있지만, W3C WoT는 세 가지 유형의 Interaction Affordances를 정의한다: Properties, Actions, Events.

4 InteractionAffordance 수준의 어휘 용어
어휘 용어 설명 할당 타입
@type 객체에 semantic tags (또는 types)를 레이블링하는 JSON-LD 키워드. 선택사항 string 또는 Array of string
title 기본 언어를 기반으로 사람이 읽을 수 있는 제목을 제공한다(예: UI 표현을 위한 텍스트 표시). 선택사항 string
titles 다국어 사람이 읽을 수 있는 제목을 제공한다 (예: 다른 언어로 UI 표현을 위한 텍스트 표시). MultiLanguage도 참조하라. 선택사항 Map of MultiLanguage
description 기본 언어를 기반으로 추가적인(사람이 읽을 수 있는) 정보를 제공한다. 선택사항 string
descriptions 다른 언어로 (사람이 읽을 수 있는) 정보를 지원하는 데 사용할 수 있다. MultiLanguage도 참조하라. 선택사항 Map of MultiLanguage
forms 작업을 수행하는 방법을 설명하는 form 하이퍼미디어 제어의 집합. Forms는 Protocol Bindings의 직렬화이다. 배열은 비어 있을 수 없다. 필수 Array of Form
uriVariables DataSchema 선언을 기반으로 한 컬렉션으로 [RFC6570]에 따른 URI 템플릿 변수를 정의한다. 개별 변수 DataSchema는 ObjectSchema나 ArraySchema일 수 없다. 각 변수는 작업 실행 시 href 안에서 문자열로 직렬화되어야 하기 때문이다. 동일한 변수가 Thing level uriVariables와 Interaction Affordance level 모두에 선언된 경우, Interaction Affordance level 변수가 우선한다. 선택사항 Map of DataSchema

InteractionAffordance 클래스는 다음 하위 클래스를 가진다:

5.3.1.3 PropertyAffordance

Thing의 상태를 노출하는 Interaction Affordance. 이 상태는 검색(읽기)되거나 업데이트(쓰기)될 수 있다. Things는 변경 후 새 상태를 push함으로써 Properties를 관찰 가능하게 만들 수도 있다.

5 PropertyAffordance 수준의 어휘 용어
어휘 용어 설명 할당 타입
observable Thing을 호스팅하는 Servients와 Intermediaries가 이 Property에 대해 observepropertyunobserveproperty 작업을 지원하는 Protocol Binding을 제공해야 하는지를 나타내는 힌트. 기본값 있음 boolean
참고

Property 인스턴스는 DataSchema 클래스의 인스턴스이기도 하다. 따라서 다른 것들 중에서도 type, unit, readOnly, writeOnly 멤버를 포함할 수 있다.

PropertyAffordanceInteractionAffordance ClassDataSchema ClassSubclass이다. PropertyAffordance 인스턴스 안에 Form 인스턴스가 있는 경우, op에 할당된 값은 readproperty, writeproperty, observeproperty, unobserveproperty 중 하나이거나 이러한 terms의 조합을 포함하는 Array여야 MUST 한다.

참고

프로토콜이 암시적 구독 해지 메커니즘(예: 연결 손실을 감지하기 위한 heartbeat)을 지원하지 않는 한, 각 observeproperty에 대응하는 unobserveproperty가 있는 것이 좋은 관행으로 간주된다.

참고

관찰 메커니즘은 기반 프로토콜 또는 하위 프로토콜에 의존한다. 그렇다고 해서 구독이 시작되자마자 현재 Property 값이 제공된다는 보장은 없다. 따라서 첫 번째 값을 얻기 위해 구독 전/후에 현재 Property 값을 읽어야 할 수도 있다.

5.3.1.4 ActionAffordance

상태를 조작하거나(예: 램프 켜기/끄기 토글) Thing에서 프로세스를 트리거하는(예: 시간이 지남에 따라 램프를 어둡게 하기) Thing의 함수를 호출할 수 있게 하는 Interaction Affordance.

6 ActionAffordance 수준의 어휘 용어
어휘 용어 설명 할당 타입
input Action의 입력 데이터 스키마를 정의하는 데 사용된다. 선택사항 DataSchema
output Action의 출력 데이터 스키마를 정의하는 데 사용된다. 선택사항 DataSchema
safe Action이 안전한지(=true) 아닌지를 신호한다. Action을 호출할 때 내부 상태(cf. 리소스 상태)가 변경되지 않는지를 신호하는 데 사용된다. 이 경우 응답은 예를 들어 캐시될 수 있다. 기본값 있음 boolean
idempotent Action이 멱등인지(=true) 아닌지를 나타낸다. 존재하는 경우 동일한 입력을 기반으로 Action을 반복해서 호출해도 동일한 결과를 얻을 수 있는지를 알려 준다. 기본값 있음 boolean
synchronous action이 동기식인지(=true) 아닌지를 나타낸다. 동기식 action은 action의 응답이 action 결과에 대한 모든 정보를 포함하며, action 상태에 대한 추가 조회가 필요하지 않음을 의미한다. 이 키워드가 없으면 action의 동기성에 대해 어떤 주장도 할 수 없다. 선택사항 boolean

ActionAffordanceInteractionAffordance ClassSubclass이다. ActionAffordance 인스턴스 안에 Form 인스턴스가 있는 경우, op에 할당된 값은 invokeaction, queryaction, cancelaction 중 하나이거나 이러한 terms의 조합을 포함하는 Array여야 MUST 한다.

5.3.1.5 EventAffordance

이벤트 데이터를 Consumers에게 비동기적으로 push하는 이벤트 소스를 설명하는 Interaction Affordance (예: 과열 경고).

7 EventAffordance 수준의 어휘 용어
어휘 용어 설명 할당 타입
subscription 구독 시 전달해야 하는 데이터(예: Webhooks 설정을 위한 필터 또는 메시지 형식)를 정의한다. 선택사항 DataSchema
data Thing이 push하는 Event 인스턴스 메시지의 데이터 스키마를 정의한다. 선택사항 DataSchema
dataResponse 데이터 메시지에 대한 응답으로 consumer가 보내는 Event 응답 메시지의 데이터 스키마를 정의한다. 선택사항 DataSchema
cancellation 구독을 취소하기 위해 전달해야 하는 모든 데이터 (예: Webhook을 제거하기 위한 특정 메시지)를 정의한다. 선택사항 DataSchema

EventAffordanceInteractionAffordance ClassSubclass이다. EventAffordance 인스턴스 안에 Form 인스턴스가 있는 경우, op에 할당된 값은 subscribeevent, unsubscribeevent 중 하나이거나 Array 안에 두 terms 모두여야 MUST 한다.

참고

프로토콜이 암시적 구독 해지 메커니즘(예: 연결 손실을 감지하기 위한 heartbeat)을 지원하지 않는 한, 각 subscribeevent에 대응하는 unsubscribeevent가 있는 것이 좋은 관행으로 간주된다.

EventAffordances는 Thing 자체가 관심 있는 Consumers에게 상태 변경을 알린다는 점에서 observable PropertyAffordances와 유사하다. 그러나 EventAffordances의 주요 차이점은 관련 리소스의 모든 변경이 이벤트 메시지를 발생시킬 필요는 없다는 것이다. 예를 들어 숫자 값의 임계 임계값이 있을 수 있다. 또한 EventAffordances는 subscription, dataResponse, 그리고 cancellation DataSchema 정의를 통해 더 복잡한 구독 및 구독 해지 메커니즘을 허용한다. 하지만 모든 프로토콜이 이러한 더 고급 메커니즘을 지원하는 것은 아닐 수 있으므로, 일부 시나리오에서는 events가 observable PropertyAffordances와 매우 유사할 수 있다. 이러한 경우 Affordance를 모델링하기 위해 Property와 Event 중 무엇을 선택할지는 기반 리소스의 의미론을 기반으로 결정해야 한다. 예를 들어 affordance의 상태가 Consumer에 의해 읽히거나 쓰여야 한다면, Property가 가장 적절한 선택일 가능성이 높다.

5.3.1.6 VersionInfo

TD 문서에 대한 버전 정보를 제공하는 Thing의 메타데이터. 필요한 경우 펌웨어 및 하드웨어 버전과 같은 추가 버전 정보 (TD 네임스페이스 외부의 term 정의)는 TD Context Extension 메커니즘을 통해 확장할 수 있다.

8 VersionInfo 수준의 어휘 용어
어휘 용어 설명 할당 타입
instance 이 TD의 버전 표시자를 제공한다. 필수 string
model 기반 TM의 버전 표시자를 제공한다. 선택사항 string

VersionInfo Classinstancesmodel 안의 값은 점으로 구분된 세 숫자의 시퀀스가 각각 주 버전, 부 버전, 패치 버전을 나타내는 semantic versioning 패턴을 따르는 것이 권장된다. 자세한 내용은 [SEMVER]를 참조하라.

5.3.1.7 MultiLanguage

[BCP47]에 설명된 언어 태그로 식별되는 여러 언어의 사람이 읽을 수 있는 텍스트 집합을 제공하는 Map. Thing Description 인스턴스에서 이 컨테이너를 사용하는 예는 6.3.2 사람이 읽을 수 있는 메타데이터를 참조하라.

MultiLanguage Map의 각 이름은 [BCP47]에서 정의한 언어 태그여야 MUST 한다. MultiLanguage Map의 각 값은 string 타입이어야 MUST 한다.

5.3.2 데이터 스키마 어휘 정의

데이터 스키마는 데이터 형식에 포함된 데이터에 대한 추상 표기법이다.

데이터 스키마 어휘 정의는 JSON Schema [JSON-SCHEMA]에서 정의된 terms의 매우 일반적인 부분집합을 반영한다. JSON Schema draft 7용 JSON Schema [JSON-SCHEMA] processor는 데이터 스키마를 소비할 수 있다. Thing Description 인스턴스 안의 데이터 스키마 정의는 이 정의된 부분집합에 제한되지 않으며, 7. TD Context Extensions에서 설명한 대로 추가 terms를 위한 TD Context Extension을 사용하여 JSON Schema에서 찾을 수 있는 추가 terms를 사용할 수 있다. 그렇지 않으면 이러한 terms는 TD Processors에 의해 의미론적으로 무시된다 (의미론적 처리에 대한 자세한 내용은 D. JSON-LD Context Usage와 네임스페이스 IRI 아래의 문서, 예: https://www.w3.org/2019/wot/td를 참조하라).

TD에서 구체적인 데이터 형식은 콘텐츠 타입을 사용하여 Forms( 5.3.4.2 Form 참조)에 지정된다. Form 인스턴스의 콘텐츠 타입 값이 application/json이면, 데이터 스키마는 JSON Schema processors가 직접 처리할 수 있다. 그렇지 않으면 Web of Things(WoT) Binding Registry [WOT-BINDING-REGISTRY]의 항목이 데이터 스키마에서 XML [xml]과 같은 다른 콘텐츠 타입으로의 사용 가능한 매핑을 정의한다. Form 인스턴스의 콘텐츠 타입이 application/json이 아니고 해당 콘텐츠 타입에 대한 매핑이 정의되어 있지 않은 경우, 데이터 스키마를 지정하는 것은 그 콘텐츠 타입에 의미가 없다.

다음 표는 페이로드의 구조를 설명하기 위해 데이터 스키마를 사용할 수 MAY 있는 콘텐츠 타입을 포함한다.

9 Data Schema를 사용할 수 있는 콘텐츠 타입
형식 콘텐츠 타입
JSON/CBOR application/json
application/ld+json
application/senml+json
application/cbor
application/senml+cbor
XML/EXI application/xml
application/senml+xml
application/exi
application/senml-exi
5.3.2.1 DataSchema

사용되는 데이터 형식을 설명하는 메타데이터. 검증에 사용할 수 있다.

10 DataSchema 수준의 어휘 용어
어휘 용어 설명 할당 타입
@type 객체에 semantic tags (또는 types)를 레이블링하는 JSON-LD 키워드 선택사항 string 또는 Array of string
title 기본 언어를 기반으로 사람이 읽을 수 있는 제목을 제공한다(예: UI 표현을 위한 텍스트 표시). 선택사항 string
titles 다국어 사람이 읽을 수 있는 제목을 제공한다 (예: 다른 언어로 UI 표현을 위한 텍스트 표시). MultiLanguage도 참조하라. 선택사항 Map of MultiLanguage
description 기본 언어를 기반으로 추가적인(사람이 읽을 수 있는) 정보를 제공한다. 선택사항 string
descriptions 다른 언어로 (사람이 읽을 수 있는) 정보를 지원하는 데 사용할 수 있다. MultiLanguage도 참조하라. 선택사항 Map of MultiLanguage
const 상수 값을 제공한다. 선택사항 any type
default 기본값을 제공한다. 값은 그것이 위치한 데이터 스키마에 대해 검증되어야 SHOULD 한다. 선택사항 any type
unit 예를 들어 국제 과학, 공학 및 비즈니스에서 사용되는 단위 정보를 제공한다. 고유성을 보존하기 위해, unit 값은 의미론적 정의를 가리키는 것이 권장된다 (섹션 Semantic Annotations도 참조). 선택사항 string
oneOf 데이터가 배열에 지정된 스키마 중 하나에 대해 유효한지 보장하는 데 사용된다. 여러 입력 또는 출력 스키마를 설명하는 데 사용할 수 있다. 선택사항 Array of DataSchema
enum 배열로 제공되는 제한된 값 집합. 선택사항 Array of any type
readOnly property interaction / value가 읽기 전용인지(=true) 아닌지(=false)를 나타내는 힌트인 Boolean 값. 기본값 있음 boolean
writeOnly property interaction / value가 쓰기 전용인지(=true) 아닌지(=false)를 나타내는 힌트인 Boolean 값. 기본값 있음 boolean
format "date-time", "email", "uri" 등과 같은 format 패턴을 기반으로 한 검증을 허용한다. (아래도 참조.) 선택사항 string
type JSON Schema와 호환되는 JSON 기반 데이터 타입의 할당(boolean, integer, number, string, object, array 또는 null 중 하나). 선택사항 anyURI (object, array, string, number, integer, boolean, 또는 null 중 하나)

DataSchema 클래스는 다음 하위 클래스를 가진다:

format 문자열 값은 알려진 고정 값 집합과 [JSON-SCHEMA]에 정의된 해당 format 규칙(특히 섹션 7.3 Defined Formats)에서 알려져 있다. Servients는 그에 따라 추가 검증을 수행하기 위해 format 값을 사용할 수 MAY 있다. 알려진 값 집합에서 찾을 수 없는 값이 format에 할당된 경우, 그러한 검증은 성공해야 SHOULD 한다.

Vocabulary terms typed as any type (e.g., const, default) follow data types compatible with JSON Schema (boolean, integer, number, string, object, array, or null).
참고

format term은 JSON Schema 도구에서 널리 구현되어 있지 않다. 또한 format term은 JSON Schema 표준화 커뮤니티에서 논의 중이며, 향후 JSON Schema 버전에서 다른 메커니즘으로 대체되거나 제거될 수 있다.

5.3.2.2 ArraySchema

Array 타입의 데이터를 설명하는 메타데이터. 이 SubclassDataSchema 인스턴스에서 type에 할당된 array 값으로 표시된다.

11 ArraySchema 수준의 어휘 용어
어휘 용어 설명 할당 타입
items 배열의 특성을 정의하는 데 사용된다. 선택사항 DataSchema 또는 Array of DataSchema
minItems 배열에 있어야 하는 최소 항목 수를 정의한다. 선택사항 unsignedInt
maxItems 배열에 있어야 하는 최대 항목 수를 정의한다. 선택사항 unsignedInt
5.3.2.3 BooleanSchema

boolean 타입의 데이터를 설명하는 메타데이터. 이 SubclassDataSchema 인스턴스에서 type에 할당된 boolean 값으로 표시된다.

5.3.2.4 NumberSchema

number 타입의 데이터를 설명하는 메타데이터. 이 SubclassDataSchema 인스턴스에서 type에 할당된 number 값으로 표시된다.

12 NumberSchema 수준의 어휘 용어
어휘 용어 설명 할당 타입
minimum 포함 하한을 나타내는 최소 숫자 값을 지정한다. 관련 number 또는 integer 타입에만 적용된다. 선택사항 double
exclusiveMinimum 배타 하한을 나타내는 최소 숫자 값을 지정한다. 관련 number 또는 integer 타입에만 적용된다. 선택사항 double
maximum 포함 상한을 나타내는 최대 숫자 값을 지정한다. 관련 number 또는 integer 타입에만 적용된다. 선택사항 double
exclusiveMaximum 배타 상한을 나타내는 최대 숫자 값을 지정한다. 관련 number 또는 integer 타입에만 적용된다. 선택사항 double
multipleOf multipleOf 값 숫자를 지정한다. 값은 0보다 엄격히 커야 한다. 관련 number 또는 integer 타입에만 적용된다. 선택사항 double
5.3.2.5 IntegerSchema

integer 타입의 데이터를 설명하는 메타데이터. 이 SubclassDataSchema 인스턴스에서 type에 할당된 integer 값으로 표시된다.

13 IntegerSchema 수준의 어휘 용어
어휘 용어 설명 할당 타입
minimum 포함 하한을 나타내는 최소 숫자 값을 지정한다. 관련 number 또는 integer 타입에만 적용된다. 선택사항 integer
exclusiveMinimum 배타 하한을 나타내는 최소 숫자 값을 지정한다. 관련 number 또는 integer 타입에만 적용된다. 선택사항 integer
maximum 포함 상한을 나타내는 최대 숫자 값을 지정한다. 관련 number 또는 integer 타입에만 적용된다. 선택사항 integer
exclusiveMaximum 배타 상한을 나타내는 최대 숫자 값을 지정한다. 관련 number 또는 integer 타입에만 적용된다. 선택사항 integer
multipleOf multipleOf 값 숫자를 지정한다. 값은 0보다 엄격히 커야 한다. 관련 number 또는 integer 타입에만 적용된다. 선택사항 integer
5.3.2.6 ObjectSchema

Object 타입의 데이터를 설명하는 메타데이터. 이 SubclassDataSchema 인스턴스에서 type에 할당된 object 값으로 표시된다.

14 ObjectSchema 수준의 어휘 용어
어휘 용어 설명 할당 타입
properties 중첩된 데이터 스키마 정의. 선택사항 Map of DataSchema
required object 타입의 어떤 멤버가 필수인지, 즉 전송될 payload에서 어떤 멤버가 필수인지(예: invokeaction, writeproperty의 입력) 그리고 수신되는 payload에서 어떤 멤버가 확실히 전달될 것인지(예: invokeaction, readproperty의 출력)를 정의한다. 선택사항 Array of string
5.3.2.7 StringSchema

string 타입의 데이터를 설명하는 메타데이터. 이 SubclassDataSchema 인스턴스에서 type에 할당된 string 값으로 표시된다.

15 StringSchema 수준의 어휘 용어
어휘 용어 설명 할당 타입
minLength 문자열의 최소 길이를 지정한다. 관련 string 타입에만 적용된다. 선택사항 unsignedInt
maxLength 문자열의 최대 길이를 지정한다. 관련 string 타입에만 적용된다. 선택사항 unsignedInt
pattern 문자열 값의 제약을 표현하기 위한 정규 표현식을 제공한다. 정규 표현식은 [ECMA-262] 방언을 따라야 한다. 선택사항 string
contentEncoding [RFC2045] (섹션 6.1) 및 [RFC4648]에 지정된 대로 콘텐츠를 저장하는 데 사용되는 인코딩을 지정한다. 선택사항 string (예: 7bit, 8bit, binary, quoted-printable, base16, base32, 또는 base64)
contentMediaType [RFC2046]에 설명된 대로 문자열 값 콘텐츠의 MIME 타입을 지정한다. 선택사항 string (예: image/png, 또는 audio/mpeg)
참고

문자열의 길이(즉, minLengthmaxLength)는 [RFC8259]에서 정의한 Unicode code point의 수로 정의된다. 일부 사용자가 인식하는 문자는 둘 이상의 Unicode code point로 구성된다는 점에 유의하라. 임의의 인덱스 값은 이러한 grapheme 경계에 위치하지 않을 수 있으므로, maxLength에 따른 잘라내기는 문자열의 외형이나 의미를 변경할 수 있다.

5.3.2.8 NullSchema

null 타입의 데이터를 설명하는 메타데이터. 이 subclass는 DataSchema 인스턴스에서 type에 할당된 null 값으로 표시된다. 이 Subclass는 오직 하나의 허용 가능한 값, 즉 null만을 설명한다. null이 값의 부재를 의미하지 않는다는 점에 유의하는 것이 중요하다. 이는 JavaScript의 null, Python의 None, Java의 null, Ruby 프로그래밍 언어의 nil과 유사하다. 이는 oneOf 선언의 일부로 사용할 수 있으며, 데이터가 null일 수도 있음을 나타내는 데 사용된다.

5.3.3 보안 어휘 정의

이 명세는 W3C WoT의 Protocol Bindings로 적합한 프로토콜에 직접 내장되어 있거나 해당 프로토콜과 함께 널리 사용되는, 잘 정립된 보안 메커니즘의 선택을 제공한다. 현재 HTTP 보안 스킴 집합은 부분적으로 OpenAPI 3.0.1을 기반으로 한다([OPENAPI]도 참조). 그러나 이 명세에서 제공되는 HTTP 보안 스킴, Vocabulary, 그리고 구문은 OpenAPI와 많은 유사점을 공유하지만, 호환되지는 않는다.

일반적으로 보안 스킴이 효과적이려면 TLS 또는 DTLS와 같은 어떤 형태의 보안 전송이 필요하다. 보안 전송 사용에 대한 요구사항은 이 문서의 섹션 11. 보안 고려사항과 [wot-architecture11]의 보안 고려사항 섹션에 제공된다.

5.3.3.1 SecurityScheme

보안 메커니즘의 구성을 설명하는 메타데이터. 이름 scheme에 할당된 값은 Thing Description에 포함된 Vocabulary 안에서 정의되어야 MUST 하며, 이는 § 5. TD Information Model에서 정의된 표준 Vocabulary 안이거나 TD Context Extension 안이어야 한다.

모든 보안 스킴에 대해, 접근을 직접 제공하는 키, 비밀번호 또는 기타 민감한 정보는 TD에 저장되어서는 MUST NOT 안 되며, 대신 다른 메커니즘을 통해 대역 외에서 공유되고 저장되어야 한다. TD의 목적은 Consumer가 이미 권한을 가진 경우에만 Thing에 접근하는 방법을 설명하는 것이며, 그 권한을 부여하는 데 사용되도록 의도된 것이 아니다.

TD에서 사용되는 각 보안 스킴 객체는 접근이 허용되기 전에 충족되어야 하는 요구사항 집합을 정의한다. 우리는 모든 요구사항이 충족될 때 보안 스킴이 만족된다고 말한다. 어떤 경우에는 접근이 허용되기 전에 여러 보안 스킴의 요구사항이 충족되어야 할 수도 있다.

보안 스킴은 일반적으로 비밀번호나 키와 같은 추가 인증 매개변수를 요구할 수 있다. 이 정보의 위치는 이름 in과 연결된 값으로 표시되며, 종종 name과 연결된 값과 함께 사용된다. in과 연결된 값은 다음 값 중 하나를 취할 수 있다:

header:
매개변수는 프로토콜이 제공하는 헤더에 주어지며, 헤더의 이름은 name 값으로 제공된다.
query:
매개변수는 URI에 쿼리 매개변수로 추가되며, 쿼리 매개변수의 이름은 name으로 제공된다.
body:
매개변수는 요청 페이로드의 본문에 제공되며, 사용되는 데이터 스키마 요소는 name으로 제공된다. body 보안 정보 위치의 문맥에서 사용될 때, name의 값은 그것이 사용되는 각 상호작용에 대한 입력 DataSchema의 루트에 상대적인 JSON pointer [RFC6901] 형식이어야 MUST 한다. 이 값은 fragment identifier가 아니며 TD의 루트에 상대적인 것이 아니라 보안 스킴이 바인딩되는 데이터 스키마에 상대적이므로, #로 시작해서는 안 된다. 이는 “순수한” JSON pointer이다. 이 값은 fragment identifier가 아니므로 특수 문자를 URL 인코딩할 필요도 없다. 대상 요소는 참조된 object 또는 array schema의 지정된 위치에 이미 존재할 수도 있고 존재하지 않을 수도 있다(따라서 이 메커니즘은 simple types에는 적용되지 않는다). 존재하지 않으면 삽입된다. 이는 모든 상호작용의 데이터 스키마에서 정의를 중복해야 하는 일을 피하게 한다. body locator에 표시된 JSON pointer가 나타내는 데이터 스키마 요소가 표시된 스키마에 아직 존재하지 않는 경우, pointer가 나타내는 위치에 해당 요소를 삽입할 수 있어야 MUST 한다. body locator에서 사용되는 JSON pointer는 기존 배열의 마지막 요소 뒤에 요소를 삽입해야 할 때 존재하지 않는 배열 요소를 나타내기 위해 "-" 문자를 사용할 수 MAY 있다. body 보안 정보 위치가 참조하거나 생성하는 요소는 필수이며 "string" 타입이어야 MUST 한다. name이 주어지지 않으면 전체 본문이 보안 매개변수로 사용되는 것으로 간주된다.
cookie:
매개변수는 name 값으로 식별되는 쿠키에 저장된다.
uri:
매개변수는 URI 자체에 포함되며, name 값으로 정의된 URI 템플릿 변수를 사용하여 관련 상호작용에서 인코딩된다. 이는 query 메커니즘보다 더 일반적이지만 더 복잡하다. 보안 스킴에서 이름 in에 대한 값으로 uriquery가 적용되지 않는 경우에만 지정되어야 SHOULD 한다. in의 값으로 uri를 사용하는 보안 스킴이 있는 상호작용에서 제공되는 URI는 정의된 변수를 포함하는 URI 템플릿이어야 MUST 한다.
auto:
위치는 프로토콜의 일부로 결정되거나 협상된다. SecuritySchemein 필드에 auto 값이 설정된 경우, name 필드는 설정되지 않아야 SHOULD NOT 한다. 이 경우 SecurityScheme의 적용은 주어진 프로토콜에 대한 각각의 명세를 따른다(예: HTTP와 함께 BasicSecurityScheme을 사용할 때 [RFC8288]).

보안 스킴에 여러 매개변수가 필요한 경우, 각 매개변수에 대해 보안 스킴 정의를 반복하고 combo 보안 스킴과 allOf를 사용하여 결합한다. 어떤 경우에는 매개변수가 실제로 비밀이 아닐 수 있지만, 사용자가 개인정보 보호를 돕기 위해 이를 TD에서 제외하고자 할 수 있다. 예를 들어 일부 보안 메커니즘은 클라이언트 식별자와 비밀 키를 모두 요구한다. 이론적으로 클라이언트 식별자는 공개되어 있지만 업데이트하기 어려울 수 있고 추적 위험을 야기할 수 있다. 이러한 경우 TD에 나타나지 않도록 추가 보안 매개변수로 제공할 수 있다.

SecurityScheme에서 선언된 URI 변수의 이름은 TD에서 선언된 다른 모든 URI 변수와 구별되어야 MUST 한다.

16 SecurityScheme 수준의 어휘 용어
어휘 용어 설명 할당 타입
@type 객체에 semantic tags (또는 types)를 레이블링하는 JSON-LD 키워드. 선택사항 string 또는 Array of string
description 기본 언어를 기반으로 추가적인(사람이 읽을 수 있는) 정보를 제공한다. 선택사항 string
descriptions 다른 언어로 (사람이 읽을 수 있는) 정보를 지원하는 데 사용할 수 있다. MultiLanguage도 참조하라. 선택사항 Map of MultiLanguage
proxy 이 보안 구성이 접근을 제공하는 프록시 서버의 URI. 주어지지 않으면 해당 보안 구성은 endpoint에 대한 것이다. 선택사항 anyURI
scheme 구성되는 보안 메커니즘의 식별. 필수 string (예: nosec, combo, basic, digest, bearer, psk, oauth2, apikey, 또는 auto)

SecurityScheme 클래스는 다음 하위 클래스를 가진다:

5.3.3.2 NoSecurityScheme

Vocabulary Term nosec로 식별되는 보안 구성 (즉, "scheme": "nosec")으로, 리소스에 접근하기 위해 인증이나 기타 메커니즘이 필요하지 않음을 나타낸다.

5.3.3.3 AutoSecurityScheme

term auto로 식별되는 자동 인증 보안 구성 (즉, "scheme": "auto"). 이 스킴은 보안 매개변수가 런타임에 기반 프로토콜에 의해 협상되며, 주어진 프로토콜에 대한 각각의 명세를 따른다는 것을 나타낸다 (예: HTTP를 사용할 때 Basic Authentication에 대해 [RFC8288]).

5.3.3.4 ComboSecurityScheme

Vocabulary Term combo로 식별되는 다른 보안 스킴의 조합 (즉, "scheme": "combo"). 이 스킴의 요소들은 securityDefinitions에 정의된 다른 이름 있는 스킴들, 다른 ComboSecurityScheme 정의를 포함하여, 새로운 스킴 정의를 만들기 위해 결합되는 다양한 방식을 정의한다. oneOf 또는 allOf vocabulary terms 중 정확히 하나가 포함되어야 MUST 한다. 함께 사용할 수 있는 보안 스킴 정의만 allOf와 결합할 수 있다. 예를 들어 하나가 프록시에 적용되고 다른 하나가 endpoint에 적용되는 경우가 아니면, 일반적으로 서로 다른 OAuth 2.0 flows를 allOf로 함께 결합하는 것은 불가능하다. 여러 이름 있는 보안 스킴 정의가 security 필드에 나열된 경우, allOf 조합과 동일한 의미론이 적용된다는 점에 유의하라(허용 가능한 조합에 대한 동일한 제한도 적용된다). oneOf 조합은 그 외에는 동일한 forms에서 서로 다른 보안 스킴을 사용하는 것과 동등하다. 이런 의미에서 oneOf 스킴은 필수적인 기능은 아니지만, 그러한 경우 중복을 피할 수 있게 한다.

17 ComboSecurityScheme 수준의 어휘 용어
어휘 용어 설명 할당 타입
oneOf 다른 이름 있는 보안 스킴 정의를 식별하는 두 개 이상의 문자열 배열이며, 그중 어느 하나라도 만족되면 접근이 허용된다. 사용을 위해 하나만 선택될 수 있다. 필수 Array of string
allOf 다른 이름 있는 보안 스킴 정의를 식별하는 두 개 이상의 문자열 배열이며, 접근을 위해 모두 만족되어야 한다. 필수 Array of string
5.3.3.5 BasicSecurityScheme

암호화되지 않은 사용자 이름과 비밀번호를 사용하는, Vocabulary Term basic (즉, "scheme": "basic")으로 식별되는 Basic Authentication [RFC7617] 보안 구성.

18 BasicSecurityScheme 수준의 어휘 용어
어휘 용어 설명 할당 타입
name query, header, cookie 또는 uri 매개변수의 이름. 선택사항 string
in 보안 인증 정보의 위치를 지정한다. 기본값 있음 string ( header, query, body, cookie, 또는 auto 중 하나)
5.3.3.6 DigestSecurityScheme

Vocabulary Term digest (즉, "scheme": "digest")로 식별되는 Digest Access Authentication [RFC7616] 보안 구성. 이 스킴은 basic authentication과 유사하지만 man-in-the-middle attacks를 피하기 위한 추가 기능을 가진다.

19 DigestSecurityScheme 수준의 어휘 용어
어휘 용어 설명 할당 타입
name query, header, cookie 또는 uri 매개변수의 이름. 선택사항 string
in 보안 인증 정보의 위치를 지정한다. 기본값 있음 string ( header, query, body, cookie, 또는 auto 중 하나)
qop 보호 품질. 기본값 있음 string ( auth, 또는 auth-int 중 하나)
5.3.3.7 APIKeySecurityScheme

Vocabulary Term apikey (즉, "scheme": "apikey")로 식별되는 API key authentication 보안 구성. 이 스킴은 access token이 불투명한 경우, 예를 들어 클라우드 서비스 제공자가 알 수 없거나 독점적인 형식의 키를 제공하는 경우 사용된다. 이 경우 키는 표준 token 형식을 사용하지 않을 수 있다. 이 스킴은 서비스 제공자가 제공한 키가 "in" 필드가 나타내는 메커니즘을 사용하여 서비스 요청의 일부로 제공되어야 함을 나타낸다.

20 APIKeySecurityScheme 수준의 어휘 용어
어휘 용어 설명 할당 타입
name query, header, cookie 또는 uri 매개변수의 이름. 선택사항 string
in 보안 인증 정보의 위치를 지정한다. 기본값 있음 string ( header, query, body, cookie, uri, 또는 auto 중 하나)
5.3.3.8 BearerSecurityScheme

bearer tokens가 OAuth2와 독립적으로 사용되는 상황을 위한, Vocabulary Term bearer (즉, "scheme": "bearer")로 식별되는 Bearer Token [RFC6750] 보안 구성. oauth2 스킴이 지정된 경우, 이것이 암시되므로 일반적으로 이 스킴을 함께 지정할 필요는 없다. format에 대해, 값 jwt는 [RFC7519] 준수를 나타내고, jws는 [RFC7797] 준수를 나타내며, cwt는 [RFC8392] 준수를 나타내고, jwe는 [RFC7516] 준수를 나타내며, alg의 값은 이러한 표준과 일관되게 해석된다. bearer tokens에 대한 다른 형식과 알고리즘은 vocabulary extensions에서 지정될 수 MAY 있다.

21 BearerSecurityScheme 수준의 어휘 용어
어휘 용어 설명 할당 타입
authorization authorization server의 URI. 선택사항 anyURI
name query, header, cookie 또는 uri 매개변수의 이름. 선택사항 string
in 보안 인증 정보의 위치를 지정한다. 기본값 있음 string ( header, query, body, cookie, 또는 auto 중 하나)
alg 인코딩, 암호화 또는 digest 알고리즘. 기본값 있음 string (예: ES256, 또는 ES512-256)
format 보안 인증 정보의 형식을 지정한다. 기본값 있음 string (예: jwt, cwt, jwe, 또는 jws)
5.3.3.9 PSKSecurityScheme

Vocabulary Term psk (즉, "scheme": "psk")로 식별되는 pre-shared key authentication 보안 구성. 이는 TLS-PSK [RFC4279]와 같은 pre-shared keys에 표준이 사용되며, 키에 사용되는 ciphersuite가 프로토콜 협상 중에 설정된다는 것을 식별하기 위한 것이다.

22 PSKSecurityScheme 수준의 어휘 용어
어휘 용어 설명 할당 타입
identity 선택 또는 확인에 사용할 수 있는 정보를 제공하는 식별자. 선택사항 string
5.3.3.10 OAuth2SecurityScheme

[RFC6749] 및 [RFC8252]를 준수하는 시스템을 위한 OAuth 2.0 authentication 보안 구성으로, Vocabulary Term oauth2 (즉, "scheme": "oauth2")로 식별된다.

23 OAuth2SecurityScheme 수준의 어휘 용어
어휘 용어 설명 할당 타입
authorization authorization server의 URI. 선택사항 anyURI
token token server의 URI. 선택사항 anyURI
refresh refresh server의 URI. 선택사항 anyURI
scopes 배열로 제공되는 authorization scope 식별자 집합. 이들은 authorization server가 반환한 tokens에 제공되고, 클라이언트가 어떤 리소스에 어떻게 접근할 수 있는지를 식별하기 위해 forms와 연결된다. form과 연결된 값은 해당 form에서 활성인 OAuth2SecurityScheme에 정의된 것 중에서 선택되어야 SHOULD 한다. 선택사항 string 또는 Array of string
flow Authorization flow. 필수 string (예: code, 또는 client)

code flow의 경우 authorizationtoken vocabulary terms가 모두 포함되어야 MUST 한다. client flow의 경우 token vocabulary term이 포함되어야 MUST 한다. client flow의 경우 authorization vocabulary term은 포함되어서는 MUST NOT 안 된다. 각 flow의 필수 요소는 다음 표에 요약되어 있다:

요소 code client
authorization 필수 생략
token 필수 필수
refresh 선택사항 선택사항

5.3.4 하이퍼미디어 제어 어휘 정의

현재 모델은 Thing이 노출하는 (타입이 지정된) Web links와 Web forms에 대한 표현을 제공한다. Link 클래스 정의는 Web Linking [RFC8288]에서 정의된 terms의 매우 일반적인 부분집합을 반영한다. 정의된 terms는 예를 들어 Lamp ThingSwitch Thing에 의해 제어되는 것처럼 다른 Thing과의 관계를 설명하는 데 사용할 수 있다. Form 클래스는 Things (및 다른 Web resources)의 상태를 조작하기 위해 새로 도입된 hypermedia control 형식에 해당한다.

5.3.4.2 Form

form은 " form context에서 operation type 작업을 수행하려면, submission targetrequest method 요청을 하라"라는 문장으로 볼 수 있으며, 선택적 form fields는 필요한 요청을 추가로 설명할 수 있다. Thing Descriptions에서 form context는 Properties, Actions, Events와 같은 주변 Object이거나 meta-interactions의 경우 Thing 자체이다.

26 Form 수준의 어휘 용어
어휘 용어 설명 할당 타입
href link의 대상 IRI 또는 form의 제출 대상. 필수 anyURI
contentType media type [RFC2046]에 대한 media type(예: text/plain) 및 잠재적 매개변수(예: charset=utf-8)를 기반으로 콘텐츠 타입을 할당한다. 선택사항 string
contentCoding Content coding 값은 표현에 적용되었거나 적용될 수 있는 인코딩 변환을 나타낸다. Content codings는 주로 표현이 그 기반 media type의 정체성을 잃지 않고, 정보 손실 없이 압축되거나 유용하게 변환될 수 있게 하는 데 사용된다. content coding의 예에는 "gzip", "deflate" 등이 포함된다. 선택사항 string
security securityDefinitions에서 정의된 것들 중에서 선택된 보안 정의 이름의 집합. 리소스 접근을 위해 이들은 모두 만족되어야 한다. 선택사항 string 또는 Array of string
scopes 배열로 제공되는 authorization scope 식별자 집합. 이들은 authorization server가 반환한 tokens에 제공되고, 클라이언트가 어떤 리소스에 어떻게 접근할 수 있는지를 식별하기 위해 forms와 연결된다. form과 연결된 값은 해당 form에서 활성인 OAuth2SecurityScheme에 정의된 것 중에서 선택되어야 SHOULD 한다. 선택사항 string 또는 Array of string
response 예를 들어 출력 통신 메타데이터가 입력 메타데이터와 다를 경우(예: 출력 contentType이 입력 contentType과 다름) 사용할 수 있는 선택적 term. response 이름은 primary response messages에만 유효한 메타데이터를 포함한다. 선택사항 ExpectedResponse
additionalResponses 오류 보고와 같이 추가 예상 응답이 가능할 경우 사용할 수 있는 선택적 term. 각 추가 응답은 어떤 방식으로든 다른 응답과 구별되어야 하며(예: 프로토콜별 오류 코드를 지정), 자체 데이터 스키마를 가질 수도 있다. 선택사항 Array of AdditionalExpectedResponse
subprotocol 주어진 프로토콜에 여러 옵션이 있을 때 상호작용이 수행될 정확한 메커니즘을 나타낸다. 예를 들어 HTTP와 Events의 경우 long polling(longpoll), WebSub [websub] (websub), Server-Sent Events (sse) [html] (EventSource라고도 함)와 같은 비동기 알림에 사용해야 하는 여러 사용 가능한 메커니즘 중 어느 것을 사용해야 하는지 나타낸다. subprotocol 선택에는 제한이 없으며 다른 메커니즘도 이 subprotocol term으로 알릴 수 있다는 점에 유의하라. 선택사항 string (예: longpoll, websub, 또는 sse)
op form이 설명하는 작업(들)을 수행하는 의미론적 의도를 나타낸다. 예를 들어 Property interaction은 get 및 set 작업을 허용한다. protocol binding은 get 작업을 위한 form과 set 작업을 위한 다른 form을 포함할 수 있다. op 속성은 어떤 form이 어떤 작업을 위한 것인지 나타내며, 클라이언트가 필요한 작업에 맞는 올바른 form을 선택할 수 있게 한다. op에는 각각 작업의 의미론적 의도를 나타내는 하나 이상의 interaction verb(s)를 할당할 수 있다. 기본값 있음 string 또는 Array of string ( readproperty, writeproperty, observeproperty, unobserveproperty, invokeaction, queryaction, cancelaction, subscribeevent, unsubscribeevent, readallproperties, writeallproperties, readmultipleproperties, writemultipleproperties, observeallproperties, unobserveallproperties, subscribeallevents, unsubscribeallevents, 또는 queryallactions 중 하나)

contentCoding property에 가능한 값은 예를 들어 IANA HTTP content coding registry에서 찾을 수 있다.

form의 가능한 operation types 목록은 고정되어 있다. 이 명세의 현재 버전 기준으로, [wot-architecture11]에 설명된 WoT interaction model을 구현하는 데 필요한 잘 알려진 types만 포함한다. 표준의 향후 버전은 이 목록을 확장할 수 있지만, operations types는 아래 표의 값으로 제한되어야 MUST 한다.

27 잘 알려진 operation types
Operation Type 설명
readproperty 대응하는 데이터를 검색하기 위한 Property Affordances의 읽기 작업을 식별한다.
writeproperty 대응하는 데이터를 업데이트하기 위한 Property Affordances의 쓰기 작업을 식별한다.
observeproperty Property가 업데이트될 때 새 데이터로 알림을 받기 위한 Property Affordances의 관찰 작업을 식별한다.
unobserveproperty 대응하는 알림을 중지하기 위한 Property Affordances의 관찰 해지 작업을 식별한다.
invokeaction 대응하는 action을 수행하기 위한 Action Affordances의 호출 작업을 식별한다.
queryaction 대응하는 action의 상태를 얻기 위한 Action Affordances의 조회 작업을 식별한다.
cancelaction 진행 중인 대응하는 action을 취소하기 위한 Action Affordances의 취소 작업을 식별한다.
subscribeevent event가 발생할 때 Thing으로부터 알림을 받기 위한 Event Affordances의 구독 작업을 식별한다.
unsubscribeevent 대응하는 알림을 중지하기 위한 Event Affordances의 구독 해지 작업을 식별한다.
readallproperties 단일 상호작용에서 모든 Properties의 데이터를 검색하기 위한 Thing의 readallproperties 작업을 식별한다.
writeallproperties 단일 상호작용에서 모든 쓰기 가능한 Properties의 데이터를 업데이트하기 위한 Thing의 writeallproperties 작업을 식별한다.
readmultipleproperties 단일 상호작용에서 선택된 Properties의 데이터를 검색하기 위한 Thing의 readmultipleproperties 작업을 식별한다.
writemultipleproperties 단일 상호작용에서 선택된 쓰기 가능한 Properties의 데이터를 업데이트하기 위한 Thing의 writemultipleproperties 작업을 식별한다.
observeallproperties 어떤 Property든 업데이트될 때 새 데이터로 알림을 받기 위한 Properties의 observeallproperties 작업을 식별한다.
unobserveallproperties 단일 상호작용에서 모든 Properties로부터의 알림을 중지하기 위한 Properties의 unobserveallproperties 작업을 식별한다.
queryallactions 단일 상호작용에서 모든 Actions의 상태를 얻기 위한 Thing의 queryallactions 작업을 식별한다.
subscribeallevents 단일 상호작용에서 모든 Events의 알림을 구독하기 위한 Events의 subscribeallevents 작업을 식별한다.
unsubscribeallevents 단일 상호작용에서 모든 Events의 알림을 구독 해지하기 위한 Events의 unsubscribeallevents 작업을 식별한다.

WoT producerThing DescriptionConsumer가 지원할 수 있는, 예를 들어 서로 다른 프로토콜 및/또는 콘텐츠 타입 선언을 가진 여러 forms entries를 가질 수 있다. 이 경우 Consumer는 자신에게 작동하는(예: 프로토콜과 콘텐츠 타입이 지원되는) 어떤 form entry든 선택할 수 있다. 하나의 form이 선택되면, Consumer는 WoT producer와의 모든 새로운 상호작용에서 가능한 한 오랫동안 그것을 계속 사용할 것으로 기대된다.

5.3.4.2.1 op 값을 Data Schemas에 매핑하기

이 섹션은 비규범적이다.

TD와 함께 사용할 수 있는 프로토콜은 request-response 또는 eventing 메커니즘을 따른다. affordance의 Data Schema는 일반적으로 forms에서 사용되는 op 키워드와 상관관계를 가진다. 아래 표는 op 키워드와 함께 사용 가능한 데이터 스키마 관련 terms를 정보 제공적으로 요약한다.

  • Consumer to Thing은 property 쓰기 값과 같이 Consumer가 Thing에 보내는 메시지에 적용된다.
  • Thing to Consumer는 property 읽기 결과로서의 property 값과 같이 Thing이 Consumer에 보내는 메시지에 적용된다.
  • 데이터 스키마와 작업 사이에 상관관계가 없는 경우, 이는 작업을 실행하는 데 payload가 필요하지 않거나 작업 결과로 payload가 예상되지 않음을 의미한다.
28 op 값을 Data Schemas에 매핑하기
Operation Type Consumer to Thing DataSchema 상관관계 Thing to Consumer DataSchema 상관관계
readproperty 상관관계 없음. "writeOnly":true가 없는 Property Affordance의 모든 필드.
writeproperty "readOnly":true가 없는 Property Affordance의 모든 필드. 상관관계 없음. additionalResponses는 form level에서 사용할 수 있다.
observeproperty 상관관계 없음. "writeOnly":true가 없는 Property Affordance의 모든 필드.
unobserveproperty 상관관계 없음. 상관관계 없음.
invokeaction input 키의 값. output 키의 값.
queryaction 상관관계 없음. 상관관계 없음. additionalResponses는 form level에서 사용할 수 있다.
cancelaction 상관관계 없음. 상관관계 없음. additionalResponses는 form level에서 사용할 수 있다.
subscribeevent "readOnly":true가 없는 모든 필드를 포함하는 subscription 키의 값 "writeOnly":true가 없는 모든 필드를 포함하는 subscription 키의 값
unsubscribeevent "readOnly":true가 없는 모든 필드를 포함하는 subscription 키의 값 "writeOnly":true가 없는 모든 필드를 포함하는 subscription 키의 값
참고: writeproperty와 observeproperty 관계

property에 쓰는 것이 반드시 해당 property를 관찰하는 Consumer에게 새 값이 전송된다는 것을 의미하지는 않는다. 이는 프로토콜과 구현에 따라 달라진다.

참고: 추가 Data Schemas 매핑

readallproperties와 같은 meta operations의 매핑뿐 아니라, operations를 data schemas에 매핑하는 방법에 대한 추가 명세는 [WOT-BINDING-TEMPLATES]의 해당 프로토콜 명세에서 찾을 수 있다.

선택적 response 이름-값 쌍은 예상되는 response message에 대한 메타데이터를 제공하는 데 사용할 수 있다. core vocabulary에서는 콘텐츠 타입 정보만 포함할 수 있지만, TD Context Extensions가 적용될 수 있다. response 이름-값 쌍이 제공되지 않으면, response의 콘텐츠 타입은 Form 인스턴스에 할당된 콘텐츠 타입과 같다고 가정해야 MUST 한다. ExpectedResponse Class 안의 contentType에는 Default Value가 없다는 점에 유의하라.

어떤 경우에는 추가 응답이 가능할 수 있다. 이에 대한 한 가지 예는 오류 응답이지만, 어떤 경우에는 추가적인 성공 응답도 있을 수 있다. 이 경우 response 이름-값 쌍은 여전히 primary response에 사용되지만, additionalResponses도 제공될 수 있으며, 그 값은 AdditionalExpectedResponse 객체의 배열이다. 각 추가 응답은 contentType 또는 오류 코드 헤더 값과 같은 프로토콜별 설정을 통해 primary response와 어떤 방식으로든 구별되어야 한다. 각 추가 응답은 상호작용의 일반 출력 데이터 스키마와 다를 수 있는 자체 데이터 스키마도 가질 수 있다.

일부 사용 사례에서는 입력 및 출력 데이터가 서로 다른 형식으로 표현될 수 있다. 예를 들어 JSON을 받지만 이미지를 반환하는 Action이 있을 수 있다. 이러한 경우 선택적 response 키-값 쌍은 예상되는 response의 콘텐츠 타입을 설명할 수 있다. 정의된 기본값이 없으므로 다음 assertion이 적용된다:

  • form 안의 response 객체에 contentType 값이 정의되어 있지 않은 경우, Consumer는 해당 response가 payload를 포함하지 않는다고 예상해야 MUST 한다.
  • form 안의 response 객체에 content type이 정의된 경우, Consumer는 해당 형식의 payload를 포함하는 response를 예상해야 MUST 한다. 예를 들어 image/jpeg의 경우 이미지이다.

유사한 고려사항은 additional responses에도 적용된다:

  • additional expected response의 콘텐츠 타입이 form의 콘텐츠 타입과 다른 경우, Form 인스턴스는 이름 additionalResponses와 연결된 배열에 항목을 포함해야 MUST 한다.
  • additional expected response 객체에 contentType 값이 정의되어 있지 않은 경우, Consumer는 해당 response가 payload를 포함하지 않는다고 예상해야 MUST 한다.
  • additional expected response의 데이터 스키마가 상호작용의 출력 데이터 스키마와 다른 경우, Form은 이름 additionalResponses와 연결된 배열에 이름 schema에 대한 값을 포함하는 항목을 포함해야 MUST 한다.
  • contentType이 없을 때 additional expected response 객체의 schema는 정의되어서는 MUST NOT 안 된다.

request와 response의 변형에 관한 여러 경우는 위에서 설명했다. C. Thing Descriptions에서 contentType 사용의 표는 이러한 경우를 간결하게 요약한다.

5.3.4.3 ExpectedResponse

primary response에 대한 예상 response message를 설명하는 통신 메타데이터.

29 ExpectedResponse 수준의 어휘 용어
어휘 용어 설명 할당 타입
contentType media type [RFC2046]에 대한 media type(예: text/plain) 및 잠재적 매개변수(예: charset=utf-8)를 기반으로 콘텐츠 타입을 할당한다. 선택사항 string
5.3.4.4 AdditionalExpectedResponse

additional responses에 대한 예상 response message를 설명하는 통신 메타데이터.

30 AdditionalExpectedResponse 수준의 어휘 용어
어휘 용어 설명 할당 타입
success additional response가 오류로 간주되어서는 안 되는지 신호한다. 기본값 있음 boolean
schema additional response가 기본 출력 데이터 스키마와 다른 경우 그 출력 데이터 스키마를 정의하는 데 사용된다. DataSchema 객체가 아니라 schemaDefinitions map에 주어진 이전 정의의 이름을 사용해야 한다. 선택사항 string
contentType media type [RFC2046]에 대한 media type(예: text/plain) 및 잠재적 매개변수(예: charset=utf-8)를 기반으로 콘텐츠 타입을 할당한다. 선택사항 string

5.4 기본값 정의

TD에서 할당이 누락된 경우, TD ProcessorDefault Value Definitions의 표에 표현된 Default Value 할당을 따라야 MUST 한다.

다음 표는 TD Information Model에서 정의된 모든 Default Values를 제공한다.

31 terms가 TD에 없을 때 사용되는 vocabulary terms의 기본값
Class Vocabulary Term Default Value 주석
PropertyAffordance readOnly false 이 vocabulary term의 기본값은 PropertyAffordance 수준 정의에만 적용된다. DataSchema 정의와 같은 다른 문맥에서는 이 vocabulary term이 선택사항이다.
PropertyAffordance writeOnly false 이 vocabulary term의 기본값은 PropertyAffordance 수준 정의에만 적용된다. DataSchema 정의와 같은 다른 문맥에서는 이 vocabulary term이 선택사항이다.
PropertyAffordance observable false
ActionAffordance safe false
ActionAffordance idempotent false
AdditionalExpectedResponse success false
Form contentType application/json
Form op Array of string with the elements readproperty and writeproperty when readOnly and writeOnly are set to false or Array of string with the element readproperty when readOnly is set to true or Array of string with the element writeproperty when writeOnly is set to true.
PropertyAffordance의 인스턴스 안에서 정의된 경우
Form op invokeaction ActionAffordance의 인스턴스 안에서 정의된 경우
Form op Array of string with the elements subscribeevent and unsubscribeevent EventAffordance의 인스턴스 안에서 정의된 경우
BasicSecurityScheme in header
DigestSecurityScheme in header
DigestSecurityScheme qop auth
APIKeySecurityScheme in query
BearerSecurityScheme in header
BearerSecurityScheme alg ES256
BearerSecurityScheme format jwt

추가로, 기본값 사용에는 다음 고려사항이 적용된다:

기본값과 확장 메커니즘은 순차적으로 적용될 수 있다는 점에 유의하라. 예를 들어 "readOnly""writeOnly"가 없다는 것은 31에 따라 두 항목 모두에 기본값 false가 적용됨을 의미하며, 이는 다시 "op"의 기본값이 ["readproperty", "writeproperty"]임을 의미한다. protocol binding의 기본 methods를 사용하면, 이는 "GET""PUT"이 각각 "readproperty""writeproperty"에 대응한다는 뜻이다. 그러나 여러 operations 확장 메커니즘에 따라 내부적으로 두 개의 별도 forms가 생성되며, 각각 하나의 operation과 기본 method를 나타낸다. 그런 다음 기본 context expansion 메커니즘이 적용되어 htv 접두사의 정의를 @context에 추가한다. 아래 예는 모든 기본값과 확장 메커니즘을 적용한 후의 초기 TD와 완전히 확장된 TD를 보여 준다.

6. TD 표현 형식

WoT Thing Description은 Things를 표현하며 5. TD Information Model을 기반으로 모델링되고 구조화된다. 이 섹션은 TD Information Model에서 정의한 Class Thing의 인스턴스 직렬화인, Things를 위한 JSON 기반 표현 형식을 정의한다.

TD Processor6.1 JSON 타입으로의 매핑6.3 정보 모델 직렬화에 명시된 규칙에 따라, Thing Descriptions을 JSON 형식 [RFC8259]으로 직렬화하거나, 해당 형식으로부터 Thing Descriptions을 역직렬화할 수 있어야 MUST 한다.

TD Information Model의 JSON 직렬화는 의미론적 평가를 간소화하기 위해 JSON-LD 1.1 [json-ld11]의 구문과 정렬되어 있다. 따라서 TD 표현 형식은 원시 JSON으로 처리할 수도 있고 JSON-LD 1.1 processor로 처리할 수도 있다 (의미론적 처리에 대한 자세한 내용은 D. JSON-LD Context Usage와 네임스페이스 IRI 아래의 문서, 예: https://www.w3.org/2019/wot/td를 참조하라).

상호 운용 가능한 국제화를 지원하기 위해, TD는 open ecosystems에 대해 RFC8259 [RFC8259] 섹션 8.1에 정의된 요구사항에 따라 직렬화되어야 MUST 한다. 요약하면 이는 다음을 요구한다:

6.1 JSON 타입으로의 매핑

TD Information Model은 모델 Objects와 JSON 타입 사이에 쉬운 매핑이 있도록 구성되어 있다. 모든 Class 인스턴스는 JSON 객체로 매핑되며, 여기서 Class 인스턴스의 각 이름-값 쌍은 JSON 객체의 멤버가 된다.

5.3 Class Definitions에서 언급한 모든 Simple Type (즉, string, anyURI, dateTime, integer, unsignedInt, double, 그리고 boolean)은 아래에 나열된 규칙에 따라 primitive JSON type(string, number, boolean)으로 매핑된다. 이러한 규칙은 이름-값 쌍의 값에 적용된다:

TD Information Model의 모든 복합 타입(즉, Arrays, Maps, 그리고 Class 인스턴스)은 아래에 나열된 규칙에 따라 structured JSON type(array 및 object)으로 매핑된다:

6.2 기본값 생략

Thing Description 직렬화는 5.4 기본값 정의에 제공된 표에 나열된 것처럼 Default Values가 정의된 Vocabulary Term을 생략할 수 있다.

다음 예는 예 1의 TD 인스턴스를 보여 주며, Default Values가 있는 멤버를 함께 포함할 수 있는 체크박스를 제공한다 (=checkbox checked). 이러한 멤버는 TD 직렬화를 단순화하기 위해 생략할 수 있다(=checkbox unchecked). TD Processor는 이렇게 생략된 멤버를 주어진 Default Value와 함께 명시적으로 존재하는 것과 동일하게 해석한다는 점에 유의하라.

사용되는 Protocol Binding에 따라 추가적인 프로토콜별 Vocabulary Terms가 적용될 수 있다는 점에 유의하라. 이들에는 관련 Default Values도 있을 수 있으므로, 이 하위 섹션에서 설명한 것처럼 생략할 수도 있다. 자세한 정보는 8.1.1 Protocol Bindings에서 확인할 수 있다.

6.3 정보 모델 직렬화

6.3.1 Thing 루트 객체

Thing Description은 Thing 타입의 Object를 루트로 하는 데이터 구조이다. 다시 말해 Thing Description의 JSON 직렬화는 TD Information Model로부터 구성된 구문 트리의 루트인 JSON 객체이다.

TD Serialization의 루트 요소는 @context라는 이름의 멤버와 https://www.w3.org/ns/wot-next/td와 같거나 이를 포함하는 문자열 또는 배열 타입의 값을 포함하는 JSON 객체여야 MUST 한다.

일반적으로 이 URI는 이 명세에서 정의한 TD 표현 형식 버전을 식별하는 데 사용된다. JSON-LD 처리 [json-ld11]의 경우, 이 URI는 Thing Description context 파일을 지정한다. 배열 타입의 @contextTD Context Extensions를 나타낸다(자세한 내용은 7. TD Context Extensions 참조).

{
    "@context": "https://www.w3.org/ns/wot-next/td",
    // ...
}

Thing의 인스턴스에 있는 모든 이름-값 쌍 중, 이름이 ThingSignature에 있는 Vocabulary Term인 것은 루트 객체의 JSON 멤버로 직렬화되어야 MUST 한다.

모든 필수 및 선택적 멤버를 포함하는 직렬화된 루트 객체의 TD 스니펫은 아래에 제공된다:

8: Thing 직렬화 샘플
{
    "@context": "https://www.w3.org/ns/wot-next/td",
    "@type": "Thing",
    "id": "urn:uuid:1b37933b-3212-4dad-9c2c-74c6042c3e2b",
    "title": "MyThing",
    "titles": {/*...*/},
    "description": "Human readable information.",
    "descriptions": {/*...*/},
    "support": "mailto:support@example.com",
    "version": {/*...*/},
    "created": "2018-11-14T19:10:23.824Z",
    "modified": "2019-06-01T09:12:43.124Z",
    "securityDefinitions": {/*...*/},
    "security": /*...*/,
    "base": "https://servient.example.com/",
    "properties": {/*...*/},
    "actions": {/*...*/},
    "events": {/*...*/},
    "links": [...],
    "forms": [...]
}

Class Thing의 인스턴스에서 version, securityDefinitions, descriptions, schemaDefinitions, uriVariables, properties, actions, 그리고 events에 할당된 모든 값은 JSON 객체로 직렬화되어야 MUST 한다.

Class Thing의 인스턴스에서 linksforms에 할당된 모든 값은 각각 6.3.8 links6.3.9 forms에서 정의한 JSON 객체를 포함하는 JSON 배열로 직렬화되어야 MUST 한다.

Class Thing의 인스턴스에서 security에 할당된 값은 JSON 문자열 또는 요소가 JSON 문자열인 JSON 배열로 직렬화되어야 MUST 한다.

6.3.2 사람이 읽을 수 있는 메타데이터

titledescription이라는 이름의 JSON 멤버는 TD 문서 안에서 사람이 읽을 수 있는 메타데이터를 제공하는 데 사용된다. TD 문서를 살펴보는 개발자를 위한 주석이나 사용자 인터페이스의 표시 텍스트로 사용할 수 있다.

5.3.1.1 Thing에서 정의한 것처럼, 사람이 읽을 수 있는 메타데이터를 표시하는 데 사용되는 기본 텍스트 방향은 first-strong 규칙과 같은 휴리스틱을 사용하여 추정하거나 언어 정보에서 추론할 수 있다. TD 문서에서 기본 언어는 @context 안의 @language에 할당된 값으로 정의되며, 필요하다면 script subtag와 함께 기본 텍스트 방향을 결정하는 데 사용할 수 있다. 그러나 사람이 읽을 수 있는 텍스트를 해석할 때, 사람이 읽을 수 있는 각 문자열 값은 독립적으로 처리되어야 MUST 한다. 즉, TD Processor는 한 문자열에서 다른 문자열로 방향 변경을 이어받을 수 없으며, TD의 다른 곳에 있는 한 문자열로부터 다른 문자열의 방향을 추론할 수도 없다.

titledescription을 사용하는 TD 스니펫은 아래에 표시된다. 기본 언어는 @context 배열 안의 JSON 객체 내 @language 멤버 정의를 통해 en으로 설정된다.

{
    "@context": [
        "https://www.w3.org/ns/wot-next/td",
        { "@language": "en" }
    ],
    "title": "MyThing",
    "description": "Human readable information.",
    // ...
    "properties": {
        "on": {
            "title": "On/Off",
            "type": "boolean",
            "forms": [...]
        },
        "status": {
            "title": "Status",
            "type": "object",
            // ...
            "forms": [...]
        }
    },
    // ...
}

Strings on the Web [STRING-META]는 문자열 값의 base direction을 결정하기 위해 메타데이터 사용을 권장한다. Thing Description 형식이 JSON-LD 1.1 [json-ld11]을 기반으로 한다는 점을 고려할 때, 문자열 값 "ltr", "rtl" 및 null 값 null을 가지는 @direction은 전체 TD 문서 안의 사람이 읽을 수 있는 문자열에 대한 기본 텍스트 방향을 나타내기 위해 @context 안에서 사용될 수 MAY 있다. @direction과 같은 메타데이터가 없을 때, TD Consumers는 fallback으로 first-strong detection을 사용해야 SHOULD 한다. MultiLanguage Map의 경우, TD Consumers는 개별 문자열의 언어 태그로부터 base direction을 추론할 수 MAY 있다. 이는 TD에서 제공되는 정보를 기반으로 TD Consumers가 구현할 수 있는 아래 단계로 요약될 수 있다.

  1. 파일 수준 메타데이터: @context에서 찾은 @direction 값을 사용한다.
  2. 언어로부터 추정: @language 값을 사용한 다음 텍스트의 방향을 추정한다
  3. First-strong: 문자열에서 첫 번째 강한 방향성 문자를 사용한다. 이는 HTML 속성에서 dir=auto를 사용하는 것과 동등하다.
참고

문자열별 방향 메타데이터는 현재 버전의 명세에서는 가능하지 않다는 점에 유의하라. 워킹 그룹은 이를 가능하게 하는 메커니즘을 작업 중이다. 그 이후에는 그것이 TD Consumers에서 텍스트 방향을 처리하는 선호 방식이 될 것이다.

또한 아래 예는 @direction@language terms의 사용을 보여 준다. 더 자세한 정보는 [json-ld11] 및 [string-meta]를 참조하라.

{
     "@context": [
         "https://www.w3.org/ns/wot-next/td",
         {
           "@language": "ar-EG",
           "@direction": "rtl"
         }
     ],
     "title": "شيء يخصني يقيس درجة الحرارة",
     "description": "شيء يقيس درجة الحرارة و يظهر حالته",
     // ...
     "properties": {
         "temp": {
             "title": "درجة الحرارة",
             "type": "boolean",
             "forms": [...]
         },
         "status": {
             "title": "حالة",
             "type": "object",
             // ...
             "forms": [...]
         }
     },
     // ...
 }

titlesdescriptions라는 이름의 JSON 멤버는 하나의 TD 문서 안에서 여러 언어의 사람이 읽을 수 있는 메타데이터를 제공하는 데 사용된다. MultiLanguage Map의 모든 이름-값 쌍은 JSON 객체의 멤버로 직렬화되어야 MUST 하며, 여기서 이름은 [BCP47]에서 정의한 유효한 언어 태그이고( W3C I18N Glossary도 참조), 값은 해당 태그가 나타내는 언어의 사람이 읽을 수 있는 문자열이다. 자세한 내용은 5.3.1.7 MultiLanguage를 참조하라. TD 문서 안의 모든 MultiLanguage 객체는 동일한 언어 멤버 집합을 포함해야 SHOULD 한다.

서로 다른 수준에서 titlesdescriptions를 사용하는 TD 스니펫은 아래에 제공된다:

{
    "@context": "https://www.w3.org/ns/wot-next/td",
    "title": "MyThing",
    "titles": {
        "en": "MyThing",
        "de": "MeinDing",
        "ja": "私の物",
        "zh-Hans": "我的东西",
        "zh-Hant": "我的東西"
    },
    "descriptions": {
        "en": "Human readable information.",
        "de": "Menschenlesbare Informationen.",
        "ja": "人間が読むことができる情報",
        "zh-Hans": "人们可阅读的信息",
        "zh-Hant": "人們可閱讀的資訊"
    },
    // ...
    "properties": {
        "on": {
            "titles": {
                "en": "On/Off",
                "de": "An/Aus",
                "ja": "オンオフ",
                "zh-Hans": "开关",
                "zh-Hant": "開關" },
            "type": "boolean",
            "forms": [...]
        },
        "status": {
            "titles": {
                "en": "Status",
                "de": "Zustand",
                "ja": "状態",
                "zh-Hans": "状态",
                "zh-Hant": "狀態" },
            "type": "object",
            // ...
            "forms": [...]
        }
    },
    // ...
}

TD 인스턴스는 titledescription의 사용을 titlesdescriptions와 결합할 수도 있다. titletitles, 또는 descriptiondescriptions가 같은 JSON 객체 안에 존재하는 경우, titledescription의 값은 기본 텍스트로 볼 수 MAY 있다. TD 문서에 titletitles, 또는 descriptiondescriptions가 존재하는 경우, 각 titledescription 멤버는 각각 대응하는 titlesdescriptions 멤버를 가져야 SHOULD 한다. 기본 텍스트의 언어는 기본 언어로 표시되며, 이는 보통 Thing Description 인스턴스 작성자가 설정한다.

{
    "@context": [
        "https://www.w3.org/ns/wot-next/td",
        { "@language": "de" }
    ],
    "title": "MeinDing",
    "titles": {
        "en": "MyThing",
        "de": "MeinDing",
        "ja": "私の物",
        "zh-Hans": "我的东西",
        "zh-Hant": "我的東西"
    },
    "description": "Menschenlesbare Informationen.",
    "descriptions": {
        "en": "Human readable information.",
        "de": "Menschenlesbare Informationen.",
        "ja": "人間が読むことができる情報",
        "zh-Hans": "人们可阅读的信息",
        "zh-Hant": "人們可閱讀的資訊"
    },
    // ...
    "properties": {
        "on": {
            "title": "An/Aus",
            "titles": {
                "en": "On/Off",
                "de": "An/Aus",
                "ja": "オンオフ",
                "zh-Hans": "开关",
                "zh-Hant": "開關" },
            "type": "boolean",
            "forms": [...]
        },
        "status": {
            "title": "Zustand",
            "titles": {
                "en": "Status",
                "de": "Zustand",
                "ja": "状態",
                "zh-Hans": "状态",
                "zh-Hant": "狀態" },
            "type": "object",
            // ...
            "forms": [...]
        }
    },
    // ...
}

기본 언어를 설정하는 또 다른 가능성은 HTTP의 Accept-Language 헤더 필드와 같은 언어 협상 메커니즘을 통하는 것이다. 기본 언어가 협상된 경우, 협상의 결과와 반환된 콘텐츠의 해당 기본 언어를 나타내기 위해 @language 멤버가 존재해야 MUST 한다. 기본 언어가 성공적으로 협상된 경우, TD 문서는 titlesdescriptions 멤버의 MultiLanguage 객체보다 titledescription 멤버에 적절하게 일치하는 값을 포함하는 것이 SHOULD 좋다. 그러나 Things는 그러한 동적으로 생성된 TD를 지원하지 않거나 언어 협상을 지원하지 않도록 선택할 수 MAY 있다는 점에 유의하라(예: 리소스 제약 때문에).

TD의 문자열이 HTML 렌더링 문맥에서 표시된다는 보장은 없다. 실제로 11.5 Script Injection에 설명된 XSS 보안 위험을 완화하기 위해, TD에서 가져온 문자열에 포함된 HTML 태그는 이러한 문자열을 웹 페이지나 웹 애플리케이션에 삽입하는 애플리케이션에서 sanitize되어야 한다(따라서 HTML로 해석되지 않아야 한다). 그러므로 문자열 안에 삽입된 HTML은 텍스트 렌더링 방향을 지정하기 위한 적절한 메커니즘이 아니다.

6.3.3 version

VersionInfo의 인스턴스에 있는 모든 이름-값 쌍 중, 이름이 VersionInfoSignature에 포함된 Vocabulary Term인 것은, 그 Vocabulary Term을 이름으로 하는 JSON 멤버로 직렬화되어야 MUST 한다.

버전 정보 객체의 TD 스니펫은 아래에 제공된다:

{
    // ...
    "version": { "instance": "1.2.1" },
    // ...
}

version 멤버는 TD Context Extensions를 기반으로 추가적인 애플리케이션 및/또는 장치별 버전 정보를 위한 컨테이너로 의도된다. 자세한 내용은 7.1 Semantic Annotations를 참조하라.

6.3.4 securityDefinitionssecurity

Thing 인스턴스에서 securityDefinitions에 할당된 값은 SecurityScheme 인스턴스들의 Map이다. SecurityScheme 인스턴스들의 Map에 있는 모든 이름-값 쌍은 그 Map을 직렬화한 결과인 JSON 객체의 멤버로 직렬화되어야 MUST 한다. 쌍의 이름은 JSON 문자열로 직렬화되어야 MUST 하며, 쌍의 값인 SecurityScheme 인스턴스는 JSON 객체로 직렬화되어야 MUST 한다.

SecuritySchemeSubclasses 중 하나의 인스턴스에 있는 모든 이름-값 쌍 중, 이름이 그 SubclassSignature 또는 SecuritySchemeSignature에 포함된 Vocabulary Term인 것은, SecurityScheme Subclass의 인스턴스를 직렬화한 결과인 JSON 객체의 멤버로, 그 Vocabulary Term을 이름으로 하여 직렬화되어야 MUST 한다.

다음 TD 스니펫은 헤더에서 basic 사용자 이름/비밀번호 authentication을 지정하는 간단한 보안 구성을 보여 준다. in에 주어진 값은 실제로 Default Value (header)이며 생략할 수도 있다. 이름이 지정된 보안 구성(basic_sc)은 securityDefinitions map에 주어진다. 이 예에서 그 정의는 security 멤버 안에 그 JSON 이름을 포함함으로써 활성화된다.

{
    // ...
    "securityDefinitions": {
        "basic_sc": {
            "scheme": "basic",
            "in": "header"
        }
    },
    "security": "basic_sc",
    // ...
}

TD의 보안 구성은 필수이다. 적어도 하나의 보안 정의가 Thing level (즉, TD 루트 객체)에서 security 멤버를 통해 활성화되어야 MUST 한다. 이 구성은 Thing과 상호작용하는 데 필요한 기본 보안 메커니즘으로 볼 수 있다. 보안 정의는 form 객체에 security 멤버를 포함함으로써 form elements 수준에서도 활성화될 수 MAY 있으며, 이는 Thing level에서 활성화된 모든 정의를 재정의한다 (즉, 완전히 대체한다).

nosec 보안 스킴은 보안이 필요하지 않은 경우를 위해 제공된다. Thing의 최소 보안 구성은 다음 예에 표시된 것처럼 Thing level에서 nosec 보안 스킴을 활성화하는 것이다:

{
    "@context": "https://www.w3.org/ns/wot-next/td",
    "id": "urn:uuid:e9ecb6ad-cd4c-481b-96ce-5b4c57ddb844",
    "title": "MyThing",
    "description": "Human readable information.",
    "support": "https://servient.example.com/contact",
    "securityDefinitions": { "nosec_sc": { "scheme": "nosec" }},
    "security": "nosec_sc",
    "properties": {/*...*/},
    "actions": {/*...*/},
    "events": {/*...*/},
    "links": [/*...*/]
}
6.3.4.1 여러 보안 정의

좀 더 복잡한 예를 들면, 하나를 제외한 모든 Interaction Affordances가 basic authentication을 요구하고, 그 하나에는 authentication이 필요하지 않은 Thing이 있다고 가정하자. status Property와 toggle Action의 경우 basic authentication이 필요하며 Thing level에서 정의된다. 그러나 overheating Event의 경우 authentication이 필요하지 않으므로, 보안 구성이 form level에서 재정의된다.

{
    // ...
    "securityDefinitions": {
        "basic_sc": {"scheme": "basic"},
        "nosec_sc": {"scheme": "nosec"}
    },
    "security": "basic_sc",
    // ...
    "properties": {
        "status": {
            // ...
            "forms": [{
                "href": "https://mylamp.example.com/status"
            }]
        }
    },
    "actions": {
        "toggle": {
            // ...
            "forms": [{
                "href": "https://mylamp.example.com/toggle"
            }]
        }
    },
    "events": {
        "overheating": {
            // ...
            "forms": [{
                "href": "https://mylamp.example.com/oh",
                "security": "nosec_sc"
            }]
        }
    }
}

TD는 보안 스킴의 조합도 지정할 수 있다. 아래는 proxy에서 digest authentication을 사용하고, Thing에서 bearer token authentication을 결합한 TD 스니펫이다. digest 스킴에서 inDefault Value (즉, header)는 생략되지만 여전히 적용된다. 성공적으로 상호작용하려면 username/password 및 tokens와 같은 해당 비공개 보안 구성이 Consumer에서 구성되어야 한다는 점에 유의하라. 여러 보안 정의를 활성화할 때, security 멤버는 배열이 된다.

{
    // ...
    "securityDefinitions": {
        "proxy_sc": {
            "scheme": "digest",
            "proxy": "https://portal.example.com/"
        },
        "bearer_sc": {
            "scheme": "bearer",
            "in": "header",
            "format": "jwt",
            "alg": "ES256",
            "authorization": "https://servient.example.com:8443/"
        }
    },
    "security": ["proxy_sc", "bearer_sc"],
    // ...
}

그러나 security 요소에서 여러 요소를 가진 배열을 사용하여 보안 스킴을 결합하는 것은 이제 deprecated되었으며, 대신 ComboSecurityScheme을 사용해야 SHOULD 한다. 다음 예는 위 예와 정확히 동일하며, 이를 보여 준다:

{
    // ...
    "securityDefinitions": {
        "proxy_sc": {
            "scheme": "digest",
            "proxy": "https://portal.example.com/"
        },
        "bearer_sc": {
            "scheme": "bearer",
            "in": "header",
            "format": "jwt",
            "alg": "ES256",
            "authorization": "https://servient.example.com:8443/"
        },
        "combo_sc": {
            "scheme": "combo",
            "allOf": ["proxy_sc", "bearer_sc"]
        }
    },
    "security": "combo_sc",
    // ...
}
6.3.4.2 Forms 안의 security

보안 구성은 같은 Interaction Affordance 안의 서로 다른 forms에 대해서도 지정할 수 있다. 이는 예를 들어 HTTP와 CoAP [RFC7252]처럼 서로 다른 보안 메커니즘을 지원하는 여러 프로토콜을 지원하는 장치에 필요할 수 있다. 대체 authentication 메커니즘이 허용될 때도 유용하다. 다음은 Property affordance를 활성화하는 세 가지 가능한 방법, 즉 basic authentication이 있는 HTTPS, digest authentication, bearer token authentication을 보여 주는 TD 스니펫이다. 다시 말해, 여러 forms 안에서 서로 다른 보안 구성을 사용하는 것은 보안 메커니즘을 "OR" 방식으로 결합하는 방법을 제공한다. 반대로 같은 security 멤버 안에 여러 보안 구성을 넣으면, 그 경우 Interaction Affordance의 활성화를 허용하기 위해 그것들이 모두 만족되어야 하므로 "AND" 방식으로 결합된다. Thing level에서 하나의 (기본) 구성을 활성화하는 것은 여전히 필수임에 유의하라.

{
    // ...
    "securityDefinitions": {
        "basic_sc": { "scheme": "basic" },
        "digest_sc": { "scheme": "digest" },
        "bearer_sc": { "scheme": "bearer" }
    },
    "security": "basic_sc",
    // ...
    "properties": {
        "status": {
            // ...
            "forms": [{
                "href": "https://mylamp.example.com/status"
            }, {
                "href": "https://mylamp.example.com/status",
                "security": "digest_sc"
            }, {
                "href": "https://mylamp.example.com/status",
                "security": "bearer_sc"
            }]
        }
    },
    // ...
}
6.3.4.3 ComboSecurityScheme

이 경우 중복을 피하기 위해, 예를 들어 form 요소의 세부 정보를 반복하는 대신, oneOf가 있는 ComboSecurityScheme을 사용할 수 있다.

{
    // ...
    "securityDefinitions": {
        "basic_sc": { "scheme": "basic" },
        "digest_sc": { "scheme": "digest" },
        "bearer_sc": { "scheme": "bearer" },
        "combo_sc": {
            "scheme": "combo",
            "oneOf": [ "basic_sc", "digest_sc", "bearer_sc" ]
        }
    },
    "security": "combo_sc",
    // ...
    "properties": {
        "status": {
            // ...
            "forms": [{
                "href": "https://mylamp.example.com/status"
            }]
        }
    },
    // ...
}
6.3.4.4 OAuth 2.0 사용

또 다른 더 복잡한 예로, OAuth 2.0은 scopes를 사용한다. 이는 tokens 안에 나타날 수 있는 식별자이며, 해당 리소스 (또는 W3C WoT의 경우 Interaction Affordance)에 대한 접근을 허용하려면 리소스의 대응 식별자와 일치해야 한다. 예를 들어 다음에서 status Property는 scope limited를 포함하는 bearer tokens를 사용하는 Consumers가 읽을 수 있지만, configure Action은 special scope를 포함하는 token으로만 호출될 수 있다. Scopes는 roles와 동일하지 않지만 종종 관련된다. 예를 들어 아마도 administrative role에 있는 사람만 "special" 상호작용을 수행할 권한을 가질 수 있다. Tokens는 둘 이상의 scope를 가질 수 있으며, 전용 web services가 사용자에게 발급한다. 이 예에서 관리자는 limitedspecial scope를 모두 가진 tokens를 발급받을 수 있고, 일반 사용자는 limited scope를 가진 tokens를 제공받을 수 있다.

{
    // ...
    "securityDefinitions": {
        "oauth2_sc": {
            "scheme": "oauth2",
            "flow": "client",
            "token": "https://example.com/token",
            "scopes": ["limited", "special"]
        }
    },
    "security": "oauth2_sc",
    // ...
    "properties": {
        "status": {
            // ...
            "forms": [{
                "href": "https://scopes.example.com/status",
                "scopes": ["limited"]
            }]
        }
    },
    "actions": {
        "configure": {
            // ...
            "forms": [{
                "href": "https://scopes.example.com/configure",
                "scopes": ["special"]
            }]
        }
    },
    // ...
}
6.3.4.5 API key 사용

Thing은 Consumer가 Thing과 상호작용하기 위해 API key를 요구하게 되는 onboarding 프로세스를 요구할 수 있다. 이 API key는 API key 스킴이 지정하는 여러 방식으로 Thing에 대한 요청에 포함될 수 있다. 아래는 Consumer가 HTTPS 요청을 보낼 때 URI 안에서 API key를 대체해야 하는 URI template으로 API key를 사용할 수 있는 방법의 예이다.

{
    // ...
    "securityDefinitions": {
        "apikey_key": {
            "scheme": "apikey",
            "in": "uri",
            "name": "adminKey"
        }
    },
    "security": "apikey_key",
    "properties": {
        "status": {
            // ...
            "forms": [{
                "href": "https://example.com/{adminKey}/status",
                // ...
            }]
        }
    },
    // ...
}

위에 표시된 URI templates 예에 더해 ComboSecurityScheme 사용의 또 다른 예를 들면, client ID와 cloud service provider가 제공하는 "secret" key가 모두 URL 안에 삽입되어야 하는 보안 스킴이 있다고 가정하자. 기술적으로는 key만 실제로 secret이며 out-of-band로 처리되어야 하고, secret이 아닌 client ID는 TD에 삽입될 수도 있다. 그러나 client ID를 쉽게 교체할 수 없다면 개인정보 보호를 강화하기 위해 TD에 삽입하는 것을 피하고 싶을 수 있다. 이 경우 in 위치 지정자에 대해 모두 uri 값을 사용하는 APIKeySecurityScheme 두 인스턴스를 결합하여 두 개의 URI 변수를 선언할 수 있다. 그런 다음 이 변수들은 보안 스킴이 활성인 Formhref에서 사용될 수 있다(사실 반드시 사용되어야 한다). 예는 다음과 같다:

{
    // ...
    "securityDefinitions": {
        "apikey_key": {
            "scheme": "apikey",
            "in": "uri",
            "name": "secKey"
        },
        "apikey_id": {
            "scheme": "apikey",
            "in": "uri",
            "name": "secClientID"
        },
        "apikey_combo": {
            "scheme": "combo",
            "allOf": ["apikey_key","apikey_id"]
        }
    },
    "security": "apikey_combo",
    // ...
    "properties": {
        "status": {
            // ...
            "forms": [{
                "href": "https://example.com/{secClientID}/status/{secKey}",
                // ...
            }]
        }
    },
    // ...
}

이 예에는 표시되어 있지 않지만, uriVariables를 사용하여 추가 URI template 변수를 선언하고 같은 URI template에 포함하는 것은 적법하다. 다만 이름은 보안 스킴에서 선언된 이름과 충돌할 수 없다. 위 예에서처럼 보안 스킴에서 선언된 URI 변수에 특정 접두사를 사용하면 이름 충돌을 피하기가 더 쉬워질 수 있다.

본문 안의 API Key: 일부 시스템에서는 보안 매개변수가 payload와 함께 포함될 수도 있다. 예를 들어 어떤 시스템이 모든 payload가 auth라는 이름의 멤버를 포함하는 JSON 객체여야 하며, 그 값은 access key를 포함하는 key라는 멤버를 가진 객체여야 한다고 요구한다고 가정하자. 그러나 상호작용에 따라 JSON 객체의 다른 요소들은 달라질 수 있다. 이러한 상황은 body 보안 정보 위치를 사용하여 처리할 수 있다. 이 위치의 경우 name 매개변수는 실제로, 바인딩되는 각 상호작용에 대한 DataSchema의 루트에 상대적으로 평가되는 JSON pointer이므로, 다른 측면에서 달라지는 payload와 함께 사용할 수 있다는 점에 유의하라. 예로, 밝기와 색상을 설정하는 property와 켜기 및 끄기를 위한 두 개의 별도 actions가 있는 조명이 있다고 하자. 이러한 actions의 JSON payload가 서로 다르더라도 /auth/key 요소는 같은 상대 위치에 나타나므로 단일 JSON pointer를 사용할 수 있다. 참고: 보안 key가 서로 일관되지 않은 다른 위치에 나타나는 경우, 여러 보안 스킴 정의를 사용해야 한다.

{
    // ...
    "securityDefinitions": {
        "apikey_body": {
            "scheme": "apikey",
            "in": "body",
            "name": "/auth/key"
        }
    },
    "security": "apikey_body",
    // ...
    "properties": {
        "color": {
            // ...
            "type": "object",
            "properties": {
                "brightness": {
                    "type": "number",
                    // ...
                },
                "rgb": {
                    "type": "array",
                    // ...
                },
                "auth": {
                    "type": "object",
                    "properties": {
                        "key": {
                           "type": "string"
                        }
                    },
                    "required": ["key"]
                }
            },
            "required": ["brightness", "rgb", "auth"],
            "forms": [{
                "href": "https://example.com/color",
                // ...
            }]
        }
    },
    "action": {
        "on": {
            // ...
            "input": {
                "auth": {
                    "type": "object",
                    "properties": {
                        "key": {
                           "type": "string"
                        }
                    },
                    "required": ["key"]
                }
            },
            "required": ["auth"],
            "forms": [{
                "href": "https://example.com/on",
                // ...
            }]
        },
        "off": {
            // ...
            "input": {
                "auth": {
                    "type": "object",
                    "properties": {
                        "key": {
                           "type": "string"
                        }
                    },
                    "required": ["key"]
                }
            },
            "required": ["auth"],
            "forms": [{
                "href": "https://example.com/off",
                // ...
            }]
        }
    },
    // ...
}
그러나 모든 데이터 스키마에 보안 정보를 추가하는 것은 상당히 번거롭고 중복적이다. body 위치에서 JSON pointer가 참조하는 위치가 존재하지 않을 경우 자동으로 삽입되는 기능을 사용하면 이 예를 단순화할 수 있다. 이 경우 위 예는 다음과 같이 단순화될 수 있다. 실제로는 보안 정보만 담기 위해 onoff actions에 대한 data schema가 효과적으로 생성된다는 점에 유의하라.
{
    // ...
    "securityDefinitions": {
        "apikey_body": {
            "scheme": "apikey",
            "in": "body",
            "name": "/auth/key"
        }
    },
    "security": "apikey_body",
    // ...
    "properties": {
        "color": {
            // ...
            "type": "object",
            "properties": {
                "brightness": {
                    "type": "number",
                    // ...
                },
                "rgb": {
                    "type": "array",
                    // ...
                }
            },
            "required": ["brightness", "rgb"],
            "forms": [{
                "href": "https://example.com/color",
                // ...
            }]
        }
    },
    "action": {
        "on": {
            // ...
            "required": ["auth"],
            "forms": [{
                "href": "https://example.com/on",
                // ...
            }]
        },
        "off": {
            // ...
            "forms": [{
                "href": "https://example.com/off",
                // ...
            }]
        }
    },
    // ...
}

6.3.5 properties

Thing 인스턴스에서 properties에 할당된 값은 PropertyAffordance 인스턴스들의 Map이다. PropertyAffordance 인스턴스들의 Map에 있는 모든 이름-값 쌍은 그 Map을 직렬화한 결과인 JSON 객체의 멤버로 직렬화되어야 MUST 한다. 쌍의 이름은 JSON 문자열로 직렬화되어야 MUST 하며, 쌍의 값인 PropertyAffordance 인스턴스는 JSON 객체로 직렬화되어야 MUST 한다.

PropertyAffordance의 인스턴스에 있는 모든 이름-값 쌍 중, 이름이 PropertyAffordance, InteractionAffordance 또는 DataSchemaSignatures 중 하나에 포함된 Vocabulary Term인 것은, PropertyAffordance 인스턴스를 직렬화한 결과인 JSON 객체의 멤버로, 그 Vocabulary Term을 이름으로 하여 직렬화되어야 MUST 한다. DataSchema 인스턴스 직렬화에 대한 자세한 내용은 6.3.10 Data Schemas를 참조하라.

PropertyAffordance의 인스턴스에서 forms에 할당된 값은 6.3.9 forms에서 정의된 하나 이상의 JSON 객체 직렬화를 포함하는 JSON 배열로 직렬화되어야 MUST 한다.

두 개의 Property affordances에 대한 스니펫은 아래에 제공된다:

6.3.6 actions

Thing 인스턴스에서 actions에 할당된 값은 ActionAffordance 인스턴스들의 Map이다. ActionAffordance 인스턴스들의 Map에 있는 모든 이름-값 쌍은 그 Map을 직렬화한 결과인 JSON 객체의 멤버로 직렬화되어야 MUST 한다. 쌍의 이름은 JSON 문자열로 직렬화되어야 MUST 하며, 쌍의 값인 ActionAffordance 인스턴스는 JSON 객체로 직렬화되어야 MUST 한다.

ActionAffordance의 인스턴스에 있는 모든 이름-값 쌍 중, 이름이 ActionAffordance 또는 InteractionAffordanceSignatures 중 하나에 포함된 Vocabulary Term인 것은 ActionAffordance 인스턴스를 직렬화한 결과인 JSON 객체의 멤버로, 그 Vocabulary Term을 이름으로 하여 직렬화되어야 MUST 한다.

ActionAffordance의 인스턴스에서 inputoutput에 할당된 값은 JSON 객체로 직렬화되어야 MUST 한다. 이들은 Class DataSchema에 의존하며, 그 직렬화는 6.3.10 Data Schemas에서 정의된다.

ActionAffordance의 인스턴스에서 forms에 할당된 값은 6.3.9 forms에서 정의된 하나 이상의 JSON 객체 직렬화를 포함하는 JSON 배열로 직렬화되어야 MUST 한다.

Action affordance의 TD 스니펫은 아래에 제공된다:

6.3.7 events

Thing 인스턴스에서 events에 할당된 값은 EventAffordance 인스턴스들의 map이다. EventAffordance 인스턴스들의 Map에 있는 모든 이름-값 쌍은 그 Map을 직렬화한 결과인 JSON 객체의 멤버로 직렬화되어야 MUST 한다. 쌍의 이름은 JSON 문자열로 직렬화되어야 MUST 하며, 쌍의 값인 EventAffordance 인스턴스는 JSON 객체로 직렬화되어야 MUST 한다.

EventAffordance의 인스턴스에 있는 모든 이름-값 쌍 중, 이름이 EventAffordance 또는 InteractionAffordanceSignatures 중 하나에 포함된 Vocabulary Term인 것은 EventAffordance 인스턴스를 직렬화한 결과인 JSON 객체의 멤버로, 그 Vocabulary Term을 이름으로 하여 직렬화되어야 MUST 한다.

EventAffordance의 인스턴스에서 subscription, data, 그리고 cancellation에 할당된 값은 JSON 객체로 직렬화되어야 MUST 한다. 이들은 Class DataSchema에 의존하며, 그 직렬화는 6.3.10 Data Schemas에서 정의된다.

EventAffordance의 인스턴스에서 forms에 할당된 값은 6.3.9 forms에서 정의된 하나 이상의 JSON 객체 직렬화를 포함하는 JSON 배열로 직렬화되어야 MUST 한다.

Event 객체의 TD 스니펫은 아래에 제공된다:

Event affordances는 기존의(예: WebSub [websub]) 또는 고객 지향 event 메커니즘(예: Webhooks)을 채택하기 위해 유연한 방식으로 정의되어 있다. 이런 이유로 subscriptioncancellation은 원하는 메커니즘에 따라 정의할 수 있다. 자세한 내용은 [WOT-BINDING-TEMPLATES]에서 확인할 수 있다. 예 A.3 Webhook Event Example는 Events가 Webhooks를 설명하기 위해 subscriptioncancellation을 사용하는 방법을 보여 준다.

6.3.9 forms

Form의 인스턴스에 있는 모든 이름-값 쌍 중, 이름이 FormSignature에 포함된 Vocabulary Term인 것은, Form 인스턴스를 직렬화한 결과인 JSON 객체의 멤버로, 그 Vocabulary Term을 이름으로 하여 직렬화되어야 MUST 한다.

필요한 경우, form 객체는 접두사로 식별되는 프로토콜별 Vocabulary Terms로 보완될 수 MAY 있다. 8.1.1 Protocol Bindings도 참조하라.

forms 배열 안의 form 객체에 대한 TD 스니펫은 아래에 제공된다:

6.3.9.1 uriVariables

hrefhttp://example.org/weather/?lat=35&lon=139latlon과 같은 동적 변수를 포함하는 URI를 담을 수도 있다. 이 경우 URI는 [RFC6570]에 정의된 template으로 정의될 수 있다: http://example.org/weather/{?lat,long}.

그러한 경우, URI Template 변수는 Thing level 또는 Interaction Affordance level에서 관련된(고유한) 변수 이름을 JSON 이름으로 사용하여 JSON 객체 기반 uriVariables 멤버에 수집되어야 MUST 한다.

Form의 인스턴스에서 uriVariables에 할당된 map의 각 값의 직렬화는 Class DataSchema에 의존해야 MUST 하며, 그 직렬화는 6.3.10 Data Schemas에서 정의된다.

query parameters를 위한 URI Template과 Interaction Affordance level의 uriVariables를 사용하는 TD 스니펫은 아래에 제공된다:

{
    "@context": ["https://www.w3.org/ns/wot-next/td", {
        "htv": "http://www.w3.org/2011/http#"
    }],
    // ...
    "properties": {
        "weather": {
            // ...
            "uriVariables": {
                "lat": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 90,
                    "description": "Latitude for the desired location in the world" },
                "long": {
                    "type": "number",
                    "minimum": -180,
                    "maximum": 180,
                    "description": "Longitude for the desired location in the world" }
            },
            "forms": [{
              "href": "http://example.org/weather/{?lat,long}",
              "htv:methodName": "GET"
            }]
        },
        // ...
    },
    // ...
}

또는 [RFC6570]에 정의된 것처럼, uriVariableshref 구조를 대체하는 데 사용할 수 있다. 콜롬비아 보고타의 예보를 가져오기 위한 유효한 요청이 http://example.org/weather/bogota에 대한 HTTP GET 요청이 되는 TD 예가 아래에 제공된다:

{
    "@context": ["https://www.w3.org/ns/wot-next/td", {
        "htv": "http://www.w3.org/2011/http#"
    }],
    // ...
    "properties": {
        "weather": {
            // ...
            "uriVariables": {
                "city": {
                    "type": "string",
                    "description": "City name to find the weather information for"
                }
            },
            "forms": [{
                "href": "http://example.org/weather/{city}",
                "htv:methodName": "GET"
            }]
        },
        // ...
    },
    // ...
}

아래 두 예는 동일한 uriVariables 기능을 사용하면서 결합될 수도 있다. http://example.org/weather/bogota/?unit=Celsius에 대한 HTTP GET 요청은 다음과 같이 설명될 수 있다:

{
    "@context": ["https://www.w3.org/ns/wot-next/td", {
        "htv": "http://www.w3.org/2011/http#"
    }],
    // ...
    "properties": {
        "weather": {
            // ...
            "uriVariables": {
                "city": {
                    "type": "string",
                    "description": "City name to find the weather information for"
                },
                "unit": {
                    "type": "string",
                    "enum": ["fahrenheit_value","celsius_value"],
                    "description": "Desired unit for the temperature value"
                }
            },
            "forms": [{
                "href": "http://example.org/weather/{city}/{?unit}",
                "htv:methodName": "GET"
            }]
        },
        // ...
    },
    // ...
}

uriVariables는 주로 properties와 events를 위한 것이다. 기존 시스템을 개조할 때는 actions에 uriVariables를 사용해야 할 수도 있다. 일반적으로 새로운 WoT 기반 시스템을 설계할 때는 uriVariables 사용을 가능한 한 피하는 것이 권장된다.

6.3.9.2 contentType

contentType 멤버는 ; 문자로 구분된 attribute-value 쌍으로 media type parameters를 포함하는 media type [RFC2046]을 할당하는 데 사용된다. 예:

{
    // ...
    "contentType": "text/plain; charset=utf-8",
    // ...
}
6.3.9.3 response

일부 사용 사례에서 Interaction Affordance의 form metadata는 request를 설명할 뿐 아니라 예상 response에 대한 metadata도 제공한다. 예를 들어 Action takePhoto는 request payload에 JSON을 사용하여 카메라의 parameter settings(aperture priority, timer 등)를 제출하기 위한 input schema를 정의한다(즉, "contentType": "application/json"). 이 action의 output은 촬영된 사진이며, 예를 들어 JPEG 형식으로 제공된다. 이러한 경우 response 멤버는 response payload의 표현 형식을 나타내는 데 사용된다(예: "contentType": "image/jpeg"). 여기서는 content type이 표현 형식을 완전히 지정하므로 output schema가 필요하지 않다.

위에서 설명한 takePhoto Action을 기반으로 response 멤버가 있는 form 스니펫은 아래에 표시된다:

{
    // ...
    "actions": {
        "takePhoto": {
            // ...
            "forms": [{
                "op": "invokeaction",
                "href": "http://camera.example.com/api/snapshot",
                "contentType": "application/json",
                "response": {
                    "contentType": "image/jpeg"
                }
            }]
        }
    },
    // ...
}

responses가 payload를 포함할 것으로 예상되지 않으며 따라서 contentType도 없는 경우, 빈 response 객체를 사용하여 이 정보를 전달할 수 있다.

{
    // ...
    "actions": {
        "brewCoffee": {
            "description": "Invoking this action does not return a payload.",
            "input": {
              "type": "object",
              "properties": {
                "coffeeType": {
                  "enum": [
                    "espresso",
                    "americano",
                    "cappuccino",
                    "latte"
                  ]
                },
                "useOatMilk": {
                  "type": "boolean",
                  "default": false
                }
              },
              "required": [
                "coffeeType"
              ]
            },
            "forms": [{
                "op": "invokeaction",
                "href": "http://coffee-maker.example.com/brew-coffee",
                "contentType": "application/json",
                "response": {}
            }]
        }
    },
    // ...
}
6.3.9.4 additionalResponses

어떤 경우에는 Interaction Affordance의 일부로 Thing으로부터 받은 message가 여러 이유로 달라질 수 있다. 그러한 이유에는 오류 사례나 유효한 response에 대한 대체 responses가 포함될 수 있다. 이러한 경우 additionalResponses terms를 사용하여 이 동작을 설명할 수 있다.

예를 들어 자동차 엔진을 켜는 Action Affordance는 악천후 조건이나 엔진에 유지보수가 필요한 경우 작동하지 않을 수 있다. 그러한 경우 Thing은 일반적으로 사용되지 않는 payload로 응답해야 한다.

Action Affordance 안에 additionalResponses 멤버가 있는 TD 스니펫은 아래에 표시된다. 첫 번째 요소는 output에 설명된 것과 다른 payload로 error response를 보낼 수 있는 위에서 언급한 경우를 보여 준다. 값이 falsesuccess는 이 payload가 오류 사례를 가리킨다는 사실을 나타내며, schemaschemaDefinitions에서 사용된 payload 설명에 연결할 수 있게 한다. additionalResponses 안의 두 번째 요소도 error response를 설명하지만, 이번에는 response에 payload가 없다.

{
    // ...
    "schemaDefinitions": {
      "actionErrorPayload": {
        "type": "object",
        "properties": {
          "reason": {
            "type": "string",
            "enum": ["cold","hot","maintenance"]
          },
          "timeStamp": {
            "description": "UNIX time in numbers indicating when the error happened",
            "type": "number"
          }
        }
      }
    },
    // ...
    "actions": {
        "startEngine": {
            "output": {
              "type": "string"
            },
            "forms": [{
                "op": "invokeaction",
                "href": "http://mycar.example.com/api/engine",
                "contentType": "application/json",
                "additionalResponses": [
                  {
                    "success": false,
                    "contentType": "application/json",
                    "schema": "actionErrorPayload"
                  },
                  {
                    "success": false
                  },
                ]
            }]
        }
    },
    // ...
}

additionalResponses term은 오류가 아닌 경우에도 사용할 수 있다. 이 경우 successtrue로 설정되고, 다른 schema를 사용하여 payload를 설명할 수 있다.

6.3.9.5 contentMediaTypecontentEncoding

어떤 경우에는 binary data가 text-based values 안에 삽입된다. 예를 들어 JSON string-based value가 base64로 인코딩된 이미지를 포함할 수 있다. contentMediaTypecontentEncoding terms는 이러한 이름-값 쌍의 문맥과 인코딩 형식을 명확히 하는 데 사용할 수 있다. contentMediaTypecontentEncoding의 사용 샘플은 아래에 표시된다:

{
    // ...
    "properties": {
        "image": {
                "description": "Provides latest image",
                "type": "string",
                "contentMediaType": "image/png",
                "contentEncoding": "base64",
                "forms": [{
                            "op": "readproperty",
                            "href": "coaps://mylamp.example.com/lastPicture",
                            "cov:methodName": "GET",
                            "contentType": "application/json"
                    }]
        }
    },
    // ...
}
6.3.9.6 Top level forms

forms가 top level에 존재할 때, 이는 Thing이 제공하는 meta interactions를 설명하는 데 사용할 수 있다. 예를 들어 operation types readallpropertieswriteallpropertiesConsumers가 모든 properties를 한 번에 읽거나, 쓰거나, 관찰할 수 있게 하는 Thing과의 meta interactions를 위한 것이다. 아래 예에서 forms 멤버는 TD 루트 객체에 포함되어 있으며, Consumer는 submission target https://mylamp.example.com/properties를 사용하여 단일 프로토콜 transaction 안에서 Thing의 모든 Properties (즉, on, brightness, 그리고 timer)를 읽거나 쓸 수 있다.

{
    // ...
    "properties": {
        "on": {
            "type": "boolean",
            "forms": [...]
        },
        "brightness": {
            "type": "number",
            "forms": [...]
        },
        "timer": {
            "type": "integer",
            "forms": [...]
        }
    },
    // ...
    "forms": [{
        "op": "readallproperties",
        "href": "https://mylamp.example.com/properties",
        "contentType": "application/json",
        "htv:methodName": "GET"
    },
    {
        "op": "writeallproperties",
        "href": "https://mylamp.example.com/properties",
        "contentType": "application/json",
        "htv:methodName": "PUT"
    }]
}

Thing-level uriVariables는 여기서 operation에 추가 변수를 제공하거나 readmultipleproperties operation을 위한 Property Affordance 이름 목록을 지정하는 데 사용할 수 있다. 아래 예에서 properties의 unit은 그러한 변수를 통해 설정할 수 있으며, 원하는 properties 목록도 설정할 수 있다:

{
    // ...
    "properties": {
        "temperature": {
            "type": "number",
            "forms": [...]
        },
        "brightness": {
            "type": "number",
            "forms": [...]
        },
        "humidity": {
            "type": "integer",
            "forms": [...]
        }
    },
    "uriVariables": {
        "propertyNames": {
            "type": "string",
            "description": "Comma separated list of property names to select."
        },
        "unitSystem": {
            "type": "string",
            "enum": ["metric","imperial","uscustomary"],
            "description": "System of Measurement that will be used for the values"
        }
    },
    "forms": [{
        "op": "readallproperties",
        "href": "https://mything.example.com/properties{?unitSystem}",
        "contentType": "application/json",
        "htv:methodName": "GET"
    },
    {
        "op": "readmultipleproperties",
        "href": "https://mylamp.example.com/properties{?propertyNames,unitSystem}",
        "contentType": "application/json",
        "htv:methodName": "GET"
    }]
}

readmultipleproperties operation의 경우, URI https://mylamp.example.com/properties?propertyNames=humidity,temperature&unitSystem=metric에 대한 HTTP GET 요청 예는 metric System of Measurement와 함께 humiditytemperature Property Affordances의 값을 반환할 것이다.

operation type writeallproperties의 경우, Consumer가 모든 쓰기 가능한 (non readOnly) properties와 (새로) 할당된 값을 제공할 것으로 기대된다(예: payload 안에서). 마찬가지로 writemultipleproperties operation type의 경우, Consumer가 쓰기 가능한 (non readOnly) properties를 제공할 것으로 기대된다. Thing 측에서는, Thingreadmultiplepropertiesreadallproperties operation types의 경우 읽을 수 있는 (non writeOnly) properties를 반환할 것으로 기대된다.

6.3.10 Data Schemas

DataSchema Class를 통해 정의된 WoT Thing Description의 data schemas는 JSON Schema terms [JSON-SCHEMA]의 부분집합을 기반으로 한다. 따라서 TD data schemas의 직렬화는 Things와 교환되는 데이터를 검증하기 위해 JSON Schema validator 구현에 직접 전달될 수 있다.

Data schema serialization은 PropertyAffordance 인스턴스, ActionAffordance 인스턴스에서 inputoutput에 할당된 값, EventAffordance 인스턴스에서 subscription, data, 그리고 cancellation에 할당된 값, 그리고 Subclasses of InteractionAffordance의 인스턴스에서 uriVariables에 할당된 값(form object가 URI Template을 사용할 때)에 적용된다.

DataSchemaSubclasses 중 하나의 인스턴스에 있는 모든 이름-값 쌍 중, 이름이 그 SubclassSignature 또는 DataSchemaSignature에 포함된 Vocabulary Term인 것은 DataSchema Subclass의 인스턴스를 직렬화한 결과인 JSON 객체의 멤버로, 그 Vocabulary Term을 이름으로 하여 직렬화되어야 MUST 한다.

ObjectSchema의 인스턴스에서 properties에 할당된 값은 JSON 객체로 직렬화되어야 MUST 한다.

DataSchema의 인스턴스에서 enum, required, 그리고 oneOf에 할당된 값은 JSON 배열로 직렬화되어야 MUST 한다.

ArraySchema의 인스턴스에서 items에 할당된 값은 JSON 객체 또는 JSON 객체를 포함하는 JSON 배열로 직렬화되어야 MUST 한다.

Data schema 멤버의 TD 스니펫은 아래에 제공된다. 주변 객체는 data schema object(예: inputoutput의 경우)일 수도 있고, 추가 멤버를 포함하는 Property object일 수도 있다는 점에 유의하라.

readOnlywriteOnly terms는 읽기 상호작용(즉, Property를 읽을 때)에서 어떤 데이터 항목이 교환되고, 쓰기 상호작용(즉, Property를 쓸 때)에서 어떤 데이터 항목이 교환되는지를 신호하는 데 사용할 수 있다. 이는 기존 장치나 서비스를 Thing Description으로 보강할 때처럼, 관례적이지 않은 Thing의 Properties가 읽기와 쓰기에 대해 서로 다른 데이터를 나타내는 경우 workaround로 사용할 수 있다.

readOnlywriteOnly의 사용을 보여 주는 TD 스니펫은 아래에 제공된다:

{
    // ...
    "properties": {
        "status": {
            "description": "Read or write On/Off status.",
            "type": "object",
            "properties": {
                "latestStatus": {
                    "type": "string",
                    "enum": ["on_value", "off_value"],
                    "readOnly": true
                },
                "newStatusValue": {
                    "type": "string",
                    "enum": ["on_value", "off_value"],
                    "writeOnly": true
                }
            },
            "forms": [...]
        }
    }
    // ...
}

status Property를 읽을 때, status data는 payload 안의 latestStatus 멤버를 사용하여 반환된다. status Property를 업데이트하려면, 새 값이 payload 안의 newStatusValue 멤버를 통해 제공되어야 한다.

추가 기능으로, Thing Description 인스턴스는 data schemas 안에서 unit 멤버 사용을 허용한다. 이는 데이터 항목에 측정 단위를 연결하는 데 사용할 수 있다. 그 문자열 값은 자유롭게 선택할 수 있다. 그러나 잘 알려진 Vocabularies에 정의된 단위를 선택하는 것이 권장된다. 예는 7. TD Context Extensions를 참조하라.

6.4 식별

Thing Descriptions의 JSON 기반 직렬화는 media type application/td+json 또는 CoAP Content-Format ID 432로 식별된다 (13. IANA 고려사항 참조).

6.5 검증

여러 문맥에서 Thing Description의 JSON 기반 직렬화에 대한 자동 검증은 유용하다. 형식적으로, 유효한 TD는 이 명세의 모든 assertions를 만족하지만, 모든 assertions를 JSON 직렬화만으로 검증할 수 있는 것은 아니다. 예를 들어, TD를 그것이 설명하는 Thing의 동작과 관련짓는 9. 동작 Assertions 아래에 나열된 assertions가 그렇다. Extensions도 문제가 될 수 있는데, extension을 검증하기 위한 형식적 metadata가 제공되더라도 deployment에서 이 metadata를 동적으로 가져오는 것은 개인정보 보호 위험을 초래할 수 있기 때문이다. 따라서 이 섹션에서는 서로 다른 문맥에 적합한 다양한 검증 수준을 이름 붙이고 정의한다.

6.5.1 최소 검증

이 검증 수준은 이 문서의 규범 표에서 암시되는 모든 assertions와, TD 자체만을 살펴봄으로써 확인할 수 있는 assertions를 포함한다.

최소 검증은 검증이 자체 완결적이어야 하는 경우 (예: 격리된 네트워크의 장치)에 적합하다. 이는 context extensions와 vocabularies를 검증하려고 시도하지 않는다.

실제로 이러한 assertions는 JSON Schema와 몇 가지 spot check를 함께 사용하여 검증할 수 있다. 예를 들어 security schema 이름에 일치하는 정의가 있는지 확인하는 것이다.

6.5.2 기본 검증

이 검증 수준은 6.5.1 최소 검증에서 다루는 모든 것뿐 아니라 semantic definitions의 기본 검증도 포함한다.

기본 검증은 network access가 가능하고 개인정보 보호 위험을 초래하지 않으며, 비교적 제약이 적은 computing requirements를 가진 상황에 적합하다. 예를 들어 gateways에는 적합하지만 endpoints에는 적합하지 않다. semantic processing이 필요하기 때문이다. 이는 extensions의 기본 검증, 구체적으로 사용된 vocabulary가 정의되어 있는지 검증할 수 있다.

이 경우 context definition files와 SHACL definitions를 사용하여 추가 assertions를 검증하고 TD의 semantic consistency를 확인할 수 있다. 또한 extension vocabularies에 대한 context definitions와 SHACL constraints를 가져올 수 있다면, 이를 사용하여 extensions를 검증할 수 있다.

6.5.3 전체 검증

전체 검증은 TD가 그것이 설명하는 Thing과 일관됨을 확인하는 9. 동작 Assertions에 제공된 assertions를 포함하여, 이 문서의 모든 assertions가 만족되는지를 확인한다.

이 검증 수준은 개발 중, release 전, 그리고 가능하다면 installation 이후에 적합하다. 개발 중 검증은 test Things에서 이루어져야 한다. 그러한 Things의 인스턴스를 실제로 설치하려면 적절한 per-instance identifiers와 URLs로 TD를 업데이트해야 하므로, 최대한의 보장을 위해 현장 검증은 installation 이후에 이루어져야 한다.

7. TD Context Extensions

이 섹션은 비규범적이다.

5. TD Information Model의 표준 Vocabulary 정의에 더해, WoT Thing Description은 추가 namespace로부터 context knowledge를 추가할 가능성을 제공한다. 이 메커니즘은 Thing Description 인스턴스를 추가적인(예: domain-specific) semantics로 풍부하게 하는 데 사용할 수 있다. 또한 향후 추가 Protocol Bindings 또는 새로운 security schemes를 가져오는 데도 사용할 수 있다.

이러한 TD Context Extensions를 위해 Thing Descriptions는 JSON-LD [json-ld11]에서 알려진 @context 메커니즘을 사용한다. TD Context Extensions를 사용할 때, Class Thing@context 값은 JSON-LD context files를 식별하는 anyURI 타입의 추가 요소 또는 5.3.1.1 Thing에서 정의한 namespace IRIs를 포함하는 Map이 있는 Array이다.

6.1 JSON 타입으로의 매핑에서 complex types에 대한 직렬화 규칙은 확장된 @context 이름-값 쌍의 직렬화를 정의한다. TD Context Extensions가 있는 스니펫은 아래에 제공된다:

{
    "@context": [
        "https://www.w3.org/ns/wot-next/td",
        {
            "eg": "http://example.org/iot#",
            "cov": "http://www.example.org/coap-binding#"
        },
        "https://schema.org/"
    ],
    // ...
}

7.1 Semantic Annotations

TD Context Extensions는 Thing Description 인스턴스에서 추가 Vocabulary Terms의 사용을 허용한다. 포함된 namespaces가 RDF Schema 또는 OWL이 제공하는 것과 같은 Class definitions를 기반으로 하는 경우, Thing Description의 모든 Class 인스턴스를 그러한 외부 Class definition과 연결하여 semantic하게 annotate하는 데 사용할 수 있다. 이는 Class 이름을 @type 이름-값 쌍에 할당하거나, 여러 associations/annotations를 위해 그 Array 값에 Class 이름을 포함함으로써 수행된다. 6.1 JSON 타입으로의 매핑의 직렬화 규칙에 따르면, @type은 JSON string 또는 JSON array로 직렬화된다. @type은 node의 type을 설정하는 데 사용되는 JSON-LD keyword [json-ld11]이다.

TD Context Extensions는 또한 Thing Description의 모든 Class 인스턴스 안에 추가 이름-값 쌍과 잘 정의된 값을 포함하는 것도 허용한다. 이러한 쌍과 값은 포함된 Vocabulary Terms를 통해 정의되며, 각각 대응하는 JSON 객체의 추가 멤버 또는 기존 멤버의 값으로 직렬화된다. 예로는 Thing의 추가 version metadata 또는 data items의 측정 단위가 있다.

다음 하위 섹션은 Thing Descriptions에서 서로 다른 종류의 ontologies를 사용하는 몇 가지 샘플을 보여 준다.

7.1.1 예 I: 추가 기본 Metadata

아래 샘플 TD 스니펫은 @context에 제공된 것처럼 서로 다른 외부 context files의 추가 metadata terms를 제공한다. version information container는 사용된 software에 대한 추가 version information(s:softwareVersion)을 추가하여 확장된다. schema.orgThing의 serial number 및 company name과 같은 organisation information을 제공하는 데 사용된다. SAREF ontology는 Thing의 semantic context (saref:TemperatureSensor)를 제공하는 데 사용되며, temperature property의 unit assignment에는 Ontology of Units of Measure (OM)가 사용된다.

참고

이러한 Vocabularies와 ontologies는 예로 사용된 것임에 유의하라. application domain과 use case에 따라 다른 것을 사용할 수 있다.

{
    "@context": [
        "https://www.w3.org/ns/wot-next/td",
        {
            "saref": "https://w3id.org/saref#",
            "om": "http://www.ontology-of-units-of-measure.org/resource/om-2/",
            "schema": "https://schema.org"
        }
    ],
    "version": {
        "instance": "1.2.1",
        "schema:softwareVersion": "1.0.1"
    },
    "schema:serialNumber": "4CE0460D0G",
    "schema:manufacturer": {"name": "CompanyName"},
    // ...
    "@type": "saref:TemperatureSensor",
    "properties": {
        "temperature": {
            "description": "Temperature value of the weather station",
            "type": "number",
            "minimum": -32.5,
            "maximum": 55.2,
            "unit": "om:degreeCelsius",
            "forms": [...]
        },
        // ...
    },
    // ...
}

7.1.2 예 II: State Annotations

많은 경우, TD Context Extensions는 interaction 중 교환되는 data(예: response의 payload)에 의해 표현되는 physical world object의 state information을 semantic하게 처리할 수 있도록, data schema의 일부를 annotate하는 데 사용될 수 있다. 예를 들어 이 state information의 semantic description을 RDF로 TD Document에 삽입할 수 있으며, data schema의 일부를 physical world object의 RDF로 모델링된 state의 특정 부분을 참조하도록 개별적으로 annotate할 수 있다.

아래 TD 스니펫은 lamp의 state를 설명하기 위해 SAREF를 사용한다. SSN, Semantic Sensor Network Ontology [VOCAB-SSN]에서 가져온 외부 Vocabulary Term ssn:forPropertystatus Property의 data schema를 physical world object의 실제 on/off state와 연결하는 데 사용된다.

{
    "@context": [
        "https://www.w3.org/ns/wot-next/td",
        {
            "saref": "https://w3id.org/saref#",
            "ssn": "http://www.w3.org/ns/ssn/"
        }
    ],
    "id": "urn:uuid:67c9122b-2680-4e1a-b41c-5af07edba1f4",
    "@type": "saref:LightSwitch",
    "saref:hasState": {
        "@id": "urn:uuid:67c9122b-2680-4e1a-b41c-5af07edba1f4/state",
        "@type": "saref:OnOffState"
    },
    // ...
    "properties": {
        "status": {
            "ssn:forProperty": "urn:uuid:67c9122b-2680-4e1a-b41c-5af07edba1f4/state",
            "type": "string",
            "forms": [{"href": "https://mylamp.example.com/status"}]
        },
        "fullStatus": {
            "ssn:forProperty": "urn:uuid:67c9122b-2680-4e1a-b41c-5af07edba1f4/state",
            "type": "object",
            "properties": {
                "statusString": { "type": "string" },
                "statusCode": { "type": "number" },
                "statusDescription": { "type": "string" }
            },
            "forms": [{"href": "https://mylamp.example.com/status?full=true"}]
        },
        // ...
    },
    // ...
}

2에서 Thing의 state는 status affordance 자체에 의해 주어지고, 가능한 state changes는 toggle affordance에 의해 주어진다. 다시 말해 physical world object의 state가 ThingInteraction Affordances를 직접 제공한다. 이 설계는 단순한 경우에는 만족스럽다. 그러나 더 정교한 경우에는 동일한 physical state에 대해 여러 affordances가 사용 가능할 수 있다. 위 예에서 fullStatus Property는 lamp state에 대한 대안적이고 더 장황한 표현을 제공한다.

7.1.3 예 III: Geolocation Annotations

building, agriculture 또는 smart city와 같은 많은 사용 사례에서는 location based data가 필요하다. 이 정보는 Thing Description에서 다양한 방식으로 제공될 수 있으며, 목적(예: indoor, outdoor)에 따라 서로 다른 종류의 location ontologies(예: [w3c-basic-geo], schema.org)에 의존할 수 있다. [sdw-bp]도 참조하라.

아래 TD 스니펫은 [w3c-basic-geo] ontology의 latlong을 사용하여 Thing의 top level에서 static latitude 및 longitude metadata를 제공한다.

{
    "@context": [
        "https://www.w3.org/ns/wot-next/td",
        {
            "geo": "http://www.w3.org/2003/01/geo/wgs84_pos#"
        }
    ],
    "@type": "Thing",
    "geo:lat": "26.58",
    "geo:long": "297.83",
    // ...
    "properties": {
        // ...
    }
}

어떤 사용 사례에서는 location based metadata가 interaction level에서 제공되어야 한다. 예를 들어 schema.org를 기반으로 최신 longitude, latitude, 그리고 elevation 값을 반환하는 Property로 제공될 수 있다:

{
    "@context": [
        "https://www.w3.org/ns/wot-next/td",
        {
            "schema": "https://schema.org#"
        }
    ],
    // ...
    "properties": {
        "position": {
            "type": "object",
            "@type": "schema:GeoCoordinates",
            "properties": {
                    "longitude": { "type": "number" },
                    "latitude":  { "type": "number" },
                    "elevation": { "type": "number" }
            },
            "forms": [{"href": "https://robot.example.com/position"}]
        },
        // ...
    },
    // ...
}

data model에서 예를 들어 longitude, latitude, 그리고 elevation에 대해 다른 이름이 필요한 경우, jsonld:context를 사용하여 terms를 ontology의 특정 vocabulary에 연결할 수 있다 ([JSON-SCHEMA-ONTOLOGY], Section 3.3 Defining a JSON-LD context for data instances도 참조):

{
    "@context": [
        "https://www.w3.org/ns/wot-next/td",
        {
            "schema": "https://schema.org#"
        }
    ],
    // ...
    "properties": {
        "position": {
        "jsonld:context": {
            "schema": "https://schema.org/",
            "long": "schema:longitude",
            "lat": "schema:latitude",
            "height": "schema:elevation"
        },
        "type": "object",
        "properties": {
            "long": { "type": "number" },
            "lat": { "type": "number" },
            "height": { "type": "number" }
        }
        }
    },
    // ...
}

7.2 Bindings 추가

Thing Description의 TD Context Extensions를 통해, communication metadata는 WoT Binding Registry [WOT-BINDING-REGISTRY]의 Binding Specifications를 통해 보완될 수 있으며, 이는 Form 인스턴스를 나타내는 JSON 객체로 직렬화되는 추가 Vocabulary Terms를 통해 추가된다. 자세한 정보는 8. Bindings를 참조하라.

7.3 Security Schemes 추가

마지막으로, 5.3.3 Security Vocabulary Definitions에 포함되지 않은 새로운 security schemes는 TD Context Extension 메커니즘을 사용하여 가져올 수 있다. 이 예는 [RFC9200]를 기반으로 하는 가상의 ACE security scheme를 사용하며, 이 예에서는 http://www.example.org/ace-security#에 있는 namespace로 정의된다. 추가 security schemes는 SecurityScheme ClassSubclasses여야 MUST 한다.

{
    "@context": [
        "https://www.w3.org/ns/wot-next/td",
        {
            "cov": "http://www.example.org/coap-binding#",
            "ace": "http://www.example.org/ace-security#"
        }
    ],
    // ...
    "securityDefinitions": {
        "ace_sc": {
            "scheme": "ace:ACESecurityScheme",
            // ...
            "ace:as": "coaps://as.example.com/token",
            "ace:audience": "coaps://rs.example.com",
            "ace:scopes": ["limited", "special"],
            "ace:cnonce": true
        }
    },
    "security": ["ace_sc"],
    "properties": {
        "status": {
            // ...
            "forms": [{
                "op": "readproperty",
                "href": "coaps://rs.example.com/status",
                "contentType": "application/cbor",
                "cov:methodName": "GET",
                "ace:scopes": ["limited"]
            }]
        }
    },
    "actions": {
        "configure": {
            // ...
            "forms": [{
                "op": "invokeaction",
                "href": "coaps://rs.example.com/configure",
                "contentType": "application/cbor",
                "cov:methodName": "POST",
                "ace:scopes": ["special"]
            }]
        }
    },
    // ...
}

5.3.3 Security Vocabulary Definitions에서 정의된 모든 security schemes는 이미 TD context의 일부이며, TD Context Extension을 통해 포함할 필요가 없다는 점에 유의하라.

8. Bindings

Consumer에서 Thing으로, 그리고 다시 Thing에서 Consumer로 전송되는 모든 message는 WoT가 제공하는 Property–Action–Event 추상화에도 불구하고 network protocol을 통해 이동해야 한다. Forms level의 operations는 message가 network 상에서 어떤 형태여야 하는지에 바인딩되어야 한다. 따라서 WoT Thing Description의 모든 form은 Form에 표시된 것처럼 href 멤버로 주어지는 submission target을 가져야 한다. 예를 들어 target이 http 또는 https로 시작하면, ConsumerThing이 HTTP 기반 Protocol Binding을 구현한다고 추론할 수 있으며, 이 form의 인스턴스에서 HTTP-specific terms를 기대해야 한다. 더 자세한 설명과 예는 8.1.1 Protocol Bindings를 참조하라.

또한 Affordance Level의 Data Schema가 설명하는 payload는 data format으로 직렬화되어 network protocol로 전송되어야 한다. operations가 protocol messages에 바인딩되는 방식과 유사하게, Data SchemaForm에 제공된 contentType 또는 protocol-specific terms가 나타내는 data format에 바인딩된다. 이러한 terms로부터 Consumer는 필요한 serialization method를 추론하고 application-level data를 network protocol로 전송할 data로 변환할 수 있다. 마찬가지로 Thing에서 오는 messages에 대해, Consumer는 data를 deserialize하고 application level에 제공할 수 있다. 예를 들어 Python으로 구현된 ConsumercontentType의 값으로 application/json을 읽고, Python dictionary data structure를 JSON 객체로 직렬화할 수 있다. 더 자세한 설명과 예는 8.1.2 Payload Bindings를 참조하라.

위 메커니즘은 Web of Things에서 Bindings라고 불리며, 구체적인 예는 HTTP 및 JSON Bindings가 있는 robot arm의 TD 일부와 함께 그림 5에 설명되어 있다. 여기서 Consumer는 robot arm을 x가 12이고 y가 100인 위치로 이동시키기 위해 robot arm의 action(goTo)을 호출하려고 한다. 이를 위해 올바른 payload를 만들고, 이를 직렬화한 뒤, 올바른 protocol options를 사용하여 전송한다. Thing은 network를 통해 message를 받고, 자신의 TD에 대응하는 message로 응답한다. 다른 protocols, payload formats 및/또는 그 조합도 가능하며, 이는 8.1 Binding Mechanisms에서 설명된다.

TD, Thing 및 Consumer가 있는 Bindings 메커니즘
그림 5 Thing과 Consumer의 messages가 있는 TD excerpt 내부의 Bindings 메커니즘.

요약하면, Bindings는 Thing Description이 특정 protocol, data payload formats 또는 둘 모두에 특정 방식으로 맞게 조정될 수 있게 한다. 이는 URI Schemes, 추가 descriptive vocabularies, Thing Models, 그리고 Things와 Consumers의 구현자를 모두 안내하는 것을 목표로 하는 예를 통해 수행된다. 이 섹션은 전체 메커니즘을 설명하고 새로운 Bindings를 만드는 데 대한 기본 지침을 제공한다. [WOT-BINDING-REGISTRY]는 기존 Bindings의 registry(목록)와 registry에 새 entries를 등록하기 위해 따라야 할 requirements를 포함한다.

특정 IoT device를 위한 TD를 생성할 때, 해당 Binding을 사용하여 Thing Description에 제공되어야 하는 communication metadata를 찾아볼 수 있다. 그림 6은 Bindings가 어떻게 사용되는지 보여 준다. protocol 또는 media type을 기반으로 TD가 생성된다. TD를 처리하는 Consumer는 TD에 존재하는 필요한 Bindings를 구현하며, 이를 위해 해당 protocol stack과 media type encoder/decoder를 포함하고, messages의 serialization format 및 header options와 같이 TD에 주어진 정보에 따라 stack(또는 그 messages)을 구성한다.

TD의 building blocks로서의 Protocols, Media Types 및 그 조합
그림 6 TD의 building blocks로서의 Protocols, Media Types 및 그 조합
참고

이 명세의 편집자들은 [WOT-ARCHITECTURE]의 관련 장들, 예를 들어 WoT Binding Templates Building Block, Hypermedia Controls, Protocol BindingsMedia Types를 읽는 것도 권장한다.

8.1 Binding Mechanisms

8.1.1 Protocol Bindings

[WOT-THING-DESCRIPTION]는 readproperty, invokeactionsubscribeevent와 같은 abstract operations를 정의하며, 이는 Thing Description의 form이 설명하는 operation을 수행할 때 의도된 semantics를 설명한다. operations가 affordance에서 수행되려면, operation을 protocol에 바인딩해야 한다. 다시 말해 form은 Consumer가 예를 들어 form 안의 protocol로 property를 읽기 위해 필요한 모든 정보를 포함해야 한다.

대부분의 protocols는 message type, 즉 message의 semantic intention을 정의하는 비교적 작은 method 집합을 가진다. REST 및 PubSub architecture patterns는 서로 다른 methods를 가진 서로 다른 protocols를 초래한다. 각 target protocol은 유사한 operations에 대해 서로 다른 method names를 지정할 수 있으며, 서로 다른 protocols의 유사한 method names 사이에는 semantic differences가 있을 수 있다. 또한 Things는 특정 WoT operation을 수행하기 위해 서로 다른 methods를 사용할 수 있다. 예를 들어 한 Thing에서는 writeproperty operation에 HTTP POST request가 사용될 수 있지만, 다른 Thing에서는 HTTP PUT이 사용될 수 있다. 이러한 이유로 Thing Descriptions는 operation별로 사용할 method를 지정할 수 있어야 한다.

REST 및 PubSub protocols에서 흔히 발견되는 methods는 GET, PUT, POST, DELETE, PUBLISH, 그리고 SUBSCRIBE이다. Binding specifications는 이러한 기존 methods와 관련 vocabularies가 Thing Description에서 WoT operations에 바인딩하기 위해 어떻게 사용될 수 있는지 설명한다. 이는 protocol의 URI scheme을 정의하고, protocol methods를 readproperty, invokeactionsubscribeevent와 같은 abstract WoT operations에 매핑함으로써 수행된다. 어떤 경우에는 protocol usage의 서로 다른 경우에 vocabulary terms를 어떻게 사용해야 하는지 설명하기 위한 추가 지침이 제공된다.

아래 예들은 HTTP 및 Modbus protocols에 대한 readproperty operation의 binding instances를 보여 준다. 이는 예시일 뿐이며, 관련 vocabulary terms와 그 값을 알아보려면 항상 해당 binding specification을 참조해야 한다는 점에 유의하라.

53: readproperty operation을 HTTP에 바인딩한 instance
{
    "href": "http://example.com/props/temperature",
    "op": "readproperty",
    "htv:methodName": "GET"
}
54: readproperty operation을 Modbus에 바인딩한 instance
{
    "href": "modbus+tcp://127.0.0.1:60000/1/4",
    "op": "readproperty",
    "modv:function": "readCoil"
}

위 예의 form elements는 다음 statements를 전달한다:

  • 왼쪽 예: port 80의 host example.com에 있는 resource props/temperature에 HTTP GET request를 수행하여 대상 Property Affordance의 readproperty를 수행한다 (Port 80은 [RFC2616]에 따라 가정된다).
  • 오른쪽 예: IP address 127.0.0.1을 가진 장치의 port 60000에서 unitID 1의 coil 4에 대해 Modbus의 readCoil function을 사용하여 대상 Property Affordance의 readproperty를 수행한다.

이러한 binding instances와 그 statements는 다른 operations와 protocols에도 가능하다. 아래는 invokeactionsubscribeevent의 예이다:

55: invokeaction operation을 HTTP에 바인딩한 instance
{
    "op": "invokeaction",
    "href": "http://192.168.1.32:8081/example/levelaction",
    "htv:methodName": "POST"
}
56: subscribeevent operation을 MQTT에 바인딩한 instance
{
    "op": "subscribeevent",
    "href": "mqtt://iot.platform.com:8088",
    "mqv:filter": "thing1/events/overheating",
    "mqv:controlPacket": "subscribe"
}

위 예의 form elements는 다음 statements를 전달한다:

  • 왼쪽 예: port 8081의 host 192.168.1.32에 있는 resource example/levelaction에 HTTP POST request를 수행하여 대상 Action Affordance의 invokeaction을 수행한다.
  • 오른쪽 예: iot.platform.com의 MQTT broker와 port 8088에 연결한 다음 topic thing1/events/overheating을 구독하여 대상 Event Affordance의 subscribeevent를 수행한다.

어떤 경우에는 header options 또는 protocols의 다른 parameters가 포함되어야 한다. 이것들은 protocol에 매우 의존적이므로, Web of Things (WoT) Binding Registry에 나열된 bindings를 참조하라. 또한 protocols에는 일부 interaction types에 사용할 수 있는 Subprotocols가 정의되어 있을 수 있다. 예를 들어 HTTP를 사용하여 asynchronous notifications를 받기 위해, 일부 servers는 long polling (longpoll), WebSub [WebSub] (websub) 및 Server-Sent Events [eventsource] (sse)를 지원할 수 있다.

8.1.1.1 Subprotocols

[WOT-ARCHITECTURE]에 정의된 것처럼, subprotocol은 protocol에 대한 extension mechanism이다. subprotocol은 protocol messages의 sequence 또는 message payloads의 특정 구조를 요구할 수 있으며, 이는 해당 subprotocol 안에서 자체 semantics를 가질 수 있다. subprotocol의 사용은 [WOT-THING-DESCRIPTION]에 정의된 subprotocol field로 표현된다. 이는 form instance에서 이러한 protocols 중 하나의 사용, 예를 들어 HTTP의 특수한 사용을 가진 long polling을 나타내는 데 사용할 수 있다:

57: events 구독을 위한 Subprotocol 사용
{
    "op": "subscribeevent",
    "href": "https://mylamp.example.com/overheating",
    "subprotocol": "longpoll"
}

subprotocol term이 가질 수 있는 값은 [WOT-THING-DESCRIPTION]에 의해 제약되지 않는다. 서로 다른 protocols는 서로 다른 subprotocols를 가질 수 있기 때문이다. 이에 따라 subprotocols는 자신이 확장하는 protocol과 연결되며, forms의 href (또는 base)에 표시된 protocol과 함께 이해되어야 한다. WebSockets의 경우 IANA-registered Websocket Subprotocols [iana-web-socket-registry]를 사용할 수 있다. CoAP의 경우 "subprotocol":"cov:observe"를 사용하여 [RFC6741]에 정의된 asynchronous observation operations를 설명할 수 있다. subprotocols는 protocol binding specification의 일부로 정의되고 설명될 수 있다.

8.1.1.2 Protocol Binding과 함께 Thing Description 사용하기

Protocol Binding Specifications는 [WOT-THING-DESCRIPTION]에 있는 vocabulary를 확장하는 vocabularies를 포함한다. 이는 TD가 소비되는 방식과 Thing과의 interactions가 그러한 vocabularies에 맞게 조정된다는 뜻이다. 아래 단계는 이 process가 일반적으로 어떤 모습인지 설명한다.

  1. protocol 감지: operation을 실행하기 위해 form이 activation되면, Consumerhref 멤버와 base(존재하는 경우)를 보고 protocol을 식별하는 것이 SHOULD 좋다.
  2. 올바른 protocol stack 선택: Consumer는 자신의 protocol software stacks에서 올바른 protocol을 선택하는 것이 SHOULD 좋다.
  3. TD의 forms 부분 검증: 각 binding specification에서 제공되는 JSON Schema instances를 사용하거나 key value pairs를 programmatically checking함으로써, Consumer는 해당 form terms가 TD instance에 올바르게 지정되었는지 확인하기 위해 이를 검증할 수 MAY 있다.
  4. communication 시작: Consumer는 선택한 operation에 대한 requests를 form과 예상되는 추가 behavior에 지정된 대로 보내는 것이 SHOULD 좋다. 이는 subprotocol 또는 protocol binding이 도입한 다른 vocabulary terms와 같은 서로 다른 form terms를 사용하여 지정된다. Thing과 교환되는 interaction affordance data는 TD에 존재하는 Data SchemaContent Type에 따르는 것이 SHOULD 좋다. operation에 해당하는 Data Schema는 표 28에서 찾을 수 있다.

따라서 다음 requirements가 Things와 Consumers에 적용된다:

  • WoT Thing Description의 모든 form은 그 href 멤버의 URI scheme [RFC3986]이 나타내는 Protocol Binding의 requirements를 따라야 MUST 한다.
  • WoT Thing Description의 모든 form은 interaction에서 Thing이 수락하는 requests(존재하는 경우 request headers 포함)를 정확하게 설명해야 MUST 한다.

8.1.2 Payload Bindings

[WOT-THING-DESCRIPTION]는 어떤 protocol을 통한 message의 payload가 어떤 모습일 수 있는지 설명하기 위해 두 가지 메커니즘을 정의한다. 첫째, media types [IANA-MEDIA-TYPES]는 protocol로 data를 보내고 받을 때 사용되는 serialization을 설명한다. 이들은 각 Interaction Affordance에 필수인 TD의 Forms 안의 contentType으로 표현된다. 둘째, messages의 구조를 설명하기 위해 Data Schema 개념을 정의하며, 이는 media types와 함께 사용된다. 이 둘의 조합은 어떤 message든 TD에서 설명할 수 있게 하여, Thing과 Consumers가 messages를 올바르게 serialization 및 deserialization할 수 있게 한다.

이 섹션의 나머지 부분인 8.1.2.1 Content Types8.1.2.2 Data Schemas에서는 payload bindings가 어떤 모습일 수 있는지에 대한 예를 찾을 수 있다.

8.1.2.1 Content Types

Content type은 media type과 media type에 대한 잠재적 parameters를 포함하며, 직렬화된 documents의 적절한 processing을 가능하게 한다. 이 방식으로 messages는 어떤 format으로도 교환될 수 있고, application의 upper layers가 서로 다른 formats에 적응할 수 있다. images, videos 또는 임의의 unstructured data와 같은 경우에는 content type만으로 payload를 설명하기에 충분하지만, JSON ([RFC8259])과 같은 경우에는 보통 8.1.2.2 Data Schemas에서 설명한 것처럼 Data Schema가 제공된다.

예를 들어 number payload는 JSON 또는 XML로 직렬화될 수 있으며, forms의 contentType에서 각각 application/json 또는 application/xml로 표시될 수 있다. plus (+) 또는 semicolon (;) notation을 통해 추가 parametrization이 가능하다.

아래 예에서는 JSON 및 추가 parameters가 있는 plain text에 대한 content types를 가진 form elements를 찾을 수 있다. 이 특정 경우 forms는 http 또는 coap로 이 property를 읽으면 서로 다른 content types가 결과로 나온다고 설명한다. structured media types의 경우, Data Schema는 일반적으로 8.1.2.2 Data Schemas5.3.2 Data Schema Vocabulary Definitions에서 설명한 것처럼 affordance level에 제공된다. 그러나 images 및 videos와 같은 unstructured data의 경우, Data Schema는 일반적으로 사용할 수 없다.

58: forms 안의 JSON 및 CBOR media types
{
    "forms":[
    {
        "href": "http://example.com/properties/temperature",
        "op": "readproperty",
        "contentType": "application/json"
    },
    {
        "href": "coap://example.com/properties/temperature",
        "op": "readproperty",
        "contentType": "text/plain;charset=utf-8"
    }]
}

다른 content types도 TDs에서 표현될 수 있다. 아래 목록에서는 서로 다른 content type variations의 예를 찾을 수 있다. 이러한 content types는 58의 것들을 대체할 수 있다.

  • Parametrization이 없는 Structured Content Types
  • Parametrization이 있는 Structured Content Types
    • application/senml+json: JSON으로 serialized된 SenML Data [RFC8259]
    • application/senml+xml: XML로 serialized된 SenML Data
    • application/ocf+cbor: CBOR로 serialized된 OCF payload
    • text/csv;charset=utf-8: UTF-8로 encoded된 CSV [RFC4180]
  • Unstructured Content Types
    • image/jpeg: JPEG image
    • video/mp4: MP4 Video
    • application/octet-stream: Generic binary stream
8.1.2.2 Data Schemas

5.3.2 Data Schema Vocabulary Definitions에서 설명한 것처럼 Data Schema는 media types와 함께 사용되는 messages의 구조를 설명한다. JSON Schema [json-schema]에서 크게 영감을 받았지만, [XML], string-encoded images, integers의 bit representations 등 다른 payload types를 설명하는 데도 사용할 수 있다. Data Schema는 media types에 더해 사용되는 것이 SHOULD 좋다.

경우에 따라 messages의 구조는 단순한 number부터 여러 단계로 중첩된 arrays 또는 objects까지 무엇이든 될 수 있다. 기존 IoT Platforms와 Standards에는 data가 구조화되는 방식에 variations가 있는 특정 payload formats가 있다. 5.3.2 Data Schema Vocabulary Definitions에서 설명한 것처럼, Data Schema는 TD에서 다음 위치 중 하나에 사용할 수 있다:

  • Property Affordances: 각 property affordance는 Data Schema를 위한 terms를 포함하고, 읽거나 관찰하거나 쓸 때 property values를 설명할 수 있다.
  • Action Affordances: inputoutput vocabulary terms는 input parameters와 함께 Action Affordance를 호출하고 status information을 받는 경우처럼 양방향으로 data가 교환될 때 두 개의 서로 다른 schemas를 제공하는 데 사용된다.
  • Event Affordances: data, dataResponse, subscriptioncancellation은 각각 event data가 Exposed Thing에 의해 전달될 때의 payload, event deliveries에 대해 회신할 payload, event에 subscribe하는 데 필요한 payload, 그리고 Exposed Thing으로부터 event data 수신을 cancel하는 데 필요한 payload를 설명하는 데 사용된다.
  • URI Variables: Thing 또는 Affordance level에서 uriVariables는 request URI 안에 string으로 제공되어야 하는 data를 설명할 수 있다.

아래는 해당 Data Schema가 있는 간단한 JSON object payload의 예이다. 다양한 IoT Platforms 및 Standards의 예는 E. IoT Platforms 및 Standards의 Payloads와 Data Schemas 예에서 찾을 수 있다.

59: 단순 JSON Object Payload
{
    "level": 50,
    "time": 10
}
60: 단순 JSON Object Payload를 위한 DataSchema
{
    "type": "object",
    "properties": {
        "level": {
            "type": "integer",
            "minimum": 0,
            "maximum": 255
        },
        "time": {
            "type": "integer",
            "minimum": 0,
            "maximum": 65535
        }
    }
}

8.1.3 Protocol and Payload Bindings

IoT platforms 또는 OPC-UA나 BACnet과 같은 standards의 경우, protocol, media type 및 data structure가 지정될 수 있다. 이러한 경우 그 binding specification8.1.1 Protocol Bindings8.1.2 Payload Bindings의 집합에 의존하거나, protocol, media type 및 data structure를 동시에 지정할 수 있다.

IoT platforms에서는 HTTP를 특정 JSON payload structures와 함께 사용하는 것에 대한 requirement가 있을 수 있다. 따라서 해당 binding specification은 여러 bindings의 semantic grouping을 허용하는 Thing Models와 TDs의 예를 제공한다. 이를 위해서는 우선 HTTP와 JSON에 대한 binding specification이 있어야 한다.

OPC-UA 또는 BACnet과 같은 standards에서는 binding specification이 protocol 및 media type, 그리고 가능하다면 data structure에 대한 requirements를 포함한다. 따라서 binding specification 자체만으로도 binding instance가 어떤 모습이어야 하는지 지정하기에 충분하다.

8.2 Profiles와의 관계

Web of Things는 구현 노력을 줄일 수 있는 profiling mechanism도 정의한다. Profiles는 TDs의 유연성을 제약함으로써 기존 Bindings 위에 구축된다. 이러한 constraints는 bindings, semantic contexts, link relations, security schemes 및 discovery mechanisms일 수 있다. 이러한 constraints를 통해 profiles는 bindings보다 추가적인 interoperability guarantees를 제공한다.

편집자 참고

[WOT-PROFILES]에서 현재 지정된 profiling mechanism은 위에서 언급한 메커니즘을 정확히 따르지는 않는다. 그러나 profiling mechanism의 미래에 대해서는 합의가 있다. profiling mechanism이 업데이트되면, 이 섹션도 그에 맞게 업데이트될 것이다.

예를 들어 profile은 readproperty operations에 대해 HTTP GET Method의 사용을 제약하고, payloads가 항상 JSON으로 serialized되어야 한다고 요구할 수 있다. profile의 사용은 TD의 profile term으로 표시되며, 이는 profile definition을 가리키는 URI이다. Consumer가 profile을 어떻게 사용할 수 있는지는 [WOT-PROFILES] specification의 Profiling Mechanism 섹션에서 설명된다.

9. 동작 Assertions

다음 assertions는 TD의 표현 또는 정보 모델과는 달리 WoT system의 구성 요소들의 동작과 관련된다. 그러나 TD는 descriptive하며, 특히 이미 존재하는 network interfaces를 설명하는 데 사용될 수 있다는 점에 유의하라. 이러한 경우에는 그러한 기존 interfaces의 동작을 제약하는 assertions를 만들 수 없다. 대신 assertions는 그러한 interfaces를 정확히 표현하도록 TD에 대한 제약으로 해석되어야 한다.

9.1 보안 구성

안전한 상호운용을 가능하게 하려면, security configurations는 Thing의 requirements를 정확히 반영해야 한다:

일부 security protocols는 필요한 encoding 또는 encryption schemes를 포함하여 authentication information을 동적으로 요청할 수 있다. 위의 한 가지 결과는, protocol이 Thing Description에 선언되지 않은 security credentials의 형태나 encoding 또는 encryption scheme을 요청하는 경우 Thing Description은 invalid로 간주되어야 한다는 것이다.

9.2 Data Schemas

TD에 제공된 data schemas는 TD에 지정된 interactions에서 설명된 Thing이 반환하고 수락하는 data payloads를 정확히 표현해야 한다. 일반적으로 Consumers는 data schemas를 엄격히 따라야 하며, WoT Thing Description에 주어지지 않은 것은 생성하지 않아야 하지만, WoT Thing Description에 명시적으로 주어지지 않은 Thing의 추가 data는 수락해야 한다. 일반적으로 Things는 WoT Thing Descriptions에 의해 described되지만, ConsumersThings와 상호작용할 때 WoT Thing Descriptions를 따르도록 constrained된다.

10. Thing Model

10.1 기본 개념

아래 그림은 Thing ModelThing Description의 관계를 보여 준다. Thing Model은 주로 Properties, Actions, 그리고 Events와 같은 interaction affordances 및 공통 metadata를 설명한다. Thing Descriptions가 Thing Model에 의존하여 instantiated되는 경우, 그것은 해당 Thing Model에 따라 valid인 것이 SHOULD 좋다. 이 paradigm은 object-oriented programming에서 objects(~Thing Descriptions)를 만들기 위한 abstract class 또는 interface definition(~Thing Model)과 비교될 수 있다.

Thing Model 및 Thing Description과의 관계
그림 7 Thing Model 및 Thing Description과의 관계.

Thing ModelThingProperties, Actions, 그리고 Events와의 interface 및 가능한 interaction에 대한 logical description이다. 그러나 이는 concrete protocol usage(예: IP address), 또는 serial number와 GPS location 같은 Thing instance-specific information을 포함하지 않는다. 그러나 Thing Models는 예를 들어 model이 설명하는 전체 인스턴스 class에 적용된다면 security schemes를 포함할 수 있다. 이러한 schemes는 생략되거나 (templates로) parameterized되어야 할 수 있는 URLs(예: token servers와 같은)를 가질 수 있지만, 많은 경우에는 이러한 URLs도 제공될 수 있다.

Thing Model은 Thing Description과 동일한 JSON 기반 format으로 serialized될 수 있으며, 이는 JSON-LD processing도 허용한다. 일부 mandatory terms가 없기 때문에 Thing ModelThing Description instances와 같은 방식으로 검증될 수 없다는 점에 유의하라. 이는 placeholder type을 사용하지 않는 모든 term이 여전히 TD Information Model에 선언된 types를 사용한다는 뜻이다. 예를 들어 placeholder가 사용되지 않는 한, minimum의 값은 integer여야 한다.

JSON으로 serialized된 TM instances를 검증하기 위해 the JSON Schema를 사용할 수 있다.

10.2 Thing Model 선언

Thing Model은 top level @type으로 인식된다. Thing Model definitions는 top level에서 keyword @type을 사용해야 MUST 하며, tm:ThingModel과 같거나 이를 포함하는 string 또는 array 타입의 값을 사용해야 한다. 또한 JSON-LD document로 식별하기 위해 Thing Model definitions는 Thing Description과 동일한 규칙으로 top level에서 keyword @context를 사용해야 MUST 한다. prefix tmThing Descriptions의 context 안에 정의되며, 4. Namespaces에 정의된 Thing Model namespace를 가리킨다. tm context의 vocabulary는 Thing Model definitions에서만 사용되고, Thing Descriptions가 생성될 때 제거되거나 대체되는 것으로 의도된다 (10.4 Thing Description Instances의 Derivation도 참조).

Thing Model은 endpoint addresses와 같은 instance specific Protocol Binding 및 security information을 포함하지 않을 수 MAY 있다. 따라서 Thing Model definitions는 forms, base, securityDefinitions, 그리고 security와 같은 JSON members가 없더라도 valid하다. Thing Models는 이러한 JSON members가 (예: template으로) 사용되더라도 valid하지만, href와 같은 nested mandatory members는 생략된다.

3은 protocol 및 security information이 없는 valid한 sample lamp Thing Model을 보여 준다.

10.3 Modeling Tools

Thing Model definitions의 context에서는 Thing modelling에 사용할 수 있는 특정 features가 도입된다.

10.3.1 Versioning

Thing Model definitions가 시간이 지나며 변경되는 경우, 이는 version container에 반영되는 것이 SHOULD 좋다. string-based term model은 [SEMVER]와 같은 versioning information을 제공하기 위해 version container 안에서 사용된다. 다음 snippet은 Thing Model instance에서 model의 사용을 보여 준다.

61: Thing Model versioning
{
    // ...
    "@type": "tm:ThingModel",
    "title": "Lamp Thing Model",
    "description": "Lamp Thing Description Model",
    "version" : {"model": "1.0.0"},
    // ...
}

Thing Model의 정의로 인해, term instanceversion container 안에서 생략되어야 MUST 한다.

Thing Models가 업데이트되어 새 version을 가지면, 이는 extension 및 import features를 사용하는 다른 Thing Models에 영향을 줄 수 있다(Section 10.3.2 Extension and Import 참조). 어떤 경우에는 새 version을 file name 및/또는 version을 식별하는 해당 URL에 반영하는 것도 유용하다.

10.3.2 Extension and Import

Thing Modellinks 정의에 발표된 tm:extends 메커니즘을 사용하여 기존 Thing Model을 확장할 수 있다: Thing Model이 다른 Thing Model을 확장할 때, 확장될 Thing Model을 대상으로 하는 "rel": "tm:extends"가 있는 links entry를 적어도 하나 사용해야 MUST 한다. Thing Model은 확장된 Thing Model의 모든 definitions를 상속한다. 기존 TD information model (5. TD Information Model)의 추가 JSON name-value pairs를 제공하거나 context extension concept(7. TD Context Extensions)을 사용하여 기존 definition을 추가 metadata로 확장할 기회가 있다. Thing Modeltitle(s)maximum 등과 같은 기존 definitions를 overwrite할 수도 있다. 이를 위해 두 가지 제한이 있다: Thing Model은 확장된 Thing Modelproperties, actions, 그리고/또는 events Map 안에 정의된 JSON names를 overwrite하지 않는 것이 SHOULD NOT 좋다. Definitions는 가능한 instance values가 origin extended definitions와 비교해 더 이상 valid하지 않게 되는 방식으로 overwritten되지 않는 것이 SHOULD NOT 좋다. 이러한 assertions는 확장된 Thing Model의 semantics를 전반적으로 보존한다. 예를 들어, extended Thing Model"minimum":2"minimum":0으로 overwrite하는 것은 허용되지 않는다. 반면 "minimum":5로 overwriting하는 것은 모든 instance values가 항상 extended Thing Model의 restrictions를 충족하므로 가능하다(추가 설명은 Figure 그림 8도 참조).

다음 예에 제공된 것처럼 basic model description이 있다고 가정하자:

62: 기본 On/Off Thing Model Definition
{
    "@context": ["https://www.w3.org/ns/wot-next/td"],
    "@type": "tm:ThingModel",
    "title": "Basic On/Off Thing Model",
    "properties": {
        "onOff": {
            "type": "boolean"
        }
    }
}

이제 TD instances를 만들기 위한 template으로 사용될 'Smart Lamp Control'이라는 새 device class model이 설계된다. 이 model은 'Basic On/Off Thing Model'의 기존 definition을 재사용하고 이를 dim property로 확장한다:

63: Smart Lamp Control Thing Model Definition
{
    "@context": ["https://www.w3.org/ns/wot-next/td"],
    "@type": "tm:ThingModel",
    "title": "Smart Lamp Control with Dimming",
    "links" : [{
        "rel": "tm:extends",
        "href": "http://example.com/BasicOnOffTM",
        "type": "application/tm+json"
     }],
    "properties" : {
        "dim" : {
            "title": "Dimming level",
            "type": "integer",
            "minimum": 0,
            "maximum": 100
        }
   }
}

title이 overwritten되며, TD instances가 생성될 때 사용될 것임에 유의하라(다음 하위 섹션 10.4 Thing Description Instances의 Derivation도 참조).

tm:extends feature는 하나의 Thing Model의 모든 definitions를 상속하는 것만 허용한다. 그러나 많은 사용 사례에서는 하나 이상의 기존 Thing Models의 definitions 조각만 import하는 것이 바람직하다. 하나 이상의 기존 Thing Models의 definitions 조각을 import하기 위해, 재사용되는 것이 SHOULD 좋은 기존 (sub-)definition의 location을 제공하는 tm:ref term이 도입된다. tm:ref 값은 URI [RFC3986](Section 4.1))로서의 file location으로 시작하고, 그 뒤에 # character가 오며, 그 뒤에 JSON Pointer [RFC6901] definition이 오는 pattern을 따라야 MUST 한다. URI가 empty일 수도 있으며, 이는 same-document reference [RFC3986](Section 4.4))를 나타낸다는 점에 유의하라. 이 경우 tm:ref는 relative reference로 해석되어야 한다. tm:ref가 사용될 때마다, referenced pre-definition과 그 dependencies(예: context extension에 의한 것)는 새로 정의된 definition에서 assumed되어야 MUST 한다.

참고

tm:ref 값의 일부는 사용 전에 URL ("percent") encoding이 필요한 non-ASCII characters를 포함할 수 있다. tm:ref 값에 escapes를 적용하기 전에 implementations는 해당 값이 이미 encoded되어 있지 않은지 확인해야 한다.

다음 예는 62의 property onOff의 기존 definition을 새 property definition switch로 import하는 새 TM definition을 보여 준다.

64: Smart Lamp Control imports existing definition
{
    "@context": ["https://www.w3.org/ns/wot-next/td"],
    "@type": "tm:ThingModel",
    "title": "Smart Lamp Control",
    "properties" : {
        "switch" : {
            "tm:ref": "http://example.com/BasicOnOffTM.tm.jsonld#/properties/onOff"
        }
   }
}

tm:ref를 사용한 relative imports의 예로, 다음 Thing Model은 genericTemperature property를 두 개의 더 구체적인 properties에서 재사용하고 보강한다(아래 참조). 이 두 properties는 각각 inner 및 outer temperature value를 설명한다.

65: Multi Sensor Thing Model re-using definitions with relative imports
{
    "@context": "https://www.w3.org/ns/wot-next/td",
    "@type": "tm:ThingModel",
    "title": "Multi Sensor",
    "properties": {
        "genericTemperature": {
            "type": "number",
            "unit": "C"
        },
        "innerTemperature": {
            "tm:ref": "#/properties/genericTemperature",
            "title": "The inner temperature",
            "minimum": 10
        },
        "outerTemperature": {
            "tm:ref": "#/properties/genericTemperature",
            "title": "The outer temperature",
            "description": "The outer temperature is measured in Kelvin",
            "unit": "K"
        }
    },
    "tm:optional": [
        "/properties/genericTemperature"
    ]
}

"tm:ref"가 정의된 위치에는 추가 name-value pairs를 추가할 수 있다. referenced definition의 name-value pairs를 override하는 것도 허용된다. tm:ref의 기존 JSON name-value pair definition을 override하려는 의도라면, 새 값을 제공하는 tm:ref declaration의 같은 level에서 동일한 JSON name을 사용해야 MUST 한다. overwrite process는 [RFC7396]에 정의된 JSON Merge Patch algorithm을 따라야 MUST 하며, referenced definition의 content가 새로 제공된 JSON name-value pairs로 patched된다.

values는 JSON object 또는 array를 기반으로 할 수도 있고, 단순히 null value일 수도 있다. null은 target의 기존 JSON name-value pair 제거로 이어질 것이다.

tm:extends와 유사하게, semantic meaning을 유지하기 위해 definitions는 가능한 instance values가 origin referenced definition과 비교해 더 이상 valid하지 않게 되는 방식으로 overwritten되지 않는 것이 SHOULD NOT 좋다.

다음 예는 63의 기존 definitions를 overwrite(maximum), enhance(unit), 그리고 remove(title)하는 새 TM definition을 보여 준다.

66: Smart Lamp Control extend and overwrite existing definitions
{
    "@context": ["https://www.w3.org/ns/wot-next/td"],
    "@type": "tm:ThingModel",
    "title": "Smart Lamp Control",
    "properties" : {
        "dimming" : {
            "tm:ref": "http://example.com/SmartLampControlwithDimming.tm.jsonld#/properties/dim",
            "title": null,
            "maximum": 80,
            "unit": "%"
        }
   }
}

JSON Merge Patch algorithm을 기반으로, {"title": null,"maximum": 80,"unit": "%"}는 referenced origin content {"title": "Dimming level", "type": "integer", "minimum": 0, "maximum": 100}에 대한 patch로 작동할 것이다.

tm:extendstm:ref 기반 import mechanism은 TM definition에서 동시에 사용될 수도 있다. 다음 예는 62의 TM을 확장하고, 각각 363에서 statusdim definitions를 import한다.

67: Smart Lamp Control Thing Model with extend and import mechanism
{
    "@context": ["https://www.w3.org/ns/wot-next/td"],
    "@type": "tm:ThingModel",
    "title": "Smart Lamp Control",
    "links" : [{
        "rel": "extends",
        "href": "http://example.com/BasicOnOffTM",
        "type": "application/tm+json"
     }],
    "properties" : {
        "status" : {
            "tm:ref": "http://example.com/LampTM.tm.jsonld#/properties/status"
        },
        "dimming" : {
            "tm:ref": "http://example.com/LampWithDimmingTM.tm.jsonld#/properties/dim"
        }
   }
}

tm:extendstm:ref 기반 import mechanism은 transitive extension(extensions의 hierarchy)을 명시적으로 지원한다. 예를 들어 TM "B"의 tm:extends를 정의하는 TM "A"가 있고, TM "B" 자체가 TM "C"의 tm:extends를 정의하는 3개의 TMs가 있다고 가정하면, 결과적으로 "A" TM은 "B"와 "C"의 모든 definitions를 확장한다. infinite loop로 이어지는 recursive extensions는 정의되어서는 안 MUST NOT 된다.

다음 그림은 이 섹션에 제시된 extension 및 imports TM functions의 allowable override behaviour를 요약한다. 세 개의 Thing Models는 Smart Lamp Control Thing Model의 TM definitions를 재사용하기 위해 tm:ref 또는 tm:extends feature를 사용한다. 첫 번째 Thing Modeldimmer property 안에서 maximum 값을 120으로 import하고 overwrite한다. 그러나 이는 Smart Lamp Control Thing Model의 dim definition에서 origin dim definition의 0100 사이 범위에 속하지 않을 수 있는 가능한 instance values(at runtime)를 초래한다. 따라서 그러한 Thing Model definition은 허용되지 않는다. 두 번째 model은 property type 값을 number로 overwrite한다. 이 역시 Smart Lamp Control Thing Model의 origin dim type definition(integer)이 수락하지 않는 numeric dim values를 잠재적으로 초래할 것이다. 마지막 model은 올바른 방식으로 정의되어 있다. 새로운 dim ranges는 원래의 dim definition도 충족하는 potential instance values를 생성한다.

Overwriting behavior
그림 8 Thing Models의 Overwriting behavior.

10.3.3 Composition

일부 applications에서는 기존 Thing Model definitions를 재사용하고 이를 새 IoT system으로 compose하는 것이 유익하다. 예를 들어 새 Smart Ventilator가 두 개의 sub/child Thing Model definitions로 구성되도록 설계되는 경우가 있을 수 있다. 예컨대 on/offadjustRpm capabilities를 제공하는 Ventilation Thing Model, 그리고 dimmableRGB capabilities를 제공하는 LED Thing Model이 그 예이다.

이러한 composition은 links container의 사용으로 도입될 수 있다. Thing Model이 하나 이상의 (sub-)Thing Models로 구성된다는 정보를 제공하려면, links entries는 (sub-) Thing Models를 대상으로 하는 "rel": "tm:submodel"을 사용해야 MUST 한다. 선택적으로 composed (sub-) Thing Model에 개별 이름을 연결하기 위해 instanceName을 제공할 수 MAY 있다. 이는 여러 유사한 Thing Model definitions가 composed되고 구별되어야 할 때 유용하다.

composed Thing Model definitions로부터 Thing Descriptions를 생성하기 위해 서로 다른 strategies를 따를 수 있다. 기본 권장 사항은 각 parent 및 sub/child Thing Model에서 해당 Thing Descriptions를 생성하는 것이다(10.4 Thing Description Instances의 Derivation도 참조). composition relation은 Thing Descriptions의 links container 안에 있는 collectionitem relation types로 반영될 수 있다. Smart Ventilation을 기반으로 한 예는 다음과 같다:

top level/parent Thing Model의 interaction definitions와 모든 sub/child Thing Models의 모든 interaction definitions를 포함하는 단일 TD도 생성될 수 있다. 그때 generation process는 가능한 name collisions를 피해야 MUST 한다. 다음 예는 Smart Ventilator Thing Model에서 생성될 수 있는 potential (self-contained) Thing Description을 보여 준다.

70: Smart Ventilator TM의 self-contained TD
{
    "@context": "https://www.w3.org/ns/wot-next/td",
    "title": "Smart Ventilator",
    "securityDefinitions": {
        "basic_sc": {
            "scheme": "basic",
            "in": "header"
        }
    },
    "security": "basic_sc",
    "links": [
        {
            "rel": "type",
            "href": "./SmartVentilator.tm.jsonld",
            "type": "application/tm+json"
        }
    ],
    "properties": {
        "status": {
            "type": "string",
            "enum": [
                "on_value",
                "off_value",
                "error_value"
            ],
            "forms": [
                {
                    "href": "http://127.0.13.232:4563/status"
                }
            ]
        },
        "switch": {
            "type": "boolean",
            "description": "True=On; False=Off",
            "forms": [
                {
                    "href": "http://127.0.13.212:4563/switch"
                }
            ]
        },
        "adjustRpm": {
            "type": "number",
            "minimum": 200,
            "maximum": 1200,
            "forms": [
                {
                    "href": "http://127.0.13.212:4563/adjustRpm"
                }
            ]
        },
        "R": {
            "type": "number",
            "description": "Red color",
            "forms": [
                {
                    "href": "http://127.0.13.211:4563/R"
                }
            ]
        },
        "G": {
            "type": "number",
            "description": "Green color",
            "forms": [
                {
                    "href": "http://127.0.13.211:4563/G"
                }
            ]
        },
        "B": {
            "type": "number",
            "description": "Blue color",
            "forms": [
                {
                    "href": "http://127.0.13.211:4563/B"
                }
            ]
        }
    },
    "actions": {
        "fadeIn": {
            "title": "fadeIn",
            "input": {
                "type": "number",
                "description": "fadeIn in ms"
            },
            "forms": [
                {
                    "href": "http://127.0.13.211:4563/fadeIn"
                }
            ]
        },
        "fadeOut": {
            "title": "fadeOut",
            "input": {
                "type": "number",
                "description": "fadeOut in ms"
            },
            "forms": [
                {
                    "href": "http://127.0.13.211:4563/fadeOut"
                }
            ]
        }
    }
}

10.3.4 tm:optional

일부 경우에는 어떤 interaction affordances가 mandatory인지 강제하지 않고, Thing Description instance에서 반드시 구현될 필요가 없게 하는 것이 바람직하다. interaction models가 Thing Description instance에서 구현되는 것이 mandatory가 아니라면, Thing Model definitions는 JSON member name tm:optional을 사용해야 MUST 한다. tm:optional은 top level의 JSON array여야 MUST 한다. tm:optional의 값은 required interaction model definitions에 대한 JSON Pointer [RFC6901] references를 제공해야 MUST 한다. tm:optional의 JSON Pointers는 전체 interaction affordance Map definition으로 resolve되어야 MUST 한다.

다음 sample은 Event interaction overheating에 대한 tm:optional의 사용을 보여 준다.

71: interaction affordances를 위한 tm:optional term이 있는 Thing Model.
{
    "@context": ["https://www.w3.org/ns/wot-next/td"],
    "@type": "tm:ThingModel",
    "title": "Lamp Thing Model",
    "description": "Lamp Thing Model Description",
    "tm:optional": [
        "/events/overheating"
    ],
    "properties": {
        "status": {
            "description": "current status of the lamp (on|off)",
            "type": "string",
            "readOnly": true
        }
    },
    "actions": {
        "toggle": {
            "description": "Turn the lamp on or off"
        }
    },
    "events": {
        "overheating": {
            "description": "Lamp reaches a critical temperature (overheating)",
            "data": {"type": "string"}
        }
    }
}

Event overheating은 mandatory가 아니므로 Thing Description instance에서 사용할 수 없을 수도 있다.

Thing Model definition의 optional definition은 tm:ref 사용을 통해 다른 Thing Model에 의해 확장되는 경우 overwritten될 수 있다는 점에 유의하라:

72: 이전 Thing Model 예의 tm:optional을 overwrite하는 Thing Model.
{
    "@context": ["https://www.w3.org/ns/wot-next/td"],
    "@type": "tm:ThingModel",
    "title": "Lamp Thing Model (All Mandatory)",
    "description": "Lamp Thing Model description expects all interaction affordances (status, toggle, and overheating)",
    "links": [
       {
          "rel": "tm:extends",
          "href": "./lampThingModel.tm.jsonld",
          "type": "application/tm+json"
       }
    ],
    "events": {
        "overheating": {
            "tm:ref": "./lampThingModel.tm.jsonld#/events/overheating"
        }
    }
}

10.3.5 Placeholder

Thing Model은 TD instance에서 어떤 terms가 사용되어야 하는지 지정할 수 있지만, 그 값은 구체적이지 않고 TD instantiation 중에 처음 알려진다. TD instance terms는 미리 알려져 있지만 그 값은 알려져 있지 않은 경우, placeholder labeling을 Thing Model에서 사용할 수 MAY 있다. Thing Model에서 TD instance가 생성될 때 placeholder labeling은 concrete value(예: JSON number, JSON string, JSON object 등)로 대체되어야 MUST 한다. placeholder의 string-based pattern은 regular expression {{2}[ -~]+}{2}에 기반한 valid pattern(예: {{PLACEHOLDER_IDENTIFIER}})을 따라야 MUST 한다. {{}} 사이의 characters는 placeholder의 identifier name으로 사용된다. identifier name은 substitution process에서 placeholder를 식별하는 데 사용될 수 있다. placeholder는 JSON name-value pair의 value 안에 적용되어야 MUST 한다. JSON name-value pair의 non string-based value가 placeholder를 가지는 경우, 그 value는 (temporarily) string으로 typed되어야 MUST 한다. placeholder를 대체한 후, 예를 들어 Thing Description instance를 만들 때, original type은 해당 replaced value와 함께 적용된다.

다음 Thing Model 예는 여러 placeholders를 정의한다. placeholder map은 replacement를 적용하고 의도된 value type으로 transform하는 데 사용된다.

10.4 Thing Description Instances의 Derivation

Thing Models는 Sections 5. TD Information Model6. TD Representation Format에 정의된 restrictions를 기반으로 Thing Description을 생성하기 위한 templates로 사용될 수 있다. 이 process 중에는 valid한 Thing Description instances를 만들기 위해 communication 및 security metadata와 같은 누락된 data가 보완되어야 한다. Thing Model은 Section 5. TD Information Model6. TD Representation Format에 설명된 requirements를 충족할 수 없는 Thing Description으로 이어지는 inconsistencies가 없도록 정의되어야 MUST 한다. Thing Model에서 Thing Description instance를 derive하는 TM-to-TD generator는 다음 단계에 따라 이를 Partial TD로 transform한다:

마지막으로, TM-to-TD generator는 resulting Partial TD를 가져와 이 마지막 단계로 Thing Description으로 transform한다

Thing Modelid 값은 TD generation process를 위해 "id": "urn:example:{{RANDOM_ID_PATTERN}}"와 같은 placeholder를 제공하는 것이 권장된다. id pattern에 metadata를 포함하지 않도록 하라.

Thing Description instances는 Thing Model을 따르는 경우 어떤 type의 Thing Model에서 derived되었는지에 관한 information을 담을 수 있다. 이 context에서 linking concept은 다음 예에 표시된 것처럼 "rel": "type"과 함께 사용될 수 있다 (Section 5.3.4.1 Link도 참조):

TD는 한 번에 하나의 TM의 instance일 수만 있음에 유의하라. 즉 Thing Descriptions의 경우: links array는 "rel": "type"이 있는 entry를 최대 한 번만 사용해야 MUST 한다. Thing Description에서 다른 Things와의 모든 relationships를 반영하고 싶다면, TMs의 composition mechanism을 고려할 수 있다(Section 10.3.3 Composition 참조).

10.5

다음 Thing Model63에 표시된 model을 확장하고 dim property의 maximum 값을 overwrite한다

75: modified dim constrained로 Smart Control Lamp 확장
{
    "@context": ["https://www.w3.org/ns/wot-next/td"],
    "@type": "tm:ThingModel",
    "links" : [{
        "rel": "tm:extends",
        "href": "http://example.com/SmartControlLampTM",
        "type": "application/tm+json"
     }],
    "properties" : {
        "dim" : {
            "maximum": 200
        }
   }
}

Thing Model에서 derived되는 예상 Thing Description은 다음과 같다(HTTP Binding 및 basic security가 적용됨):

76: Thing Description
{
    "@context": ["https://www.w3.org/ns/wot-next/td"],
    "@type": "Thing",
    "title": "Smart Lamp Control",
    "securityDefinitions": {
        "basic_sc": {"scheme": "basic", "in": "header"}
    },
    "security": "basic_sc",
    "links" : [{
        "rel": "type",
        "href": "url/to/SmartLampControlModifiedDimTM",
        "type": "application/tm+json"
     }
   ],
   "properties" : {
        "onOff": {
            "type": "boolean",
            "forms": [{"href": "https://smartlamp.example.com/onoff"}]
        },
        "dim" : {
            "type": "integer",
            "minimum": 0,
            "maximum": 200,
            "forms": [{"href": "https://smartlamp.example.com/dim"}]
        }
   }
}

11. 보안 고려사항

일반적으로 WoT system을 보호하기 위해 취해지는 security measures는 해당 system이 직면할 수 있는 threats와 attackers, 그리고 보호해야 할 assets의 가치에 따라 달라진다. 다양한 상황에 맞게 조정할 수 있는 threat model을 포함하여 Web of Things에 대한 security(및 privacy) considerations의 자세한 논의는 informative document [WOT-SECURITY-GUIDELINES]에 제시되어 있다. 많은 WoT Things는 web services와 유사하며 동일한 technologies를 사용한다. 아래의 특정 security considerations에 더해, web services를 위한 OWASP Top 10 [OWASP-Top-10]과 같은 guide에서 논의되는 security risks 및 mitigations도 평가해야 하며, 적용 가능한 경우 처리해야 한다. 이 섹션에서는 WoT Thing Description과 직접 관련된 security risks 및 possible mitigations만 논의한다.

WoT Thing Description은 secure 및 insecure network interfaces를 모두 설명할 수 있다. Thing Description이 기존 network interface에 retro-fitted되는 경우, network interface의 security status에는 변화가 없을 것으로 예상된다.

WoT Thing Description의 사용은 다음 섹션에 주어진 security risks를 도입한다. 각 risk 뒤에는 가능한 mitigations를 제안한다.

11.1 TD 가로채기 및 변조

TDs를 가로채고 변조하는 것은 man-in-the-middle attacks를 시작하는 데 사용될 수 있다. 예를 들어 TDs의 URLs를 rewriting하여 accesses를 data를 capture하거나 manipulate할 수 있는 malicious intermediary로 redirect할 수 있다.

완화:
Thing Descriptions는 mutually authenticated secure channels를 통해서만 획득되는 것이 SHOULD 좋다. Mutual authentication은 Consumer와 TD provider가 communication의 상대방 identity를 모두 확신하도록 보장한다. 그러나 mutual authentication은 Consumer를 식별하는 데도 사용될 수 있으며, 이는 일부 경우 바람직하지 않을 수 있다(privacy risk). Consumer가 사람과 연관된 경우, 예를 들어 browsers의 경우, TDs는 TD provider만 authenticated되는 channel을 통해 획득될 수 MAY 있다.

11.2 Context 가로채기 및 변조

context definition files를 가로채고 변조하는 것은 vocabulary의 interpretation을 수정함으로써 attacks를 용이하게 하는 데 사용될 수 있다. HTTP와 같은 non-secure connections를 통해 Web에서 load되는 Context extensions(7. TD Context Extensions 참조)는 attacker에 의해 변경될 위험이 있으며, TD Information Model을 security를 compromise할 수 있는 방식으로 수정할 수 있다.

12.1 Context Fetching에서 권장된 것처럼, constrained implementations에서는 context definition files를 미리 설치하고 secure software update process를 사용해 관리해야 하며, context URLs는 known contexts를 식별하는 데만 사용하고 이를 가져오는 데 사용하지 않아야 한다. 따라서 이 consideration은 context definition files를 dynamically fetching하는 것이 그 외에는 피할 수 없는 경우에만 적용된다. 예를 들어 general semantic processing을 지원하는 directory service의 경우가 이에 해당한다.

완화:
이상적으로 context definition files는 mutual authentication으로 established된 secure channels를 통해서만 획득되어야 한다. 그러나 많은 contexts가 "plain" HTTP URLs를 사용하여 표시된다는 점은 주목할 만하며 (불행한 일이다). 그러나 HTTP protocol은 TLS를 사용하여 secure transport channel을 먼저 established하지 않고 사용될 경우 interception 및 modification에 취약하다. context definition file을 fetch해야 하는 경우, implementation은 HTTP URL만 주어졌더라도 먼저 TLS 위의 HTTP를 사용하려고 시도해야 한다.

11.3 제한된 기간의 접근

일부 scenarios에서는 특정 users에 의한 Things 집합에 대한 access의 scope와 duration을 제한하는 것이 바람직할 수 있다. 예를 들어 A가 B의 집을 방문하는 경우, B는 A가 사용할 수 있도록 garage door opener와 car charger에 대해 temporary 및 limited access를 A에게 제공하고자 할 수 있다. 그러나 scope는 A가 이러한 Things의 특정 administrative functions에 access할 수 없도록 제한될 수 있다(예: garage door가 열린 상태로 유지될 수 있는 시간을 변경하거나 charging rate를 변경하는 것). 또한 access는 A가 떠났을 것으로 예상되는 시점 이후, 예를 들어 1주 후에는 expire되어야 한다.

완화:
Things에 대한 access의 scope와 duration을 제한하기 위해, tokens는 access를 관리하는 데 사용되는 것이 SHOULD 좋다. 이는 OAuth2와 같은 mechanisms를 포함한다는 점에 유의하라. OAuth2는 user의 authentication 및 authorization을 verifying하는 것이 별도의 token provider service에 의해 처리되는 token generation flows를 제공한다. Token provider services(privacy를 위해 적절하거나 원하는 경우 Thing의 administrator가 직접 관리할 수도 있음)는 limited duration tokens를 제공하고 scopes를 사용하여 access를 제한할 수 있다. Scopes는 specific interactions에 대한 access를 제한할 수 있지만 duration을 제한하기에는 충분하지 않다. [RFC9200] 참조.

11.4 Vulnerability Auditing

예를 들어 WoT Discovery가 반환한 TDs처럼 TDs 집합에 access할 수 있는 attacker는 이 information을 사용하여 vulnerable devices를 식별하고 이에 대한 attacks를 계획할 수 있다.

완화:
IoT systems의 deployers는 동일한 information을 사용하여 자신의 IoT systems를 audit하고 vulnerable systems가 적절히 보호되는지 (필요하다면 transport security 및/또는 segmented networks와 같은 external means를 통해) 또는 hardened되었는지 확인할 수 있다. known-vulnerable systems에 대한 TDs를 discovery를 통해 사용할 수 없게 하는 것도 가능하다. 그러나 이는 security by obscurity가 poor defence이기 때문에 권장되는 approach가 아니다. TD가 limited distribution을 가지고 있더라도 attacker는 다른 수단으로 system을 여전히 discover할 수 있다. 그러나 "vulnerable"의 정의는 information이 제공되는 context와 그것이 누구에게 제공되는지에 따라 달라진다. 이상적으로는 TDs가 설명하는 Things에 access할 권한이 있는 사람들만 해당 TDs에 access해야 한다. vulnerability scanning이 우려되는 경우 auto security scheme을 사용할 수 MAY 있다.

11.5 Script Injection

TDs에 주어진 많은 strings, 특히 title/titlesdescription/descriptions에 담긴 values는 human-readable이 되도록 의도된다. application은 그러한 strings를 가져와 user interface를 생성하는 데 사용할 수 있다. 예를 들어, 사용 가능한 Things 집합을 titles 및 descriptions와 함께 나열하는 web dashboard가 있다. 이러한 interface가 string substitution을 사용하여 naive하게 생성되는 경우, 예를 들어 final HTML을 만들기 위해 이러한 strings의 values를 HTML template의 표시된 위치에 삽입하는 경우, 원래 string 안의 HTML markup은 dashboard를 표시하는 browser의 context에서 해석된다. attacker는 다양한 방식으로 scripts를 HTML에 embed하고, user interaction 시 또는 자동으로(예: page load 시 또는 의도적으로 발생시킬 수 있는 error 시) 이러한 scripts가 executed되도록 할 수 있다. string은 TD producer에 의해 생성되고 dashboard는 다른 origin에 의해 생성되므로, 이는 cross-site-scripting (XSS) attack의 한 형태이다.

완화:
TDs에서 sourced된 strings는 HTML을 생성할 때 다른 external string source와 동일하게, 즉 주의해서 다루어져야 한다. policy의 문제로, TDs에서 sourced된 strings는 모든 markup을 disables하는 carefully vetted HTML sanitizer를 사용해 sanitized되거나, 어떤 markup이든 escape하는 DOM node manipulation APIs를 사용하여 HTML template에 inserted되는 것이 강력히 권장된다. TDs에서 sourced된 strings가 MD files 또는 XML과 같은 다른 markup languages의 documents를 생성하는 데 사용될 수도 있다. 그러한 usages는 template에 insertion하기 전에 string values가 sanitized되도록 동등한 precautions를 취해야 한다. 불행히도 이러한 sanitization은 internationalization 목적으로 포함된 HTML markup도 disable한다. 예를 들어 bidirectional text에서 text rendering의 initial direction을 설정하기 위한 markup이 그렇다. HTML markup은 TD strings에서 internationalization 목적으로 사용되지 않는 것이 SHOULD NOT 좋다.

11.6 JSON Parsing

RFC 8259, section 12를 참조하라: JSON은 eval()을 사용하여 JavaScript로 parsed되어서는 안 된다. WoT Thing Description은 executable content를 담기 위한 것이 아니라, Thing metadata를 위한 pure data exchange format으로 의도된다. 그러나 (invalid) TD는 executed될 때 system의 security를 compromise하는 side effects를 가질 수 있는 JavaScript code를 포함할 수 있다.

완화:
WoT Thing Description JSON-LD serialization은 parsing을 위해 JavaScript의 eval() function과 같은 code execution mechanism을 통과해서는 안 MUST NOT 된다.
참고: 기타 Injection Risks

[WOT-DISCOVERY]에서 논의되는 추가 code injection risks가 있다. TDs의 다른 strings, 예를 들어 titledescription에 주어진 values는 SQL, HTML 또는 기타 executable contexts의 templates에서 사용되기 전에 sanitized되어야 한다. 그러나 이 risk는 JSON을 parsing할 때의 Javascript injection risk에 특별히 관한 것이다.

11.7 JSON-LD Expansion

JSON-LD processing은 일반적으로 short terms를 더 긴 IRIs [RFC3987]로 대체하는 것을 포함한다. 이러한 이유로 WoT Thing Descriptions는 JSON-LD 1.1 processor를 사용하여 processed될 때 상당히 expand될 수 있으며, 최악의 경우 resulting data가 recipient의 모든 resources를 consume하거나 exploitable buffer overflow를 유발할 수 있다.

완화:
Consumers는 JSON-LD processing 중 buffer overflow 및 resource exhaustion을 방지하기 위해 memory usage에 대한 limits를 설정하고 enforce하는 것이 SHOULD 좋다.

12. Privacy 고려사항

Privacy risks는 identifiable people과 Things의 association, 그리고 그러한 association으로부터 이용 가능한 direct information 및 inferred information에 따라 달라진다. 다양한 상황에 맞게 조정할 수 있는 threat model을 포함하여 Web of Things에 대한 privacy(및 security) considerations의 자세한 논의는 informative document [WOT-SECURITY-GUIDELINES]에 제시되어 있다. 이 섹션에서는 WoT Thing Description과 직접 관련된 privacy risks 및 possible mitigations만 논의한다.

WoT Thing Description의 사용은 다음 섹션에 주어진 privacy risks를 도입한다. 각 risk 뒤에는 가능한 mitigations를 제안한다.

12.1 Context Fetching

WoT Thing Descriptions는 JSON-LD 1.1 processor [json-ld11]로 평가될 수 있으며, 이는 일반적으로 remote contexts(즉, TD context extensions, 7. TD Context Extensions 참조)에 대한 links를 자동으로 따른다. 그 결과 각 파일에 대해 Consumer의 명시적 request 없이 files가 transfer된다. remote contexts가 third parties에 의해 served되는 경우, 그것들은 usage patterns 또는 유사한 information을 수집할 수 있으며, 이는 private information 또는 private information을 infer하는 데 사용될 수 있는 information의 disclosure로 이어질 수 있다. WoT의 경우 attacker는 그러한 fetches가 생성하는 network traffic도 observe할 수 있고, destination IP address와 같은 fetch의 metadata를 사용하여 device에 대한 information을 infer할 수 있다. 특히 domain-specific vocabularies가 사용되는 경우 그렇다. 이는 connection이 encrypted되어 있더라도 risk이며, DNS privacy leaks와 관련되어 있다. 관련 security risk이며 다음 mitigations로도 피할 수 있는 11.2 Context Interception and Tampering도 참조하라.

완화:
resource-constrained devices의 implementations는 JSON-LD processing이 아니라 raw JSON processing을 수행하고 limited set의 domain-specific extensions만 지원할 것으로 예상된다. supported extensions의 집합은 예를 들어 WoT Profile [WOT-PROFILES]에 의해 established될 수 있다. Constrained implementations는 statically 또는 secure update process의 일부로 managed되는, 검토된 supported context extensions versions를 사용하는 것이 SHOULD 좋다. Constrained implementations는 remote contexts에 대한 links를 따르지 않는 것이 SHOULD NOT 좋다. 이 경우 URLs는 extensions를 식별하는 데만 사용되고, 그 definitions를 fetch하는 데는 사용되지 않는다.

12.2 Immutable Identifiers

identifier(id)를 포함하는 Thing Description은 identifiable person과 associated된 Thing을 설명할 수 있다. 이러한 identifiers는 tracking을 포함한 다양한 risks를 초래한다. 그러나 identifier도 immutable인 경우, device가 다른 사람에게 sold 또는 given될 수 있고 알려진 ID가 그 사람을 track하는 데 사용될 수 있으므로 tracking risk는 증폭된다.

완화:

TD에서 사용되는 모든 identifiers는 mutable인 것이 SHOULD 좋으며, 특히 필요할 때 Thingid를 update하는 mechanism이 있는 것이 SHOULD 좋다. 구체적으로, Thingid는 hardware에 fixed되어서는 안 된다. 그러나 이는 identifiers가 fixed URIs라는 Linked Data ideal과 충돌한다. 그러나 policy의 문제로, configuration 또는 reinitialization에서 major changes가 있을 때 deployments가 identifiers를 update하는 것이 강력히 권장된다. configuration의 major changes의 예로는 Thing을 새 local area network로 이동시키는 것, 새 domain name을 assigning하는 것, 또는 Thing을 한 hub에서 unregister하고 새 hub에 register하는 것이 있다. 일반적으로 ownership의 잠재적 변화를 나타내는 configuration changes는 새 identifier가 생성되는 결과로 이어져야 한다. device의 operational phase 동안 더 frequent한 changes가 필요한 경우, change가 이루어질 때 authorized users에게만 identifier 변경을 notify하는 mechanism을 마련할 수 있다. 그러나 medical devices와 같은 일부 device classes는 일부 jurisdictions에서 법으로 immutable IDs를 요구할 수 있음에 유의하라. 이상적으로, required immutable identifiers는 property와 같은 affordances를 통해서만 제공되어야 하며, 그 value는 appropriate authentication and authorization 후에만 획득될 수 있고 TD identifier와 별도로 managed되어야 한다. immutable identifier를 TD identifier로 사용해야 하는 경우, 그러한 immutable identifiers를 포함하는 Thing Descriptions와 같은 files에 대한 secure access에 extra attention을 기울여야 한다.

12.3 Fingerprinting

위에서 언급했듯이 TD의 id member는 privacy risk를 초래할 수 있다. 그러나 tracking risk를 완화하기 위해 설명된 대로 id가 updated되더라도, fingerprinting을 통해 TD를 특정 physical device와 associate하고, 거기에서 identifiable person과 associate하는 것이 여전히 가능할 수 있다.

특정 device instance를 fingerprinting을 통해 식별할 수 없더라도, interactions 집합과 같은 TD의 information으로부터 device의 type을 infer하고, 이 type을 사용하여 medical condition과 같은 identifiable person에 대한 private information을 infer하는 것이 가능할 수 있다.

완화:
authorized users에게만 Thing의 Thing Description에 대한 access가 제공되는 것이 SHOULD 좋다. authorization level 및 use case에 필요한 information의 양만 TD에 제공되는 것이 SHOULD 좋다. TD가 secure 및 confidential channels를 통해 authorized users에게만 distributed되는 경우, 예를 들어 authentication을 요구하는 directory service를 통해 distributed되는 경우, external unauthorized parties는 TD에 access하여 fingerprint할 수 없다. 이 risk를 추가로 완화하려면, TD의 특정 use case에 필요하지 않은 information은 가능한 한 생략해야 한다. 예를 들어 Consumer가 Thing에 대한 state를 저장하지 않는 device와의 ad-hoc connection의 경우 id를 생략할 수 있다. Consumer가 자신의 use case에 특정 interactions를 필요로 하지 않는 경우, 그것들을 생략할 수 있다. Consumer가 특정 interactions를 사용할 권한이 없다면, 마찬가지로 생략할 수 있다.

12.4 ID Metadata

TD의 id field의 value는 full TD에 access할 수 없는 entities에게도 available해질 수 있다. id의 value가 device의 type 또는 owner와 같은 embedded metadata를 포함하는 경우, 이는 personal information을 infer하는 데 사용될 수 있다.

완화:
TD의 id value는 Thing을 설명하는 metadata 또는 TD 자체의 metadata를 포함하지 않는 것이 SHOULD NOT 좋다. TDs를 관리하기 위해 생성된 temporary ID, 예를 들어 database 또는 directory service의 ID는 Thing을 설명하는 metadata 또는 TD 자체의 metadata를 포함하지 않는 것이 SHOULD NOT 좋다. 12.5 Globally Unique Identifiers에서 권장된 random UUIDs를 사용하는 것도 이 risk를 완화한다.

12.5 Globally Unique Identifiers

Globally unique identifiers는 이를 create하고 distribute하기 위해 centralized authority가 필요하다면 privacy risk를 초래한다. 그 경우 third party가 identifiers에 대한 knowledge를 가지기 때문이다.

완화:
TDs의 id field는 의도적으로 globally unique일 필요가 없다. central registry를 요구하지 않고 distributed fashion으로 suitable IDs를 generate할 수 있는 여러 cryptographic mechanisms(예: random UUIDs)이 available하다. 이러한 mechanisms는 보통 duplicate identifiers를 generate할 probability가 매우 낮으며, 이는 system design에서 고려되어야 한다. 예를 들어 duplicates를 detecting하고 necessary한 경우 IDs를 regenerating하는 방식이다. IDs의 scope도 global일 필요는 없다. home 또는 factory 내와 같은 특정 context에서만 Things를 distinguish하는 identifiers를 사용하는 것은 acceptable하다. TD identifiers는 uniqueness의 높은 probability를 제공하는 UUIDs와 같은 distributed mechanism을 사용하여 generated되는 것이 SHOULD 좋다. TD identifiers는 centralized authority를 사용하여 generated되지 않는 것이 SHOULD NOT 좋다.

12.6 Personally Identifiable Information의 추론

많은 locales에서 users의 privacy를 보호하기 위해 personally identifiable information, 즉 특정 person과 associated될 수 있는 information의 handling에 관한 legal requirements가 있다. 그러한 information은 물론 IoT devices에 의해 직접 generated될 수 있다. 그러나 IoT devices의 existence와 metadata (Thing Description에 저장되는 종류의 data)도 personally identifiable information을 포함하거나 이를 infer하는 데 사용될 수 있다. 이 information은 어떤 person이 특정 type의 device를 소유한다는 사실처럼 단순할 수 있으며, 이는 그 person에 대한 추가 inferences로 이어질 수 있다.

완화:
policy의 문제로, personal devices와 associated된 Thing Descriptions는 이 information이 explicit하지 않더라도 personally identifiable information을 포함하는 것처럼 처리하는 것이 강력히 권장된다. 이 principle의 example application으로, user consent를 얻는 방법을 고려하라. Thing에 의해 generated된 personally identifiable data의 usage에 대한 consent는 data를 consuming하는 system과 Thing이 paired될 때 자주 obtained되며, 이는 Thing Description이 local directory에 registered되거나 device에 access하기 위해 Thing Description을 consuming하는 system에 registered되는 시점이기도 하다. 이 경우 Thing의 data 사용에 대한 consent는 Thing의 Thing Description access에 대한 consent와 결합될 수 있다. 두 번째 예로, TD가 personally identifiable information을 포함한다고 간주한다면, 그것은 indefinitely retained되거나 consent가 주어진 purposes 이외의 purposes로 사용되어서는 안 된다.

13. IANA 고려사항

13.1 application/td+json Media Type Registration

Type name:
application
Subtype name:
td+json
Required parameters:
없음
Optional parameters:
없음
Encoding considerations:
RFC 6839, section 3.1 참조.
Security considerations:
published specification의 11.2 Context Interception and Tampering, 11.6 JSON Parsing, 11.7 JSON-LD Expansion, 그리고 12.1 Context Fetching 참조.
Interoperability considerations:
RFC 8259 참조.

conforming 및 non-conforming content를 모두 processing하기 위한 rules는 이 specification에 정의되어 있다.

Published specification:
W3C Web of Things (WoT) Thing Description 1.1: https://www.w3.org/TR/wot-thing-description11/
Applications that use this media type:
W3C Web of Things의 모든 participating entities, 즉 Things, Consumers, 그리고 W3C Web of Things (WoT) Architecture 1.1: https://www.w3.org/TR/wot-architecture11/ document에 정의된 Intermediaries.
Fragment identifier considerations:
RFC 6839, section 3.1 참조.
Additional information:
Magic number(s):
해당 없음
File extension(s):
.jsontd
참고: 기타 Extensions

현재 IANA registration을 확인하라. 향후 .td.json 및 .td.jsonld도 허용될 수 있다.

Macintosh file type code(s):
TEXT
추가 정보를 위한 연락 담당자 및 email address:
Matthias Kovatsch <w3c@kovatsch.net>
Intended usage:
COMMON
Restrictions on usage:
없음
Author(s):
Web of Things (WoT) Thing Description specification은 Web of Things Working Group의 product이다.
Change controller:
W3C

13.2 application/tm+json Media Type Registration

Type name:
application
Subtype name:
tm+json
Required parameters:
없음
Optional parameters:
없음
Encoding considerations:
RFC 6839, section 3.1 참조.
Security considerations:
published specification의 11.2 Context Interception and Tampering, 11.6 JSON Parsing, 11.7 JSON-LD Expansion, 그리고 12.1 Context Fetching 참조.
Interoperability considerations:
RFC 8259 참조.

conforming 및 non-conforming content를 모두 processing하기 위한 rules는 이 specification에 정의되어 있다.

Published specification:
W3C Web of Things (WoT) Thing Description 1.1
Applications that use this media type:
W3C Web of Things의 모든 participating entities, 즉 Things, Consumers, 그리고 W3C Web of Things (WoT) Architecture 1.1 document에 정의된 Intermediaries.
Fragment identifier considerations:
RFC 6901, section 3section 6 참조. reserved characters는 percent encoded될 수 있음에 유의하라.
Additional information:
Magic number(s):
해당 없음
File extension(s):
.jsontm, .tm.json, .tm.jsonld (preferred file extension)
Macintosh file type code(s):
TEXT
추가 정보를 위한 연락 담당자 및 email address:
Sebastian.Kaebisch@siemens.com
Intended usage:
COMMON
Restrictions on usage:
없음
Author(s):
Web of Things (WoT) Thing Description specification은 Web of Things Working Group의 product이다.
Change controller:
W3C

13.3 CoAP Content-Format Registration

IANA는 CoAP Content-Formats subregistry 안에서 media types에 대한 compact CoAP Content-Format IDs를 assign한다. 이 subregistry는 Constrained RESTful Environments (CoRE) Parameters registry [RFC7252] 안에 있다. WoT Thing Description의 Content-Format ID는 432이고, WoT Thing Model의 경우 - (tbd)이다.

13.3.1 WoT Thing Description

Media Type:
application/td+json
Encoding:
-
ID:
432
Reference:
["Web of Things (WoT) Thing Description 1.1", April 2022]

13.3.2 WoT Thing Model

Media Type:
application/tm+json
Encoding:
-
ID:
433
Reference:
["Web of Things (WoT) Thing Description 1.1", April 2022]

A. Protocol Bindings가 있는 Example Thing Description Instances

이 섹션은 비규범적이다.

다음 TD 예는 HTTP, CoAP 및 MQTT Protocol Bindings를 사용한다. 이러한 TDs에는 http://www.example.org/coap-binding#http://www.example.org/mqtt-binding# namespaces를 통해 각각 접근할 수 있는 [HTTP-in-RDF10]와 유사한 CoAP-in-RDF 및 MQTT-in-RDF vocabularies가 있다고 가정하는 Context Extensions가 있다. "https://www.w3.org/2022/wot/td/v1.1"의 TD context는 이미 [HTTP-in-RDF10]를 포함하므로, HTTP context extensions는 직접 사용할 수 있음에 유의하라. 각 Binding Specification은 최신 vocabulary terms 및 examples를 포함한다는 점에 유의하라.

아래에서 보는 context extensions는 TD Consumer에 대해 다음 지시사항을 가진다:

먼저 single protocol을 가진 TDs를 보여 준다. 그런 다음, 각 interaction affordance가 하나의 protocol을 가진 하나의 form을 가지는 multiple protocols TDs를 소개한다.

A.1 CoAP Protocol Binding이 있는 MyLampThing 예

Thing의 feature list:

A.2 MQTT Protocol Binding이 있는 MyIlluminanceSensor 예

Thing의 feature list:

A.3 Webhook Event 예

Thing의 feature list:

참고

Thing에 대한 periodic POST request 대신, Consumer는 다음 POST request가 Thing에 의해 언제 제공되어야 하는지에 대한 information이 있는 response data를 제공할 수 있다. 이는 dataResponse field를 사용하여 설명된다.

A.4 HTTP, CoAP 및 MQTT Protocol Bindings가 있는 Lamp Thing

Thing의 feature list:

80: Form마다 하나의 Protocol이 있는 Lamp의 Multiprotocol TD
{
    "@context": [
        "https://www.w3.org/ns/wot-next/td",
        {
            "cov": "http://www.example.org/coap-binding#",
            "mqv": "http://www.example.org/mqtt-binding#",
            "htv": "http://www.w3.org/2011/http#"
        }
    ],
    "title": "LampThing",
    "id": "urn:dev:ops:32473-WoTLamp-1234",
    "securityDefinitions": {
        "nosec_sc": {
            "scheme": "nosec"
        }
    },
    "security": ["nosec_sc"],
    "properties": {
        "switchState": {
            "type": "boolean",
            "readOnly": true,
            "observable": false,
            "forms": [
                {
                    "href": "http://example.com/light/switchstate",
                    "op": "readproperty",
                    "contentType": "application/json",
                    "htv:methodName":"GET"
                }
            ]
        },
        "brightness": {
            "type": "number",
            "readOnly": true,
            "observable": false,
            "forms": [
                {
                    "href": "coap://example.com/light/brightness",
                    "op": "readproperty",
                    "contentType": "application/json",
                    "cov:method": "GET"
                }
            ]
        }
    },
    "actions": {
        "switchLight": {
            "input":  {
                "type": "boolean"
            },
            "forms": [
                {
                    "href": "http://example.com/switch/state",
                    "op": "invokeaction",
                    "contentType": "application/json",
                    "htv:methodName":"POST"
                }
            ]
        },
        "setBrightness": {
            "input":  {
                "type": "number",
                "maximum":255
            },
            "forms": [
                {
                    "href": "coap://example.com/light/brightness",
                    "op": "invokeaction",
                    "contentType": "application/json",
                    "cov:method": "POST"
                }
            ]
        }
    },
    "events":{
        "concentration": {
            "title": "Gas Concentration Event Stream",
            "data":{
                "type": "integer",
                "minimum": -1,
                "maximum": 65535
            },
            "forms": [
                {
                    "href": "mqtt://broker.com",
                    "contentType": "application/json",
                    "op": "subscribeevent",
                    "mqv:filter": "application/deviceid/sensor/concentration",
                    "mqv:controlPacket": "subscribe"
                }
            ]
        }
    }
}

A.5 HTTP, CoAP 및 MQTT Protocol Bindings의 혼합이 있는 Lamp Thing

Thing의 feature list:

81: Form마다 Multiple Protocols가 있는 Lamp의 Multiprotocol TD
{
    "@context": [
        "https://www.w3.org/ns/wot-next/td",
        {
            "cov": "http://www.example.org/coap-binding#",
            "mqv": "http://www.example.org/mqtt-binding#",
            "htv": "http://www.w3.org/2011/http#"
        }
    ],
    "title": "Lamp",
    "id": "urn:dev:ops:32473-WoTLamp-5678",
    "securityDefinitions": {
        "nosec_sc": {
            "scheme": "nosec"
        }
    },
    "security": ["nosec_sc"],
    "properties": {
        "switchState": {
            "type": "boolean",
            "readOnly": true,
            "observable": false,
            "forms": [
                {
                    "href": "http://example.com/light/switchstate",
                    "op": "readproperty",
                    "contentType": "application/json",
                    "htv:methodName":"GET"
                },
                {
                    "href": "coap://example.com/light/switchstate",
                    "op": "readproperty",
                    "contentType": "application/json",
                    "cov:method": "GET"
                }
            ]
        },
        "brightness": {
            "type": "number",
            "readOnly": true,
            "observable": true,
            "forms": [
                {
                    "href": "http://example.com/light/switchstate",
                    "op": "readproperty",
                    "contentType": "application/json",
                    "htv:methodName":"GET"
                },
                {
                    "href": "coap://example.com/light/switchstate",
                    "op": "readproperty",
                    "contentType": "application/json",
                    "cov:method": "GET"
                },
                {
                    "href": "mqtt://broker.com",
                    "mqv:filter": "application/deviceid/sensor/brightness",
                    "op": "observeproperty",
                    "mqv:controlPacket": "subscribe"
                }
            ]
        }
    },
    "actions": {
        "switchLight": {
            "input":  {
                "type": "boolean"
            },
            "forms": [
                {
                    "href": "http://example.com/switch/state",
                    "op": "invokeaction",
                    "contentType": "application/json",
                    "htv:methodName":"POST"
                }
            ]
        },
        "setBrightness": {
            "input":  {
                "type": "number",
                "maximum":255
            },
            "forms": [
                {
                    "href": "coap://example.com/light/brightness",
                    "op": "invokeaction",
                    "contentType": "application/json",
                    "cov:method": "POST"
                }
            ]
        }
    },
    "events":{
        "concentration": {
            "title": "Gas Concentration Event Stream",
            "data":{
                "type": "integer",
                "minimum": -1,
                "maximum": 65535
            },
            "forms": [
                {
                    "href": "mqtt://broker.com",
                    "contentType": "application/json",
                    "op": "subscribeevent",
                    "mqv:filter": "application/deviceid/sensor/concentration",
                    "mqv:controlPacket": "subscribe"
                },
                {
                    "cov:method": "GET",
                    "href": "coap://example.com/sensor/gasconcentration",
                    "contentType": "application/json",
                    "op": "subscribeevent",
                    "subprotocol": "cov:observe"
                }
            ]
        }
    }
}

B. TD Instance Validation을 위한 JSON Schema

이 섹션은 비규범적이다.

JSON 기반 형식으로 직렬화된 Thing Description instances를 구문적으로 검증하기 위한 JSON Schema [JSON-SCHEMA] document는 https://www.w3.org/ns/wot-next/td-schema에서 사용할 수 있다. 이 JSON Schema는 Default Values가 있는 terms가 존재할 것을 요구하지 않는다. 따라서 Default Values가 있는 terms는 optional이다. (5.4 Default Value Definitions도 참조)

참고

이 문서에 의해 정의되는 Thing Description은 JSON-LD [json-ld11]에서 알려진 @context mechanism을 사용하여 external vocabularies를 추가할 수 있게 하며, 그러한 external vocabularies의 terms는 5. TD Information Model에 정의된 terms에 더해 사용될 수 있다. 이러한 이유로 아래 JSON schema는 그 점에서 의도적으로 non-strict하다. external vocabularies가 사용되지 않는 경우 더 엄격한 validation을 수행하기 위해 서로 다른 scopes/levels에서 additionalProperties schema property의 값 truefalse로 바꿀 수 있다.

C. Thing Descriptions에서의 contentType 사용

이 섹션은 비규범적이다.

request와 response의 variation에 관한 여러 case는 5.3.4.2.2 Response-related Terms Usage에서 설명된다. 아래 tables는 이러한 cases를 간결한 방식으로 요약한다. tables는 single contentType과 같은 더 단순한 cases에서 시작하여, multiple contentTypes와 같은 더 복잡한 cases로 나아간다. 모든 tables에서 messages는 Thing의 관점에서 본다. 여기서 input은 Consumer에서 Thing으로 보내는 messages(예: request)를 의미하고 output은 Thing에서 Consumer로 보내는 messages(예: response)를 의미한다.

cases에는 번호가 매겨져 있으며, 이는 tables 뒤의 examples와 연결하는 데 사용할 수 있다.

32 input과 output 모두 같은 contentType을 사용하는 single contentType case
Case 필요한 Terms 설명 Consumer 동작 Thing 동작
Case 1A: Input 있음, output 없음 form 안의 contentType contentType은 input만 가리킨다
  • form에서 사용할 수 있는 contentType에 따라 input payload를 encode한다.
  • 사용된 protocol에서 가능하다면, contentType의 값을 input header에 추가한다.
  • 사용된 protocol에서 가능하다면, input header contentType을 사용하여 input payload를 decode한다.
  • 사용된 protocol에서 가능하지 않거나 사용할 수 없는 경우, form에서 사용할 수 있는 해당 contentType으로 output payload를 decode한다.
Case 1B: Input 없음, output 있음. form 안의 contentType. contentType은 output만 가리킨다.
  • 사용된 protocol에서 가능하다면, form에서 사용할 수 있는 contentType에 대한 preference를 input header에 추가한다.
  • 사용된 protocol에서 가능하다면, output header contentType을 사용하여 output payload를 decode한다.
  • 사용된 protocol에서 가능하지 않거나 사용할 수 없는 경우, form에서 사용할 수 있는 해당 contentType으로 output payload를 decode한다.
  • form에서 사용할 수 있는 해당 contentType으로 output payload를 encode한다.
  • 사용된 protocol에서 가능하다면, contentType의 값을 output header에 추가한다.
Case 1C: Input과 output이 있으며, messages에 대해 같은 contentType. form 안의 contentType. contentType은 input과 output 모두를 가리킨다.
  • form에서 사용할 수 있는 contentType에 따라 input payload를 encode한다.
  • 사용된 protocol에서 가능하다면, contentType의 값을 input header에 추가한다.
  • 사용된 protocol에서 가능하다면, contentType의 값을 사용하여 output payload의 contentType에 대한 preference를 input header에 추가한다.
  • 사용된 protocol에서 가능하다면, output header contentType을 사용하여 output payload를 decode한다.
  • 사용된 protocol에서 가능하지 않거나 사용할 수 없는 경우, form에서 사용할 수 있는 해당 contentType으로 output payload를 decode한다.
  • 사용된 protocol에서 가능하다면, input header contentType을 사용하여 input payload를 decode한다.
  • 사용된 protocol에서 가능하지 않거나 사용할 수 없는 경우, form에서 사용할 수 있는 해당 contentType으로 input payload를 decode한다.
  • form에서 사용할 수 있는 해당 contentType으로 output payload를 encode한다.
  • 사용된 protocol에서 가능하다면, contentType의 값을 output header에 추가한다.

다음 table은 operation input이 서로 다른 contentTypes를 accept할 수 있거나 output이 서로 다른 contentTypes를 return할 수 있는 cases와 관련된 추가 variations를 고려한다. Interaction Affordance가 multiple forms를 가지는 경우가 있을 수 있다. multiple forms가 있는 그러한 cases는 위와 아래 table의 cases 조합으로 처리되어야 한다.

33 input과 output이 서로 다른 contentTypes를 사용할 수 있고 multiple forms가 있을 수 있는 multiple contentType case
Case 필요한 Terms 설명 Consumer 동작 Thing 동작
Case 2A: Single input과 single output이 있으며, messages에 대해 서로 다른 contentType. form 안의 contentTyperesponse. response는 다른 값을 가진 contentType을 가진다. form level의 contentType은 input을 가리키고 response(response-level)의 contentType은 output을 가리킨다
  • form level에서 사용할 수 있는 contentType에 따라 input payload를 encode한다.
  • 사용된 protocol에서 가능하다면, form-level contentType의 값을 input header에 추가한다.
  • 사용된 protocol에서 가능하다면, response-level contentType을 사용하여 output payload의 contentType에 대한 preference를 input header에 추가한다.
  • 사용된 protocol에서 가능하다면, output header contentType을 사용하여 output payload를 decode한다.
  • 사용된 protocol에서 가능하지 않거나 사용할 수 없는 경우, response level에서 사용할 수 있는 해당 contentType으로 output payload를 decode한다.
  • 사용된 protocol에서 가능하다면, input header를 사용하여 input payload를 decode한다.
  • 사용된 protocol에서 가능하지 않거나 사용할 수 없는 경우, form level에서 사용할 수 있는 해당 contentType으로 input payload를 decode한다.
  • response level에서 사용할 수 있는 해당 contentType으로 output payload를 encode한다.
  • 사용된 protocol에서 가능하다면, response-level contentType의 값을 output header에 추가한다.
Case 2B: Input과 multiple possible outputs가 있으며, messages에 대해 같은 contentType form 안의 contentTypeadditionalResponses. additionalResponses array items 안의 schema가 필요할 수 있다. form level의 contentType은 input과 normal output을 가리킨다. default value rule이 적용되므로 additionalResponses에는 contentType이 필요하지 않다. 실제로 single contentType이 있으므로 이는 같은 case(Case 1C)이다. 그러나 output에서 서로 다른 Data Schemas가 전달될 수 있으므로, form 안의 additionalResponsesschema terms가 필요하다. Case 1C 참조 Case 1C 참조
Case 2C: Input과 multiple possible outputs가 있으며, output messages에 대해 서로 다른 contentType form 안의 contentType, additionalResponses 및 가능하다면 response. additionalResponses는 서로 다른 contentTypes를 가진 output messages를 위해 contentType이 필요하다. 이는 TD에서 서로 다른 방식으로 설명될 수 있는 가장 복잡한 case이다. form level의 contentType은 input과, output이 같은 contentType인 경우(case 1C처럼) expected output을 가리킨다. response 안의 contentType은 output이 서로 다른 contentType인 경우(case 2A처럼) expected output을 가리킨다. additionalResponses 안의 contentType은 다른 possible outputs를 가리킨다.
  • form level에서 사용할 수 있는 contentType에 따라 input payload를 encode한다.
  • 사용된 protocol에서 가능하다면, form-level contentType의 값을 input header에 추가한다.
  • 사용된 protocol에서 가능하다면, output header contentType을 사용하여 output payload를 decode한다.
  • 사용된 protocol에서 가능하지 않거나 사용할 수 없는 경우, response level에서 사용할 수 있는 해당 contentType 또는 additionalResponses 안의 contentTypes 중 하나로 output payload를 decode한다.
  • 사용된 protocol에서 가능하다면, input header를 사용하여 input payload를 decode한다.
  • 사용된 protocol에서 가능하지 않거나 사용할 수 없는 경우, form level에서 사용할 수 있는 해당 contentType으로 input payload를 decode한다.
  • response level에서 사용할 수 있는 해당 contentType 또는 additionalResponses 안의 contentTypes 중 하나로 output payload를 encode한다. output이 error case와 관련된 경우, "success":false가 있는 form 안의 contentType을 사용한다
  • 사용된 protocol에서 가능하다면, 사용된 contentType의 값을 output header에 추가한다.

D. JSON-LD Context Usage

이 섹션은 비규범적이다.

현재 specification은 TD Information Model을 서로 다른 Vocabularies, 즉 Vocabulary Terms의 집합들에 대한 constraints의 집합으로 도입한다. 이 섹션은 TD document의 mandatory @context를 사용하여 이러한 constraints의 machine-readable definition을 client applications에 통합할 수 있는 방법을 간단히 설명한다.

TD document에서 TD Information Model에 접근하는 것은 두 단계로 이루어진다. 첫째, clients는 JSON strings에서 IRIs로의 mapping을 retrieve해야 한다. 이 mapping은 뒤에서 설명하는 것처럼 JSON-LD context로 정의된다. 둘째, clients는 이러한 IRIs를 dereferencing하여 그 IRIs에 정의된 constraints에 접근할 수 있다. Constraints는 RDF format의 logical axioms로 정의되며, client programs가 바로 interpret할 수 있다.

Vocabulary Terms5. TD Information Model에서 referenced되는 모든 terms는 TD document에서 (compact) JSON strings로 serialized된다. 그러나 이러한 각 term은 첫 번째 Linked Data principle [LINKED-DATA]에 따라 full IRI로 명확히 identified된다. JSON keys에서 IRIs로의 mappings가 TD의 @context value가 가리키는 것이다. 예를 들어, 다음 위치의 file은

https://www.w3.org/ns/wot-next/td

다음 mappings를 포함한다(그 밖에도 있음):

properties https://www.w3.org/2019/wot/td#hasPropertyAffordance
object https://www.w3.org/2019/wot/json-schema#ObjectSchema
basic https://www.w3.org/2019/wot/security#BasicSecurityScheme
href https://www.w3.org/2019/wot/hypermedia#hasTarget
...

이 JSON file은 JSON-LD 1.1 syntax [JSON-LD11]를 따른다. 수많은 JSON-LD libraries는 TD의 @context를 자동으로 process하고 그것이 포함하는 모든 JSON strings를 expand할 수 있다.

TD의 모든 Vocabulary Term이 IRI로 expanded되면, 두 번째 단계는 이 IRI를 dereferencing하여 해당 Vocabulary Term을 가리키는 TD Information Model의 fragments를 얻는 것이다. 예를 들어 IRI

https://www.w3.org/2019/wot/json-schema#ObjectSchema

를 dereferencing하면 term ObjectSchemaClass이며, 더 정확히는 DataSchema의 sub-class라고 stating하는 RDF document가 나온다. 이러한 logical axioms는 다양한 complexity의 formalisms를 사용해 RDF로 represented된다. 여기서는 sub-class relations가 RDF Schema axioms [RDF-SCHEMA]로 표현된다. 또한 이러한 axioms는 다양한 formats로 serialized될 수 있다. 여기서는 Turtle format [TURTLE]으로 serialized된다:

<https://www.w3.org/2019/wot/json-schema#ObjectSchema>
    a rdfs:Class .
<https://www.w3.org/2019/wot/json-schema#ObjectSchema>
    rdfs:subClassOf <https://www.w3.org/2019/wot/json-schema#DataSchema> .

기본적으로 user agent가 content negotiation을 수행하지 않는 경우, RDF document 대신 human-readable HTML documentation이 반환된다. content를 negotiate하려면 clients는 request에 HTTP header Accept: text/turtle를 포함해야 한다.

E. IoT Platforms 및 Standards의 Payloads와 Data Schemas 예

이 섹션은 비규범적이다.

8.1.2.2 Data Schemas의 extension으로서, 이 섹션은 서로 다른 payloads와 그에 대응하는 DataSchema의 examples를 모은다. 이들은 잘 알려진 IoT Platforms 및 Standards에서 가져온 것이며, payload가 가질 수 있는 다양한 모습과 이를 Data Schema로 설명할 수 있는 방법을 보여 주는 것을 목표로 한다.

SenML [RFC8428]은 다음 construct를 사용할 수 있다:

82: SenML Payload 예
[
    {
        "bn": "/example/light/"
    },
    {
        "n": "level",
        "v": 50
    },
    {
        "n": "time",
        "v": 10
    }
]
83: SenML Payload 예를 위한 Data Schema
{
    "type": "array",
    "items": [
    {
        "type": "object",
        "properties": {
            "bn": {
                "type": "string",
                "const": "example/light"
            }
        }
    },
    {
        "type": "object",
        "properties": {
            "n": {
                "type": "string",
                "const": "level"
            },
            "v": {
                "@type": ["iot:LevelData"],
                "type": "integer",
                "minimum": 0,
                "maximum": 255
            }
        }
    },
    {
        "type": "object",
        "properties": {
            "n": {
                "type": "string",
                "const": "time"
            },
            "v": {
                "@type": ["iot:TransitionTimeData"],
                "type": "integer",
                "minimum": 0,
                "maximum": 65535
            }
        }
    }
    ]
}

OCF[OCF]에 따른 Batch Collection은 다음과 같이 structured될 수 있다:

84: OCF Batch 예
[
{
    "href": "/example/light/level",
    "rep": {
    "dimmingSetting": 50
    }
},
{
    "href": "/example/light/time",
    "rep": {
    "rampTime": 10
    }
}
]
85: OCF Batch Payload 예를 위한 Data Schema
{
"type": "array",
"items": [
    {
    "type": "object",
    "properties": {
        "href": {
        "type": "string",
        "const": "/example/light/level"
        },
        "rep": {
        "type": "object",
        "properties": {
            "dimmingSetting": {
            "@type": ["iot:LevelData"],
            "type": "integer",
            "minimum": 0,
            "maximum": 255
            }
        }
        }
    }
    },
    {
    "type": "object",
    "properties": {
        "href": {
        "type": "string",
        "const": "/example/light/time"
        },
        "rep": {
        "type": "object",
        "properties": {
            "rampTime": {
            "@type": ["iot:TransitionTimeData"],
            "type":"integer",
            "minimum": 0,
            "maximum": 65535
            }
        }
        }
    }
    }
]
}

그리고 LWM2M [LWM2M]의 IPSO Smart Object는 다음과 같을 수 있다:

86: IPSO/LWM2M Payload 예
{
"bn": "/3001/0/",
"e": [
    {
    "n": "5044",
    "v": 0.5
    },
    {
    "n": "5002",
    "v": 10.0
    }
]
}
87: IPSO/LWM2M Payload 예를 위한 Data Schema
{
"type": "object",
"properties": {
    "bn": {
    "type": "string",
    "const": "/3001/0/"
    },
    "e": {
    "type": "array",
    "items": [
        {
        "type": "object",
        "properties": {
            "n": {
            "type": "string",
            "const": "5044"
            },
            "v": {
            "@type": ["iot:LevelData"],
            "type": "number",
            "minimum": 0.0,
            "maximum": 1.0
            }
        }
        },
        {
        "type": "object",
        "Properties": {
            "n": {
            "type": "string",
            "const": "5002"
            },
            "v": {
            "@type": ["iot:TransitionTimeData"],
            "type": "number",
            "minimum": 0.0,
            "maximum": 6553.5
            }
        }
        }
    ]
    }
}
}

F. 최근 Specification Changes

F.1 Recommendation 2023년 12월 05일로부터의 Changes

G. 감사의 말

편집자들은 contributions, guidance 및 expertise를 제공해 준 Cristiano Aguzzi, Thomas Jäckle, Jan Romann, Elodie Thiéblin, Michael Koster, Michael Lagally, Kazuyuki Ashimura, Daniel Peintner, Toru Kawaguchi, María Poveda, Dave Raggett, Kunihiko Toumura, Takeshi Yamada, Ben Francis, Manu Sporny, Klaus Hartke, Addison Phillips, Jose M. Cantera, Tomoaki Mizushima, Soumya Kanti Datta 및 Benjamin Klotz에게 특별히 감사하고자 한다.

또한 이 document의 improvements로 이어진 support, technical input 및 suggestions를 제공해 준 W3C staff와 W3C Web of Things Interest Group(WoT IG) 및 Working Group(WoT WG)의 현재 및 이전 active Participants 모두에게 깊이 감사한다.

마지막으로, WoT IG를 그 inception부터 2년 동안 이끌고 group이 Thing Description을 포함한 WoT building blocks의 concept을 마련하도록 guide한 Joerg Heuer에게 특별히 감사한다.

참고

non-listed references와 관련된 temporary ReSpec fix: [RFC6068], [RFC3966], [html], [RFC6750], [RFC7519], [RFC7797], [RFC8392], [RFC7516], [LDML], [SEMVER], [RFC7617], [RFC7616]

H. 참고문헌

H.1 규범 참고문헌

[APPMANIFEST]
Web Application Manifest. Marcos Caceres; Kenneth Christiansen; Diego Gonzalez-Zuniga; Daniel Murphy; Christian Liebel. W3C. 2025년 9월 3일. W3C Working Draft. URL: https://www.w3.org/TR/appmanifest/
[BCP47]
Tags for Identifying Languages. A. Phillips, Ed.; M. Davis, Ed. IETF. 2009년 9월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc5646
[ECMA-262]
ECMAScript Language Specification. Ecma International. URL: https://tc39.es/ecma262/multipage/
[eventsource]
Server-Sent Events. Ian Hickson. W3C. 2021년 1월 28일. W3C Recommendation. URL: https://www.w3.org/TR/eventsource/
[IANA-MEDIA-TYPES]
Media Types. IANA. URL: https://www.iana.org/assignments/media-types/
[iana-web-socket-registry]
IANA Registry for Websocket Subprotocols. IANA. 2019년 5월 24일. URL: https://www.iana.org/assignments/websocket/websocket.xml#subprotocol-name
[json-ld11]
JSON-LD 1.1. Gregg Kellogg; Pierre-Antoine Champin; Dave Longley. W3C. 2020년 7월 16일. W3C Recommendation. URL: https://www.w3.org/TR/json-ld11/
[json-schema]
JSON Schema: A Media Type for Describing JSON Documents. Austin Wright; Henry Andrews; Ben Hutton; Greg Dennis. Internet Engineering Task Force (IETF). 2022년 6월 10일. Internet-Draft. URL: https://datatracker.ietf.org/doc/html/draft-bhutton-json-schema
[OWASP-Top-10]
OWASP Top Ten. OWASP. URL: https://owasp.org/www-project-top-ten/
[RFC2045]
Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies. N. Freed; N. Borenstein. IETF. 1996년 11월. Draft Standard. URL: https://www.rfc-editor.org/rfc/rfc2045
[RFC2046]
Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types. N. Freed; N. Borenstein. IETF. 1996년 11월. Draft Standard. URL: https://www.rfc-editor.org/rfc/rfc2046
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. 1997년 3월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC2616]
Hypertext Transfer Protocol -- HTTP/1.1. R. Fielding; J. Gettys; J. Mogul; H. Frystyk; L. Masinter; P. Leach; T. Berners-Lee. IETF. 1999년 6월. Draft Standard. URL: https://www.rfc-editor.org/rfc/rfc2616
[RFC3339]
Date and Time on the Internet: Timestamps. G. Klyne; C. Newman. IETF. 2002년 7월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc3339
[RFC3629]
UTF-8, a transformation format of ISO 10646. F. Yergeau. IETF. 2003년 11월. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc3629
[RFC3966]
The tel URI for Telephone Numbers. H. Schulzrinne. IETF. 2004년 12월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc3966
[RFC3986]
Uniform Resource Identifier (URI): Generic Syntax. T. Berners-Lee; R. Fielding; L. Masinter. IETF. 2005년 1월. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc3986
[RFC3987]
Internationalized Resource Identifiers (IRIs). M. Duerst; M. Suignard. IETF. 2005년 1월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc3987
[RFC4180]
Common Format and MIME Type for Comma-Separated Values (CSV) Files. Y. Shafranovich. IETF. 2005년 10월. Informational. URL: https://www.rfc-editor.org/rfc/rfc4180
[RFC4279]
Pre-Shared Key Ciphersuites for Transport Layer Security (TLS). P. Eronen, Ed.; H. Tschofenig, Ed. IETF. 2005년 12월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc4279
[RFC4648]
The Base16, Base32, and Base64 Data Encodings. S. Josefsson. IETF. 2006년 10월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc4648
[RFC5364]
Extensible Markup Language (XML) Format Extension for Representing Copy Control Attributes in Resource Lists. M. Garcia-Martin; G. Camarillo. IETF. 2008년 10월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc5364
[RFC6068]
The 'mailto' URI Scheme. M. Duerst; L. Masinter; J. Zawinski. IETF. 2010년 10월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc6068
[RFC6570]
URI Template. J. Gregorio; R. Fielding; M. Hadley; M. Nottingham; D. Orchard. IETF. 2012년 3월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc6570
[RFC6741]
Identifier-Locator Network Protocol (ILNP) Engineering Considerations. RJ Atkinson; SN Bhatti. IETF. 2012년 11월. Experimental. URL: https://www.rfc-editor.org/rfc/rfc6741
[RFC6749]
The OAuth 2.0 Authorization Framework. D. Hardt, Ed. IETF. 2012년 10월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc6749
[RFC6901]
JavaScript Object Notation (JSON) Pointer. P. Bryan, Ed.; K. Zyp; M. Nottingham, Ed. IETF. 2013년 4월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc6901
[RFC7252]
The Constrained Application Protocol (CoAP). Z. Shelby; K. Hartke; C. Bormann. IETF. 2014년 6월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7252
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. 2017년 5월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC8252]
OAuth 2.0 for Native Apps. W. Denniss; J. Bradley. IETF. 2017년 10월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8252
[RFC8259]
The JavaScript Object Notation (JSON) Data Interchange Format. T. Bray, Ed. IETF. 2017년 12월. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc8259
[RFC8288]
Web Linking. M. Nottingham. IETF. 2017년 10월. Proposed Standard. URL: https://httpwg.org/specs/rfc8288.html
[RFC8949]
Concise Binary Object Representation (CBOR). C. Bormann; P. Hoffman. IETF. 2020년 12월. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc8949
[RFC9112]
HTTP/1.1. R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed. IETF. 2022년 6월. Internet Standard. URL: https://httpwg.org/specs/rfc9112.html
[SEMVER]
Semantic Versioning 2.0.0. Tom Preston-Werner. 2017년 12월 26일. URL: https://semver.org/
[STRING-META]
Strings on the Web: Language and Direction Metadata. Richard Ishida; Addison Phillips. W3C. 2024년 10월 17일. W3C Working Group Note. URL: https://www.w3.org/TR/string-meta/
[websub]
WebSub. Julien Genestoux; Aaron Parecki. W3C. 2018년 1월 23일. W3C Recommendation. URL: https://www.w3.org/TR/websub/
[WOT-ARCHITECTURE]
Web of Things (WoT) Architecture 1.1. Michael Lagally; Ryuichi Matsukura; Kunihiko Toumura. W3C. 2020년 11월. URL: https://www.w3.org/TR/wot-architecture11/
[wot-architecture11]
Web of Things (WoT) Architecture 1.1. Michael Lagally; Ryuichi Matsukura; Kunihiko Toumura; Michael McCool. W3C. 2023년 12월 5일. W3C Recommendation. URL: https://www.w3.org/TR/wot-architecture11/
[WOT-BINDING-REGISTRY]
Web of Things (WoT) Binding Registry. Ege Korkan. W3C. TODO. URL: https://www.w3.org/TR/wot-binding-registry/
[WOT-PROFILES]
Web of Things (WoT) Profile. Michael Lagally; Michael McCool; Ryuichi Matsukura; Sebastian Kaebisch; Tomoaki Mizushima. W3C. 2020년 11월. URL: https://www.w3.org/TR/wot-profile/
[WOT-SECURITY-GUIDELINES]
Web of Things (WoT) Security and Privacy Guidelines. Michael McCool; Elena Reshetova. W3C. 2021년 7월. URL: https://w3c.github.io/wot-security/
[WOT-THING-DESCRIPTION]
Web of Things (WoT) Thing Description. Sebastian Käbisch; Takuki Kamiya; Michael McCool; Victor Charpenay; Matthias Kovatsch. W3C. 2020년 4월 9일. W3C Recommendation. URL: https://www.w3.org/TR/wot-thing-description/
[wot-thing-description10]
Web of Things (WoT) Thing Description. Sebastian Käbisch; Takuki Kamiya; Michael McCool; Victor Charpenay; Matthias Kovatsch. W3C. 2020년 4월 9일. W3C Recommendation. URL: https://www.w3.org/TR/wot-thing-description10/
[XML]
Extensible Markup Language (XML) 1.0 (Fifth Edition). Tim Bray; Jean Paoli; Michael Sperberg-McQueen; Eve Maler; François Yergeau et al. W3C. 2008년 11월 26일. W3C Recommendation. URL: https://www.w3.org/TR/xml/
[XMLSCHEMA11-2-20120405]
W3C XML Schema Definition Language (XSD) 1.1 Part 2: Datatypes. David Peterson; Sandy Gao; Ashok Malhotra; Michael Sperberg-McQueen; Henry Thompson; Paul V. Biron et al. W3C. 2012년 4월 5일. W3C Recommendation. URL: https://www.w3.org/TR/2012/REC-xmlschema11-2-20120405/

H.2 정보 참고문헌

[html]
HTML Standard. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[HTTP-in-RDF10]
HTTP Vocabulary in RDF 1.0. Johannes Koch; Carlos A. Velasco; Philip Ackermann. W3C. 2017년 2월 2일. W3C Working Group Note. URL: https://www.w3.org/TR/HTTP-in-RDF10/
[IANA-URI-SCHEMES]
Uniform Resource Identifier (URI) Schemes. IANA. URL: https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml
[JSON-SCHEMA-ONTOLOGY]
JSON Schema in RDF. Victor Charpenay; Maxime Lefrançois; María Poveda Villalón. W3C. 2022년 7월. URL: https://www.w3.org/2019/wot/json-schema
[LDML]
Unicode Technical Standard #35: Unicode Locale Data Markup Language (LDML). Mark Davis; CLDR Contributors. 2022년 3월. URL: https://unicode.org/reports/tr35/
[LINKED-DATA]
Linked Data Design Issues. Tim Berners-Lee. W3C. 2006년 7월 27일. W3C-Internal Document. URL: https://www.w3.org/DesignIssues/LinkedData.html
[LINKSET-MEDIA-TYPES]
Linkset: Media Types and a Link Relation Type for Link Sets. Erik Wilde; Herbert Van de Sompel. IETF. URL: https://datatracker.ietf.org/doc/draft-ietf-httpapi-linkset/
[LWM2M]
Lightweight M2M. Open Mobility Alliance. URL: https://www.omaspecworks.org/what-is-oma-specworks/iot/lightweight-m2m-lwm2m/
[MQTT]
MQTT Version 3.1.1. Andrew Banks; Rahul Gupta. OASIS. 2015년 12월. OASIS Standard Incorporating Approved Errata 01. URL: http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html
[OCF]
OCF Specification. Open Connectivity Foundation. 마지막 접근: 2020년 2월. URL: https://openconnectivity.org/developer/specifications/
[OPENAPI]
OpenAPI Specification: Version 3.0.1. Darrel Miller; Jeremy Whitlock; Marsh Gardiner; Mike Ralphson; Ron Ratovsky; Uri Sarid. OpenAPI Initiative, Linux Foundation. 2017년 12월 6일. URL: https://spec.openapis.org/oas/v3.0.1
[RDF-SCHEMA]
RDF Schema 1.1. Dan Brickley; Ramanathan Guha. W3C. 2014년 2월 25일. W3C Recommendation. URL: https://www.w3.org/TR/rdf-schema/
[RFC6750]
The OAuth 2.0 Authorization Framework: Bearer Token Usage. M. Jones; D. Hardt. IETF. 2012년 10월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc6750
[RFC7516]
JSON Web Encryption (JWE). M. Jones; J. Hildebrand. IETF. 2015년 5월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7516
[RFC7519]
JSON Web Token (JWT). M. Jones; J. Bradley; N. Sakimura. IETF. 2015년 5월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7519
[RFC7616]
HTTP Digest Access Authentication. R. Shekh-Yusef, Ed.; D. Ahrens; S. Bremer. IETF. 2015년 9월. Proposed Standard. URL: https://httpwg.org/specs/rfc7616.html
[RFC7617]
The 'Basic' HTTP Authentication Scheme. J. Reschke. IETF. 2015년 9월. Proposed Standard. URL: https://httpwg.org/specs/rfc7617.html
[RFC7797]
JSON Web Signature (JWS) Unencoded Payload Option. M. Jones. IETF. 2016년 2월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7797
[RFC8392]
CBOR Web Token (CWT). M. Jones; E. Wahlstroem; S. Erdtman; H. Tschofenig. IETF. 2018년 5월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8392
[RFC8428]
Sensor Measurement Lists (SenML). C. Jennings; Z. Shelby; J. Arkko; A. Keranen; C. Bormann. IETF. 2018년 8월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8428
[RFC9200]
Authentication and Authorization for Constrained Environments Using the OAuth 2.0 Framework (ACE-OAuth). L. Seitz; G. Selander; E. Wahlstroem; S. Erdtman; H. Tschofenig. IETF. 2022년 8월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc9200
[sdw-bp]
Spatial Data on the Web Best Practices. Payam Barnaghi; Jeremy Tandy; Linda van den Brink; Timo Homburg. W3C. 2023년 9월 19일. DNOTE. URL: https://www.w3.org/TR/sdw-bp/
[SMARTM2M]
ETSI TS 103 264 V4.1.1 (2025-03): SmartM2M; Smart Applications; Reference Ontology and oneM2M Mapping. ETSI. 2025년 3월. Published. URL: http://www.etsi.org/deliver/etsi_ts/103200_103299/103264/04.01.01_60/ts_103264v040101p.pdf
[TURTLE]
RDF 1.1 Turtle. Eric Prud'hommeaux; Gavin Carothers. W3C. 2014년 2월 25일. W3C Recommendation. URL: https://www.w3.org/TR/turtle/
[VOCAB-SSN]
Semantic Sensor Network Ontology. Armin Haller; Krzysztof Janowicz; Simon Cox; Danh Le Phuoc; Kerry Taylor; Maxime Lefrançois. W3C. 2017년 10월 19일. W3C Recommendation. URL: https://www.w3.org/TR/vocab-ssn-2017/
[w3c-basic-geo]
Basic Geo (WGS84 lat/long) Vocabulary. Dan Brickley. W3C Semantic Web Interest Group. 2006년 2월 1일. URL: https://www.w3.org/2003/01/geo/
[WOT-BINDING-TEMPLATES]
Web of Things (WoT) Binding Templates. Michael Koster; Ege Korkan. W3C. 2024년 5월 28일. W3C Working Group Note. URL: https://www.w3.org/TR/wot-binding-templates/
[WOT-DISCOVERY]
Web of Things (WoT) Discovery. Kunihiko Toumura; Michael McCool; Andrea Cimmino; Farshid Tavakolizadeh. W3C. 2023년 12월 5일. W3C Recommendation. URL: https://www.w3.org/TR/wot-discovery/
[WOT-THING-DESCRIPTION11]
Web of Things (WoT) Thing Description 1.1. Sebastian Käbisch; Michael McCool; Ege Korkan. W3C. 2023년 12월 5일. W3C Recommendation. URL: https://www.w3.org/TR/wot-thing-description11/