연결된 데이터 알림

W3C 권고안

이 버전
https://www.w3.org/TR/2017/REC-ldn-20170502/
최신 공개 버전
https://www.w3.org/TR/ldn/
이전 버전:
https://www.w3.org/TR/2017/PR-ldn-20170321/
최신 에디터 초안
https://linkedresearch.org/ldn/
편집자
Sarven Capadisli, 본 대학교, info@csarven.ca
Amy Guy, 에든버러 대학교, amy@rhiaro.co.uk
저장소
Github
이슈
구현 보고서
https://linkedresearch.org/ldn/tests/summary
테스트 슈트
https://linkedresearch.org/ldn/tests/
관련 문서
Social Web Working Group Charter

공개 후 보고된 오류나 이슈는 정오표를 확인하세요.

이 명세의 영어 버전만이 유일한 규범 버전입니다. 비규범적 번역본도 제공될 수 있습니다.


요약

Linked Data Notifications는 서버(수신자)가 애플리케이션(발신자)으로부터 메시지를 푸시 받는 방법과, 다른 애플리케이션(소비자)이 해당 메시지를 조회하는 방법을 설명하는 프로토콜입니다. 모든 리소스는 메시지 수신 엔드포인트(인박스)를 광고할 수 있습니다. 메시지는 RDF로 표현되며, 임의의 데이터를 포함할 수 있습니다.

이 문서의 상태

상태 업데이트(2017년 5월): 개요 다이어그램의 링크가 2017년 5월 22일에 바로잡혀 수정되었습니다. 잘못된 내부 앵커를 가리키고 있었습니다.

상태 업데이트(2017년 9월): 개념 URI가 2017년 9월 5일에 바로잡혀 수정되었습니다. 잘못된 내부 URI를 가리키고 있었습니다.

이 섹션은 이 문서가 출판된 시점의 상태를 설명합니다. 다른 문서가 이 문서를 대체할 수도 있습니다. 현재 W3C 발행물 목록 및 이 기술 보고서의 최신 개정본은 W3C 기술 보고서 인덱스 https://www.w3.org/TR/ 에서 확인할 수 있습니다.

이 문서는 소셜 웹 워킹 그룹에서 권고안으로 발행되었습니다. 이 문서에 대해 의견이 있으시면 public-socialweb@w3.org (구독, 아카이브)로 보내주시기 바랍니다. 모든 의견을 환영합니다.

작업 그룹의 구현 보고서도 참고 바랍니다.

이 문서는 W3C 회원, 소프트웨어 개발자 및 기타 W3C 그룹과 이해관계자의 검토를 거쳤으며, 디렉터의 승인으로 W3C 권고안으로 채택되었습니다. 이는 안정된 문서로, 참고 자료로 사용하거나 다른 문서에서 인용할 수 있습니다. W3C의 권고안 채택 목적은 사양에 대한 주목도를 높이고 널리 보급되도록 촉진하는 데 있습니다. 이는 웹의 기능성과 호환성을 향상시킵니다.

이 문서는 2004년 2월 5일 W3C 특허 정책에 따라 운영되는 그룹에서 생성한 것입니다. W3C는 해당 그룹 산출물과 관련해 제기된 특허의 공개 리스트를 유지하고 있으며, 해당 페이지에는 특허 공개 방법에 대한 안내도 포함되어 있습니다. 어떤 개인이 필수 청구항(Essential Claim(s))이 포함된 특허에 대해 실제로 알고 있을 경우, 그 정보는 W3C 특허 정책 6절에 따라 공개해야 합니다.

이 문서는 2017년 3월 1일 W3C 프로세스 문서의 적용을 받습니다.

1. 소개

웹의 데이터는 특정 시스템에만 묶이거나, 해당 데이터를 생성한 애플리케이션에서만 읽을 수 있도록 제한되어서는 안 됩니다. 사용자는 애플리케이션을 자유롭게 전환하고, 데이터도 서로 공유해야 합니다. 애플리케이션은 다양한 활동, 상호작용, 새로운 정보에 대한 알림을 생성하며, 이는 사용자에게 표시되거나 추가적으로 처리될 수 있습니다.

Linked Data Notifications (LDN) 는 알림이 어떻게 생성되었는지와 관계없이 애플리케이션 알림의 공유 및 재사용을 지원합니다. 이를 통해 데이터 저장과 데이터를 표시/활용하는 애플리케이션이 분리되는 더 모듈화된 시스템을 구축할 수 있습니다. 이 프로토콜은 독립적으로 구현되어 서로 다른 기술 스택 위에서 동작하는 발신자, 수신자, 소비자들이 웹에서 상호 연동되고, 우리의 웹 상 상호작용을 탈중앙화하는 데 기여할 수 있도록 설계되었습니다.

본 명세는 알림을 일시적·비영속적 엔터티로 취급하는 대신, 각 알림이 고유의 URI를 갖는 개별 엔터티가 될 수 있도록 합니다. 이렇게 하면 알림을 다시 조회하거나 재사용할 수 있습니다. 다양한 애플리케이션 도메인, 즉 사회적 혹은 그 외 영역까지 폭넓게 지원하므로, 알림의 내용은 애플리케이션이 자유롭게 정의하게 되어 있습니다. 알림의 인증 및 검증은 권장되지만, 구체적인 메커니즘은 알림의 종류나 도메인에 따라 수신자와 소비자가 각기 다르게 결정할 수 있습니다.

1.1 소셜 웹 워킹 그룹

LDN은 소셜 웹 워킹 그룹에서 작성 중인 여러 관련 명세 중 하나입니다. 대체 접근 방식이나 보완 프로토콜에 관심 있는 구현자는 개요 문서 Social Web Protocols를 우선 참조하시기 바랍니다. 소셜 웹 프로토콜 명세의 특정 하위 섹션은 본 명세 전반에서 확장성 또는 다른 프로토콜과의 연동 지점을 밝히기 위해 인용하고 있습니다.

1.2 개요

Linked Data Notifications 개요

발신자는 사람이 직접 실행하거나 자동 프로세스로 트리거되어 서버에게 알림을 전달합니다. 알림 데이터는 수신자의 관심을 위한 정보이며, 예시로는 친구의 개인 메시지, 핑백 링크, 블로그 댓글, 협업 초대, 캘린더 알림, 과학적 관측정보 등이 있습니다.

발신자는 알림을 보낼 타겟 리소스를 선택하고, 대상의 Inbox 위치를 발견한 뒤, 그곳에 알림을 보냅니다. 모든 리소스는 Inbox를 광고할 수 있습니다. 수신자는 알림 데이터를(적절한 접근 제어에 따라) 소비자가 사용할 수 있도록 제공합니다.

소비자는 발신자와 동일한 방식으로 Inbox의 위치를 찾은 뒤, 알림을 추가 처리하거나 다른 데이터와 조합하여 쓰거나, 혹은 단순히 사람에게 읽기 좋은 방식으로 알림을 표시할 수 있습니다.

1.3 요약

발신자와 소비자는 탐색 과정을 통해 리소스의 Inbox URL을 HTTP Link 헤더나 리소스 본문 내의 관계로부터 식별합니다.

발신자(Sender):

  • 알림의 내용을 애플리케이션 요구에 맞게 작성합니다.
  • 알림을 Inbox URL에 POST 요청으로 전송하며, 본문은 JSON-LD 또는 서버가 허용하는 다른 직렬화로 전달합니다.

수신자(Receiver):

  • Inbox URL로 들어온 GET 요청에 대해서는, 지금까지 받은 알림(URL 목록 포함) 정보를 반환합니다.
  • 개별 알림 URL에 대한 GET 요청에는 JSON-LD(또는 선택적으로 다른 직렬화)를 반환합니다.
  • Inbox URL로 들어온 POST 요청을 받아 알림을 생성합니다.
  • 선택적으로 Inbox로 발송되는 알림에 대한 제약 조건을 강제할 수 있습니다.

소비자(Consumer):

  • Inbox URL의 내용을 GET 요청으로 조회하고, 애플리케이션 목적에 맞게 활용합니다.

1.4 Linked Data Platform과의 관계

LDN은 알림 전송·소비를 위해 Linked Data Platform [LDP]의 특화된 활용 예시입니다. 완전한 LDP 구현이 반드시 필요한 것은 아니며, 구현이 쉬운 부분집합만으로도 충분합니다. LDP에 대한 사전 지식 없이도 본 명세를 이해할 수 있지만, 알고 있다면 몇몇 개념이 익숙하게 느껴질 수 있습니다. 우리는 분산되고 상호운용 가능한 방식으로 알림을 쉽게 교환할 수 있도록 필요한 특징만 기술합니다. LDN Inbox는 LDP BasicContainer에 해당합니다.

2. 적합성

이 문서에서 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", "OPTIONAL"이라는 핵심 단어는 [RFC2119]에서 정의한 의미로 해석되어야 합니다. 비규범적(참고)으로 표시된 절 이외에도, 본 명세의 모든 작성 가이드라인, 다이어그램, 예시, 참고사항은 비규범적입니다.

2.1 적합성 클래스

LDN 구현체발신자, 수신자, 소비자가 될 수 있습니다. 각 역할별 적합성 기준은 본 명세의 해당 절에서 설명합니다.

3. 프로토콜

이 절에서는 알림이 전달되거나 읽히는 URL(Inbox)의 탐색 방법과 전달 메커니즘을 설명합니다. 알림 내용은 Payload에서 설명합니다.

3.1 탐색

Inbox는 알림이 보내지거나 소비되는 엔드포인트로서 블로그 게시글, 사용자 프로필, 데이터셋, 비디오 등 임의의 리소스에서 발견될 수 있습니다. 탐색의 시작점은 알림이 향하는 혹은 알림에 관련된 리소스, 즉 target입니다. 어떤 리소스(RDF 또는 비-RDF)가 자체 Inbox를 가질 수 있으므로, 어느 리소스에서 탐색을 시작할지는 발신자나 소비자의 재량입니다.

발신자와 소비자는 Inbox URL을 찾기 위해 다음을 수행합니다:

  • 타겟 URL에 대해 HTTP HEAD 또는 GET 요청을 하고, rel 값이 http://www.w3.org/ns/ldp#inboxLink 헤더를 사용하는 방법
  • 타겟 URL에 대해 HTTP GET 요청을 하여 RDF 표현 [RDF 1.1]을 가져오고, 그 인코딩된 RDF 그래프가 http://www.w3.org/ns/ldp#inbox 타입의 관계를 포함하는지 확인하는 방법. 그 관계의 주어는 타겟이고 객체는 Inbox입니다.

이들은 어느 순서로든 수행될 수 있지만, 첫 번째 방법으로 Inbox를 찾지 못하면 두 번째 방법을 반드시(MUST) 시도해야 합니다. 발신자와 소비자는 분명히 프래그먼트 식별자를 가지는 URI를 대상으로 하는 경우에는 Link 헤더 기반 탐색을 생략하는 것이 권장됩니다(SHOULD).

참고

타겟이 프래그먼트 식별자를 포함하는 경우, 프래그먼트는 서버에 대한 요청의 일부가 아닙니다. 발신자와 소비자는 Link 헤더에서 발견되는 모든 Inbox는 프래그먼트가 제거된 해결된 URL에 대한 것임을 유의해야 합니다. 자세한 내용은 [Cool URIs for the Semantic Web - Hash URIs]를 참조하세요.

리소스는 반드시(MUST) 하나의 Inbox만을 광고해야 합니다. 하나의 Inbox는 예를 들어 내 블로그 게시물의 모든 답글과 내 사진의 모든 공유에 대해 동일한 Inbox를 쓰는 등 여러 리소스에서 공유해서 사용할 수 있습니다(MAY).

탐색 예시 1: Link 헤더

HEAD /article HTTP/1.1
Host: example.org
Accept: application/ld+json

HTTP/1.1 200 OK
Link: <http://example.org/inbox/>; rel="http://www.w3.org/ns/ldp#inbox"
HEAD 요청으로 Inbox를 탐색하고 Link 헤더를 수신했을 때의 요청과 응답 예시.

탐색 예시 2: JSON-LD

GET /profile HTTP/1.1
Host: example.org
Accept: application/ld+json

HTTP/1.1 200 OK
Content-Type: application/ld+json

{
  "@context": "http://www.w3.org/ns/ldp",
  "@id": "http://example.org/profile",
  "inbox": "http://example.org/inbox/"
}
JSON-LD를 가져오기 위한 GET 요청으로 Inbox를 발견하는 예시. 응답은 JSON-LD 축약 형식.

탐색 예시 3: 가시적 HTML

GET /event HTTP/1.1
Host: example.org
Accept: text/html, application/ld+json

HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8

<p about="http://example.org/event" typeof="http://schema.org/Event" lang="en">
  <a rel="http://www.w3.org/ns/ldp#inbox" href="/inbox/">RSVP</a> to event
</p>
HTML을 가져오기 위한 GET 요청으로 Inbox를 발견하는 예시. Inbox 링크는 사람에게 보이도록 표시되며 기계가 URL을 찾을 수 있도록 RDFa로 마크업되어 있습니다.

탐색 예시 5: 비가시적 HTML

GET /article HTTP/1.1
Host: example.org
Accept: text/html, application/ld+json

HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8

<section id="results" about="#results"
  property="http://www.w3.org/ns/ldp#inbox" resource="/inbox/">
</section>
HTML을 가져오기 위한 GET 요청으로 Inbox를 발견하는 예시. RDFa의 property 속성으로 표현된 비가시적 Inbox로, 조각 URI로 식별된 리소스가 대상일 수 있도록 합니다.

탐색 예시 6: Turtle

GET / HTTP/1.1
Host: csarven.ca
Accept: text/turtle, application/ld+json

HTTP/1.1 200 OK
Content-Type: text/turtle;charset=utf-8

<http://csarven.ca/#i>
  <http://www.w3.org/ns/ldp#inbox> <http://csarven.ca/inbox/> .
Turtle을 가져오기 위한 GET 요청으로 Inbox를 발견하는 예시.

서버가 이 프로토콜을 모를 가능성을 고려하여 탐색을 수행하는 방법에 대한 권고는 Social Web Protocols를 참조하세요.

3.2 발신자

탐색을 마친 후, 알림을 전송하려는 발신자는 POST 요청을 통해 Inbox URL로 알림을 전달해야 합니다(MUST). 발신자는 성공적인 요청에 대해 201 Created(Location 헤더 포함) 또는 202 Accepted 응답을 기대할 수 있습니다.

발신자는 서버가 수락하는 RDF 콘텐츠 타입을 확인하기 위해 OPTIONS 요청을 사용할 수 있으며, 응답으로 반환된 Accept-Post 헤더의 값에 따라 요청 본문에 알림을 직렬화할 수 있습니다. 그렇지 않은 경우에는 POST 요청의 본문은 JSON-LD 형식의 알림 payload를 포함해야 합니다(MUST) 및 헤더 Content-Type: application/ld+json를 사용해야 합니다. Content-Type 헤더는 profile URI를 포함할 수 있습니다(MAY) [RFC6906].

발신자는 인증 또는 인가를 위해 추가 헤더나 콘텐츠(예: Authorization: Bearer XXX)를 포함할 수 있습니다(MAY).

발신자가 인증을 필요로 하지 않는 localhost에서 서비스를 실행 중인 경우, 악성 스크립트가 Inbox 엔드포인트에서 실행되어 발신자가 자신에게 임의의 POST 요청을 하게 만들 수 있습니다. 따라서 발신자는 localhost나 루프백 IP 주소로 POST 요청을 해서는 안 됩니다(SHOULD NOT).

전송 예시 요청

POST /inbox/ HTTP/1.1
Host: example.org
Content-Type: application/ld+json;profile="https://www.w3.org/ns/activitystreams"
Content-Language: en

{
  "@context": "https://www.w3.org/ns/activitystreams",
  "@id": "",
  "@type": "Announce",
  "actor": "https://rhiaro.co.uk/#me",
  "object": "http://example.net/note",
  "target": "http://example.org/article",
  "updated": "2016-06-28T19:56:20.114Z"
}
Inbox로 보낼 예시 요청.

전송 예시 응답

HTTP/1.1 201 Created
Location: http://example.org/inbox/5c6ca040
Inbox에 대한 POST 요청에 대한 예시 응답.

3.3 수신자

수신자는 Inbox URL에 대한 GETPOST 요청을 지원해야 합니다(MUST). LDP 관점에서 Inbox는 Container입니다.

3.3.1 알림 수신

수신자가 POST 요청을 수신했을 때, 알림 리소스가 성공적으로 처리되면 수신자는 상태 코드 201 Created로 응답하고 알림 데이터를 검색할 수 있는 URL을 가리키는 Location 헤더를 설정해야 합니다(MUST). 요청이 비동기적으로 큐에 들어간 경우, 수신자는 상태 코드 202 Accepted로 응답해야 하며 응답 본문에 요청 상태에 관한 정보를 포함해야 합니다(MUST).

제약(Constraints)을 강제하는 수신자는 제약이 충족되지 않으면 알림 처리를 실패시키고 적절한 4xx 오류 코드를 반환하는 것이 권장됩니다(SHOULD).

수신자는 요청 본문이 JSON-LD이며 Content-Type: application/ld+json인 경우 이를 수락해야 합니다(MUST). profile URI를 포함할 수 있습니다(MAY) [RFC6906].

수신자는 다른 RDF 콘텐츠 타입(예: text/turtle, text/html)을 수락할 수 있으며(MAY), 그렇다면 Inbox URL에 대한 OPTIONS 요청에 응답할 때 수신 가능한 콘텐츠 타입을 Accept-Post 헤더로 광고하는 것이 권장됩니다(SHOULD).

수신자 예시 1: OPTIONS 응답

OPTIONS /inbox/ HTTP/1.1
Host: example.org

HTTP/1.1 200 OK
Allow: GET, HEAD, OPTIONS, POST
Accept-Post: application/ld+json, text/turtle
Accept-Post를 포함한 OPTIONS 요청에 응답하는 수신자 예시.

수신자 예시 2: POST 응답

POST /inbox/ HTTP/1.1
Host: example.org
Content-Type: application/ld+json;profile="https://www.w3.org/ns/activitystreams"
Content-Language: en

{
  "@context": "https://www.w3.org/ns/activitystreams",
  "@id": "",
  "@type": "Announce",
  "actor": "https://rhiaro.co.uk/#me",
  "object": "http://example.net/note",
  "target": "http://example.org/article",
  "updated": "2016-06-28T19:56:20.114Z"
}

HTTP/1.1 201 Created
Location: http://example.org/inbox/92d72f00
Inbox에 대한 POST 요청에 대해 알림을 생성하여 응답하는 수신자 예시.

3.3.2 Inbox 내용을 소비자에게 제공하기

Inbox에 대한 성공적인 GET 요청은 요청자의 접근 권한에 따라 알림의 URI들을 포함한 HTTP 200 OK를 반환해야 합니다(MUST). 접근 권한에 따라 적절한 경우 4xx 오류 코드를 반환할 수 있습니다. 수신자는 Inbox에 있는 알림 중 소비자가 접근할 수 있는 알림의 URI만을 나열할 수 있습니다(MAY). Inbox URL은 알림들을 참조하기 위해 http://www.w3.org/ns/ldp#contains 술어를 사용해야 합니다(MUST).

각 알림은 반드시(MUST) RDF 소스여야 합니다. 비-RDF 리소스가 반환되는 경우 소비자는 이를 무시할 수 있습니다(MAY). 알림 URI에 대한 성공적인 GET 요청은 요청자의 접근 권한에 따라 HTTP 200 OK를 반환해야 합니다(MUST), 필요시 4xx를 반환합니다.

JSON-LD 콘텐츠 타입은 모든 리소스에서 이용 가능해야 합니다(MUST), 하지만 클라이언트는 다른 콘텐츠 타입을 선호하도록 Accept 헤더를 보낼 수 있습니다(RFC7231 섹션 3.4 - 콘텐츠 협상).

클라이언트가 Accept 헤더를 보내지 않으면 서버는 JSON-LD 또는 동일한 정보를 충실히 전달하는 형식(예: Turtle)으로 데이터를 보낼 수 있습니다.

Inbox 자체에 대한 추가 설명(예: 제약)을 반환할 수 있습니다(MAY).

참고

본 명세는 Inbox에 있는 알림 목록을 제공하기 위한 페이징 메커니즘을 정의하지 않습니다. 페이징을 활성화하려는 구현체는 효율적인 검색을 위해 기존 메커니즘(예: Linked Data Platform Paging 1.0, Activity Streams 2.0 Collection)을 사용할 수 있습니다.

수신자 예시 3: GET 응답

GET /inbox/ HTTP/1.1
Host: example.org
Accept: application/ld+json
Accept-Language: en-GB,en;q=0.8, en-US;q=0.6

HTTP/1.1 200 OK
Content-Type: application/ld+json
Content-Language: en

{
  "@context": "http://www.w3.org/ns/ldp",
  "@id": "http://example.org/inbox/",
  "contains": [
    "http://example.org/inbox/5c6ca040",
    "http://example.org/inbox/92d72f00"
  ]
}
Inbox에 대한 GET 요청에 대해 알림 목록으로 응답하는 수신자 예시.

3.3.3 발신자 검증

수신자는 발신자 검증을 수행하는 것이 권장됩니다(SHOULD). 예를 들어 다음과 같은 방법을 고려할 수 있습니다:

  • 쓰기 권한이 있는 발신자의 화이트리스트를 유지
  • 모든 발신자에 대한 수신자의 인지를 강제하기 위해 인증 요구
  • 발신자 도메인에서 알림의 복사본을 가져와 출처를 검증
  • 알림에 수반된 디지털 서명을 검사

3.3.4 오남용 방지

수신자는 부적절한 알림이 서버에 생성되어 Inbox에 노출되는 것을 필터링하기 위해 제약을 사용하는 것이 권장됩니다(SHOULD).

수신자는 Inbox URL에 대한 쓰기를 신뢰할 수 있는 발신자 화이트리스트로 제한하는 접근 제어를 구현하는 것을 고려할 수 있습니다.

3.4 소비자

소비자는 Inbox URL에 대한 GET 요청을 통해 Inbox에 있는 알림의 URI를 가져옵니다(이 URL을 찾으려면 탐색 참조).

알림의 URI는 Inbox URL의 http://www.w3.org/ns/ldp#contains 술어를 통해 검색 가능해야 합니다(MUST).

Inbox 또는 개별 알림을 가져올 때 소비자는 선호 콘텐츠 타입(예: JSON-LD)을 나타내기 위해 Accept 헤더를 명시적으로 설정하는 것이 권장됩니다(SHOULD). 개별 알림을 몇 개, 어떤 기준으로 가져올지는 소비자의 재량입니다(예: 콘텐츠 길이, 타임스탬프 등).

소비자는 인증 또는 인가 목적을 위해 추가 헤더나 콘텐츠를 포함할 수 있습니다(MAY).

소비자는 페이로드에서 추가적인 페치나 추론(예: 알림에서 참조된 리소스의 역참조를 통해 내용을 가져오는 것)을 수행할 수 있으며(MAY), Inbox가 발표한 제약을 알림 처리 전에 확인하고자 할 수 있습니다(MAY).

참고

가져온 알림 URI는 요청된 URI 자체와 다른 하나 이상의 주체 IRI를 포함하는 RDF 문장을 가질 수 있습니다. 소비자는 알림이 요청된 URI를 주제로 하는 삼중(triple)을 반드시 포함한다고 가정해서는 안 됩니다. 이는 알림 본문이 상대 IRI를 사용할 때에도 해당됩니다. 구현체는 알림 URI를 알림 페이로드의 RDF를 포함하는 그래프로 취급하는 것을 고려할 수 있습니다.

참고

수신자에 따라 Inbox에 무엇이든 게시될 수 있으므로(수신자가 설정한 제한에 따름, 이 프로토콜에서 정의하지 않음) 소비자는 알림 데이터를 사용할 때 내용의 진위 여부를 판단하기 위한 예방 조치를 취하는 것이 바람직합니다.

소비자 예시: 알림 가져오기

GET /inbox/14a792f0 HTTP/1.1
Host: example.org
Accept: application/ld+json, text/turtle, application/xhtml+xml, text/html
Accept-Language: en-GB,en;q=0.8, en-US;q=0.6

HTTP/1.1 200 OK
Content-Type: application/ld+json;profile="https://www.w3.org/ns/activitystreams"
Content-Language: en

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    { "@language": "en" }
  ],
  "@id": "http://example.org/inbox/14a792f0",
  "@type": "Announce",
  "actor": {
    "@id": "http://csarven.ca/#i",
    "name": "Sarven Capadisli"
  },
  "object": {
    "@context": "http://www.w3.org/ns/anno.jsonld",
    "@id": "http://example.net/note",
    "@type": "Annotation",
    "motivation": "http://www.w3.org/ns/oa#assessing",
    "rights": "http://creativecommons.org/licenses/by/4.0/"
  },
  "target": "http://example.org/article",
  "updated": {
    "@type": "http://www.w3.org/2001/XMLSchema#dateTime",
    "@value": "2016-06-28T19:56:20.114Z"
  }
}
Inbox에서 발견된 개별 알림에 대한 GET 요청의 결과 예시.

4. 페이로드

알림의 페이로드는 수신자와 다른 RDF 구문이 협상되지 않는 한 반드시(MUST) JSON-LD여야 합니다. 다양한 사용 사례를 허용하기 위해 페이로드의 실제 어휘는 여기서 명시하지 않습니다.

4.1 페이로드 예시

이 절은 비규범적입니다.

페이로드 예시 1

{
  "@context": "http://schema.org/",
  "@id": "http://example.net/note#foo",
  "citation": { "@id": "http://example.org/article#results" }
}
schema.org 어휘를 사용해 단일 문장으로 기술된 인용(citation)입니다.

페이로드 예시 2

{
  "@context": "https://www.w3.org/ns/activitystreams",
  "@id": "",
  "@type": "Announce",
  "actor": "https://rhiaro.co.uk/#me",
  "object": "http://example.net/note",
  "target": "http://example.org/article",
  "updated": "2016-06-28T19:56:20.114Z"
}
ActivityStreams 2.0 어휘를 사용하여 날짜와 actor를 포함해 리소스 간의 공지(announcement)를 기술한 예시입니다.

페이로드 예시 3

{
  "@context": { "pingback": "http://purl.org/net/pingback/" },
  "@id": "",
  "@type": "pingback:Item",
  "pingback:source": { "@id": "http://example.net/note#foo" },
  "pingback:target": { "@id": "http://example.org/article#results" }
}
Semantic Pingback 어휘로 기술된 핑백 알림 예시입니다.

페이로드 예시 4

{
  "@context": "http://schema.org/",
  "@id": "",
  "@type": "RsvpAction",
  "event": { "@id": "http://example.org/event" },
  "agent": { "@id": "https://rhiaro.co.uk/#me" }
}
schema.org 어휘로 기술된 이벤트 RSVP 예시입니다.

알림은 임의의 정보를 담고 있을 수 있으며, 각기 다른 URI를 가진 여러 리소스에 대한 참조를 포함할 수 있습니다. 반드시 특정 외부 리소스나 데이터의 출처를 참조하지 않아도 됩니다. 소비자가 알림을 요청할 때 수신자는 처음 전송된 모든 트리플을 반환해야 합니다.

페이로드 예시 5

{
  "@context": {
    "@language": "en",
    "sioc": "http://rdfs.org/sioc/ns#",
    "foaf": "http://xmlns.com/foaf/0.1/"
  },
  "@id": "",
  "@type": "sioc:Comment",
  "sioc:reply_of": { "@id": "http://example.org/article" },
  "sioc:created_at": {
    "@type": "http://www.w3.org/2001/XMLSchema#dateTime",
    "@value": "2015-12-23T16:44:21Z"
  },
  "sioc:content": "This is a great article!",
  "sioc:has_creator": {
    "@id": "http://example.org/profile",
    "@type": "sioc:UserAccount",
    "sioc:account_of": { "@id": "http://example.org/profile#alice" },
    "sioc:avatar": { "@id": "http://example.org/profile/avatar.png" },
    "foaf:name": "Alice"
  }
}
Semantically Interlinked Online Communities(SIOC) 및 Friend-of-a-Friend(FOAF) 어휘로 기술된, 댓글 및 댓글 작성자 정보를 담은 알림 예시입니다.

페이로드 예시 6

{
  "@context": [{"prov": "http://www.w3.org/ns/prov#"}],
  "@id": "http://example.org/activity/804c4e7efaa828e146b4ada1c805617ffbc79dc7",
  "@type": "prov:Activity",
  "http://www.w3.org/2000/01/rdf-schema#label": {
    "@language": "en",
    "@value": "Make it so"
  },
  "prov:endedAtTime": {
    "@type": "http://www.w3.org/2001/XMLSchema#dateTime",
    "@value": "2016-06-14T20:57:39.000Z"
  },
  "prov:generated": {
    "@id": "http://example.org/entity/804c4e7efaa828e146b4ada1c805617ffbc79dc7",
    "@type": "prov:Entity",
    "prov:specializationOf": { "@id": "http://example.org/entity/file" },
    "prov:wasGeneratedBy": {
      "@id": "http://example.org/activity/804c4e7efaa828e146b4ada1c805617ffbc79dc7"
    }
  },
  "prov:wasAssociatedWith": {
    "@id": "http://csarven.ca/#i",
    "@type": "prov:Agent",
    "http://xmlns.com/foaf/0.1/name": {
      "@language": "hy",
      "@value": "Սարվէն Չափատիշլի"
    }
  }
}
Provenance 어휘로 기술된 변경 로그 항목(changelog entry) 알림 예시입니다.

5. 보안, 개인정보 및 내용 관련 고려사항

이 절은 비규범적입니다. 보안과 개인정보에 대한 규범적 요구사항은 각 해당 절에서 별도로 안내합니다.

5.1 제약

Inbox URL은 rel 값이 http://www.w3.org/ns/ldp#constrainedBy인 HTTP Link 헤더 또는 리소스 본문을 통해 자체 제약사항(예: SHACL, Web Annotation Protocol)을 알릴 수 있습니다. 발신자는 이 제약 명세를 따르는 것이 바람직하며, 그렇지 않을 경우 수신자는 알림을 거부하고 적절한 4xx 오류를 반환할 수 있습니다.

5.2 타겟 소유권

Inbox(타겟)를 광고하는 리소스의 발행자는 신뢰할 수 있는 서버에서 이를 해야 합니다. 발행자는 타사에서 헤더나 콘텐츠에 접근할 경우 알림이 리다이렉션 될 수 있음을 인지해야 합니다.

5.3 알림 구독

본 명세는 소비자가 pull을 통해 수신자로부터 알림을 읽는 방법을 설명하지만, 소비자가 새로 들어오는 알림이나 Inbox 내용 변경 사항을 푸시 받기를 원할 수 있습니다. 유사하게 수신자도 특정 발신자에 대한 알림을 요청하고자 할 수 있습니다. 이런 형태의 구독 메커니즘은 본 명세 범위에 포함되지 않으나, 발신자/수신자/소비자 간에 이런 계약을 맺는 것을 제한하지 않습니다. 구독 기능을 활성화하려는 구현체는 ActivityPub, WebSub, WebSocket 프로토콜, HTTP Web Push 등 기존 메커니즘을 사용할 수 있습니다.

5.4 Activity Streams 2.0 지원

Activity Streams 2.0 Core를 지원하려는 수신자 구현체는 Content-Type 및 어휘 동등성에 대한 안내가 있는 Social Web Protocols - Inbox Interop를 참고할 수 있습니다.

5.5 자연어 콘텐츠

연합형 네트워크에서 국제적 사용자층을 구축하는 것은 중요합니다. 일부 LDN 상호작용은 HTML 조각, 요약 필드 등 자연어 텍스트 콘텐츠를 반환할 수 있습니다. 모든 항목에 대해 다국어 버전을 제공하는 것이 항상 가능하지 않을 수 있습니다. 구현체는 사용 가능한 언어를 식별하거나 반환할 언어를 협상할 방법(예: HTTP Accept-Language 헤더를 활용하여 요청별로 가장 적합한 언어 표현을 선택할 수 있도록)을 마련하는 것이 바람직합니다.

5.6 인증된 Inbox

수신자가 발신자 또는 소비자 인증을 기대하는 경우, 다른 데이터나 오류 코드를 반환하기 전에 이들의 자격 증명 유효성을 먼저 검사해야 합니다. 예를 들어, 수신자는 인가되지 않은 요청자에 대해서는 Inbox 존재 여부 확인(404 Not Found 반환 등)을 먼저 하지 말아야 합니다.

토큰 기반 인증은 반드시 HTTPS 상에서만 이뤄져야 합니다.

5.7 보안 및 개인정보 검토

이 질문들은 Self-Review Questionnaire: Security and Privacy의 가이드에 따라 본 명세의 보안 및 개인정보 관련 고려사항을 요약합니다.

이 명세는 개인정보(PII)를 다루나요?
알림 페이로드는 발신자 또는 수신자를 식별할 수 있는 데이터를 포함할 수 있습니다. 알림 데이터에 대한 접근은 수신자 제어 하에 있습니다. 민감한 정보를 보낼 때 발신자는 Inbox가 공개 읽기를 허용할 수 있음을 주의해야 합니다.
이 명세는 고가치 데이터(자격 증명 등)를 다루나요?
알림 페이로드 내 개인정보(위 내용 참조)와 동일한 영향이 있습니다.
이 명세는 브라우징 세션 간에 지속되는 오리진별 상태를 도입하나요?
아니오.
이 명세는 웹에 노출되는 영구적, 크로스 오리진 상태를 도입하나요?
아니오.
이 명세는 기존에 접근할 수 없던 다른 데이터를 오리진에 노출하나요?
아니오.
이 명세는 새로운 스크립트 실행/로딩 메커니즘을 허용하나요?
아니오.
이 명세는 오리진이 사용자의 위치에 접근하도록 허용하나요?
아니오.
이 명세는 오리진이 사용자의 기기의 센서에 접근하도록 허용하나요?
아니오.
이 명세는 오리진이 사용자의 로컬 컴퓨팅 환경에 접근하도록 허용하나요?
아니오.
이 명세는 오리진이 다른 기기에 접근하도록 허용하나요?
아니오.
이 명세는 오리진이 사용자 에이전트의 네이티브 UI를 통제할 수 있게 하나요?
아니오.
이 명세는 웹에 임시 식별자를 노출하나요?
아니오.
이 명세는 퍼스트파티/서드파티 상황에 따른 동작 차이를 구분하나요?
아니오.
이 명세는 시크릿 모드 등에서 어떻게 동작해야 하나요?
해당 웹사이트가 사용자가 시크릿 모드임을 알 수 없도록 동작합니다.
이 명세는 사용자의 로컬 디바이스에 데이터를 지속적으로 저장하나요?
아니오.
이 명세에 "보안 관련 고려사항"과 "개인정보 관련 고려사항"이 포함되어 있나요?
:)
이 명세는 기본 보안 특성을 완화하도록 허용하나요?
아니오.

A. 종료 기준

이 명세는 각 기능에 대해 최소 두 개의 독립적이며 상호운용되는 구현이 존재함을 조건으로 Proposed Recommendation 단계로 진입했습니다. 각 기능은 서로 다른 제품군에 의해 구현되어야 했습니다. 단일 제품이 모든 기능을 구현해야 한다는 요구는 없었습니다.

종료 기준을 평가하는 목적상, 아래 각각을 기능(feature)으로 간주하였습니다:

B. 감사의 글

본 명세에 기여해주신 아래 여러분들께 감사와 경의를 표합니다:

C. 변경 내역

이 절은 비규범적입니다.

REC-ldn-20170502PR-ldn-20170321CR-ldn-20170223CR-ldn-20161101WD-ldn-20161011WD-ldn-20160926WD-ldn-20160913WD-ldn-20160824WD-ldn-20160726

2017년 3월 21일 PR에서 본 버전까지의 변경사항

  • 예제의 문법 오류 수정
  • Social Web Group Charter에 대한 'in reply to' 링크 추가
  • 과거 버전 사양 링크 추가
  • 참고문헌 갱신

2017년 2월 23일 CR에서 3월 21일 PR까지 변경사항

  • 감사의 글 업데이트

2016년 11월 1일 CR에서 2017년 2월 23일 CR까지 변경사항

  • 감사의 글 추가
  • 알림 및 note 내 요청 URI의 암시적 응답 코드 명확화
  • 참고문헌 갱신

2016년 10월 11일 WD에서 11월 1일 CR까지 변경사항

  • 고려사항 섹션에 자연어 콘텐츠 내용 추가
  • PubSub 관련 참고 문헌 수정
  • 구현 보고·테스트 슈트 URL 추가
  • SVG에 범례 추가
  • AS2 bib 조각 수정
  • Payload 검증 문구 재서술
  • '인증된 Inbox' 보안 가이드 추가

2016년 9월 26일 WD에서 10월 11일 WD까지 변경사항

  • 예제 추가 및 갱신
  • HTTP HEAD/GET 탐색 관련 설명 개선
  • 에디토리얼: 문법, 표현 개선
  • Accept-Post 참고링크 수정 및 OPTIONS에 명시
  • 국제화 리뷰 피드백 통합(예제 등)

2016년 9월 13일 WD에서 9월 26일 WD까지 변경사항

  • 오타 및 링크 수정
  • 전송, 수신, 소비 순서로 섹션 재배치
  • 예시 갱신
  • RFC7231 관련 참고문헌 추가
  • URI 탐색 관련 문구 명확화
  • 고려사항 비규범적 절의 소제목 추가
  • 개요 다이어그램 추가
  • 고려사항에 Retry Discovery 비규범 소절 추가
  • 친절하게 탐색해야 함을 언급
  • 오남용 방지 내용을 관련 규범 절로 이동
  • 발신자 검증을 수신 섹션으로 이동
  • ActivitStreams 2.0 Support를 고려사항으로 이동
  • Payload verification을 Consuming의 Note로 이동
  • 규범 및 일부 비규범 내용 고려사항에서 앞 부분으로 이동
  • 보안 및 개인정보 검토 섹션 추가
  • 소개 업데이트

2016년 8월 24일 WD에서 9월 13일 WD까지 변경사항

  • 오타, 문장부호, 명명
  • 종료 기준(Exit Criteria) 추가
  • Accept 헤더 사용 및 미사용시 동작 명확화
  • Link 헤더 필드 relation의 주체 관련 note 추가
  • Link 헤더가 포함될 수 있도록 GET 추가, 타겟 URL의 subject URI 명확화
  • 개요(abstract) 개정
  • 타겟 소유권 관련 고려사항 추가
  • '모든 리소스가 자신의 inbox를 가질 수 있다' 언급
  • 알림 구독(Subscribe) 섹션 추가

2016년 7월 26일 WD에서 8월 24일 WD까지 변경사항

  • 예시 개선; 갱신, 문법 수정, @context에서 https 적용
  • 오타, 문장부호, 명명
  • Payload 관련 비규범 설명 추가

D. 참고문헌

규범적 참고문헌

[ldp]
Steve Speicher; John Arwe; Ashok Malhotra. W3C. Linked Data Platform 1.0. 2015년 2월 26일. W3C 권고안. URL: https://www.w3.org/TR/ldp/
[rdf11-concepts]
Richard Cyganiak; David Wood; Markus Lanthaler. W3C. RDF 1.1 Concepts and Abstract Syntax. 2014년 2월 25일. W3C 권고안. URL: https://www.w3.org/TR/rdf11-concepts/
[rfc2119]
S. Bradner. IETF. Key words for use in RFCs to Indicate Requirement Levels. 1997년 3월. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119
[rfc6906]
E. Wilde. IETF. The 'profile' Link Relation Type. 2013년 3월. Informational. URL: https://tools.ietf.org/html/rfc6906

비규범 참고문헌

[accept-post]
Steve Speicher; John Arwe; Ashok Malhotra. W3C. The Accept-Post Response Header (Linked Data Platform 1.0). 2015년 2월 26일. W3C 권고안. URL: https://www.w3.org/TR/ldp/#header-accept-post
[activitypub]
Christopher Webber; Jessica Tallon; Owen Shepherd. W3C. ActivityPub. 2017년 4월 13일. W3C Candidate Recommendation. URL: https://www.w3.org/TR/activitypub/
[activitystreams-core]
James Snell; Evan Prodromou. W3C. Activity Streams 2.0. 2017년 4월 13일. W3C Proposed Recommendation. URL: https://www.w3.org/TR/activitystreams-core/
[annotation-protocol]
Robert Sanderson. W3C. Web Annotation Protocol. 2017년 2월 23일. W3C Proposed Recommendation. URL: https://www.w3.org/TR/annotation-protocol/
[cooluris]
Leo Sauermann; Richard Cyganiak. W3C. Cool URIs for the Semantic Web. 2008년 12월 3일. W3C Note. URL: https://www.w3.org/TR/cooluris
[ldp-paging]
Steve Speicher; John Arwe; Ashok Malhotra. W3C. Linked Data Platform Paging 1.0. 2015년 6월 30일. W3C Note. URL: https://www.w3.org/TR/ldp-paging/
[websub]
Julien Genestoux; Aaron Parecki. W3C. WebSub. 2017년 4월 11일. W3C Candidate Recommendation. URL: https://www.w3.org/TR/websub/
[rfc6455]
I. Fette; A. Melnikov. IETF. The WebSocket Protocol. 2011년 12월. Proposed Standard. URL: https://tools.ietf.org/html/rfc6455
[rfc7231]
R. Fielding, Ed.; J. Reschke, Ed.. Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content. 2014년 6월. Proposed Standard. URL: https://tools.ietf.org/html/rfc7231
[security-privacy-questionnaire-20151210]
Mike West. W3C. Self-Review Questionnaire: Security and Privacy. 2015년 12월 10일. W3C Note. URL: https://www.w3.org/TR/2015/NOTE-security-privacy-questionnaire-20151210/
[shacl]
Holger Knublauch; Dimitris Kontokostas. W3C. Shapes Constraint Language (SHACL). 2017년 2월 2일. W3C Working Draft. URL: https://www.w3.org/TR/shacl/
[social-web-protocols]
Amy Guy. W3C. Social Web Protocols. 2016년 11월 2일. W3C Working Draft. URL: https://www.w3.org/TR/social-web-protocols/
[webpush]
M. Thomson; E. Damaggio; B. Raymor. IETF. Generic Event Delivery Using HTTP Push. 2016년 12월. Proposed Standard. URL: https://tools.ietf.org/html/rfc8030