발행 이후 보고된 오류나 이슈가 있는 경우 정오표를 확인하시기 바랍니다.
본 명세의 영어 버전만이 유일한 규범적 버전입니다. 비규범적 번역도 제공될 수 있습니다.
Copyright © 2017 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
이 명세서는 JSON 형식을 사용하여 잠재적 및 완료된 활동을 표현하기 위한 모델을 자세히 설명합니다. 활동의 구조와 특정 유형의 활동을 정의하는 어휘와 함께 사용하도록 설계되었습니다.
이 절은 이 문서가 발행될 당시의 상태를 설명합니다. 다른 문서가 본 문서를 대체할 수 있습니다. 현재 W3C 발행물과 본 기술 보고서의 최신 개정본은 W3C 기술 보고서 색인 https://www.w3.org/TR/ 에서 확인할 수 있습니다.
이 문서는 소셜 웹 워킹 그룹에서 권고안(Recommendation)으로 발행되었습니다. 본 문서에 대한 의견을 환영합니다. 의견은 public-socialweb@w3.org으로 보내주시기 바랍니다. (구독, 아카이브).
작업 그룹의 구현 보고서를 참고하세요.
이 문서는 W3C 회원, 소프트웨어 개발자 및 기타 W3C 그룹과 이해관계자들에 의해 검토되었으며, W3C 이사에 의해 W3C 권고안으로 승인되었습니다. 본 문서는 안정적인 문서이며, 참고 자료로 사용하거나 다른 문서에서 인용할 수 있습니다. W3C가 권고안을 만드는 목적은 사양의 주목도를 높이고 폭넓은 배포를 촉진하는 데 있습니다. 이는 웹의 기능성과 상호 운용성을 향상시킵니다.
이 문서는 2004년 2월 5일 W3C 특허 정책 하에 운영되는 그룹에 의해 작성되었습니다. W3C는 관련 특허 공개 목록을 공개적으로 유지하고 있습니다. 해당 페이지에는 특허 공개 방법에 대한 안내도 포함되어 있습니다. 실제로 특허 정보를 알고 있는 경우, 그 특허가 필수 주장(Essential Claim(s))을 포함한다고 생각하면 W3C 특허 정책 6조(section 6)에 따라 정보를 공개해야 합니다.
이 문서는 2017년 3월 1일 W3C 프로세스 문서에 의해 관리됩니다.
가장 기본적으로 "액티비티"란 어떤 동작에 대한 시맨틱한 설명입니다. 이 명세의 목표는 다양한 활동에 대한 메타데이터를 풍부하고 사람에게 친숙하면서도 기계가 처리할 수 있고 확장 가능한 방식으로 표현할 수 있는 JSON 기반의 구문을 제공하는 것입니다. 여기에는 자연어 설명 또는 활동에 대한 시각적 표현을 구성하거나, 다양한 유형의 오브젝트에 실행 가능한 정보를 연결하거나, 활동 로그를 전달하거나 기록하거나, 잠재적 행동의 위임을 다른 애플리케이션에 전달하는 것 등이 포함됩니다.
이 문서에서 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", " SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", 그리고 "OPTIONAL"은 [RFC2119]에 기술된 대로 해석해야 합니다.
이 절은 비규범적입니다.
Activity Streams 2.0은 소셜 데이터 구문으로 적합합니다. 이것은 [SWP]와 관련된 표준 모음의 일부입니다.
이 절은 비규범적입니다.
JSON Activity Streams 1.0 [AS1] 명세는 2011년 5월에 발행되었으며, 완료된 활동을 표현하기 위한 기본 확장 가능한 구문을 제공하였습니다. 이 명세는 광범위한 구현, 커뮤니티 피드백 및 여러 커뮤니티에서 진행된 다양한 작업에서 얻은 교훈을 반영하여 그 초석 위에 구축되었습니다.
Activity Streams 2.0이 Activity Streams 1.0에서 발전하게 된 특정 동기 중 일부는 다음과 같습니다:
displayName, verb,
title, objectType 용어는 Activity Streams 2.0 문서 내에서 사용되지 않아야 하는 예약어로 간주해야
합니다(SHOULD NOT). 만약 Activity Streams 2.0 문서에서 이 용어가 등장한다면,
SHOULD B. 폐기된 Activity Streams 1.0 문법에 명시된
가이드라인에 따라 처리해야 합니다.
이 명세서는 [RFC7159]의 JSON 기반 직렬화 구문을 설명하며, Activity Vocabulary에 대해 [JSON-LD] 구문 제약의 부분집합을 준수하지만 JSON-LD 처리를 요구하지는 않습니다. 다른 직렬화 방식도 가능하나, 이 문서에서는 그러한 대안은 다루지 않습니다.
직렬화될 때, 없는 속성은 (a) 속성 값을 null로 설정하거나, (b) 발행자의 선택에 따라 속성 선언 자체를 생략하는 방식으로 표현할 수 있습니다. 이 두 표현은 의미적으로 동등합니다. 만약 속성 값이 배열이고 그 배열에 항목이 없다면 MUST 해당 속성을 완전히 생략하거나 값을 null로 설정해야 합니다. 생략되거나 null로 명시된 값의 올바른 해석은 값이 할당되지 않았다는 것이지, 해당 값이 비었거나 nil임을 의미하지 않습니다.
Activity Streams
문서는 루트 값이 Activity Streams Object(어떤 타입이든, Collection 포함)인 JSON 문서를 말하며,
그 MIME 미디어 타입은 "
application/activity+json" 입니다.
Activity Streams 2.0 문서는 MUST UTF-8 문자 인코딩을 사용하여 직렬화되어야 합니다.
Activity Streams 2.0 문서의 직렬화된 JSON 형태는 표준 JSON-LD 1.0 처리 알고리즘 및 API [JSON-LD-API]의 컴팩션 알고리즘을 이용해 생산되는 것과 일치해야 합니다(MUST). 이때 적어도 여기에서 제공하는 규범적 JSON-LD @context 정의를 사용해야 합니다. 구현체는 제공된 @context에 추가적인 @context 정의를 추가할 수 있지만(MAY), 규범적 context를 덮어쓰거나 변경해서는 안 됩니다(MUST NOT). 또한 구현체는 JSON-LD @context에 정의되지 않은 추가 속성과 값을 사용할 수 있지만(MAY), 이러한 속성은 표준 JSON-LD 알고리즘을 사용하는 구현에서는 지원되지 않을 수 있고 무시될 수 있음을 이해해야 합니다. 확장 처리 방식에 대한 추가 정보는 확장성 절을 참고하세요.
JSON-LD는 @context라는 특수 속성을 사용하여 처리
컨텍스트를 정의합니다. @context 속성의 값은 [JSON-LD] 명세에 의해 정의됩니다. Activity Streams 2.0 문서를 생성하는 구현체는 SHOULD @context 속성을 포함시켜야 하며, 그 값에 "
https://www.w3.org/ns/activitystreams"를 포함해야 합니다. 대안으로 "
http://www.w3.org/ns/activitystreams" URL도 사용할 수 있습니다(MAY). 이 작업은 문자열, 객체, 배열을 사용해 구현할 수 있습니다.
{
"@context": "https://www.w3.org/ns/activitystreams",
"summary": "A note",
"type": "Note",
"content": "My dog has fleas."
}
@vocab 키워드와 확장 용어용 prefix를 사용하여 객체로 context를 제공하는 문서.
{
"@context": {
"@vocab": "https://www.w3.org/ns/activitystreams",
"ext": "https://canine-extension.example/terms/",
"@language": "en"
},
"summary": "A note",
"type": "Note",
"content": "My dog has fleas.",
"ext:nose": 0,
"ext:smell": "terrible"
}
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"css": "http://www.w3.org/ns/oa#styledBy"
}
],
"summary": "A note",
"type": "Note",
"content": "My dog has fleas.",
"css": "http://www.csszengarden.com/217/217.css?v=8may2013"
}
JSON-LD가 활성화된 Activity Streams 2.0 구현체가 "application/activity+json" MIME 미디어 타입으로 식별되는 JSON
문서를 만났는데, 해당 문서에 규범적 Activity Streams 2.0 JSON-LD
@context 정의에 대한 참조가 포함된 @context 속성이 없다면, 구현체는 여전히 규범적 @context 정의가 적용된다고 간주해야
합니다(MUST).
이 명세서는 IRI [RFC3987]를 사용합니다. 모든 URI [RFC3986] 역시 IRI이므로, IRI가 명시된 곳엔 URI도 사용할 수 있습니다. 특이사항은 두 가지가 있습니다: (1) URI가 아닌 IRI를 역참조를 위해 제공할 때에는 [RFC3987] 3.1장의 단계에 따라 반드시 URI로 변환해야 하며(MUST), (2) IRI가 "id" 값으로 사용될 때에는 변환하면 안 됩니다(MUST NOT).
상대 IRI(및 URL) 참조는 많은 JSON 파서 구현체들이 상대 참조를 올바르게 해석하는 데 필요한 base 컨텍스트를 안정적으로 보존하지 못하므로, Activity Streams 2.0 문서 내에서는 사용되지 않아야 합니다(SHOULD NOT).
날짜 및 시간 값을 가진 모든 속성은 반드시 [RFC3339]의 "date-time" production을 따라야 하며(MUST), 한 가지 예외로 초(seconds)는 생략할 수 있습니다(MAY). 날짜와 시간 구분에는 반드시 대문자 "T"를, 숫자형 타임존 오프셋이 없으면 반드시 대문자 "Z"를 사용해야 합니다(MUST).
이것은 다음 [ABNF] 구문 설명으로 명시되어 있습니다. "time-hour", "time-minute", "time-second", "time-secfrac", "time-offset", "full-date" 구문들은 [ RFC3339]에 정의되어 있습니다.
as2-partial-time = time-hour ":" time-minute [":" time-second]
[time-secfrac]
as2-full-time = as2-partial-time time-offset
as2-date-time = full-date "T" as2-full-time
`time-offset` 구성요소는 타임존과 일치하지 않으며, `time-offset`이 포함된 시간 값은 타임스탬프로는 잘 작동하지만 추가적인 정보와 처리가 없이는 지역 "벽시계 시간(wall times)"으로 신뢰할 수 있게 변환할 수 없음을 주의해야 합니다.
이 절은 비규범적입니다.
다음은 세 가지 예시로, 각각 상세 수준이 다릅니다.
각 예시는 이 명세에서 정의된 규범적 JSON 직렬화 방식을 따릅니다.
'http://www.test.example/martin'이
'http://example.org/foo.jpg'를 생성했다라는 문장을 표현합니다. 추가적인 세부 정보는 제공되지 않습니다.
{
"@context": "https://www.w3.org/ns/activitystreams",
"summary": "Martin created an image",
"type": "Create",
"actor": "http://www.test.example/martin",
"object": "http://example.org/foo.jpg"
}
{
"@context": "https://www.w3.org/ns/activitystreams",
"summary": "Martin added an article to his blog",
"type": "Add",
"published": "2015-02-10T15:04:55Z",
"actor": {
"type": "Person",
"id": "http://www.test.example/martin",
"name": "Martin Smith",
"url": "http://example.org/martin",
"image": {
"type": "Link",
"href": "http://example.org/martin/image.jpg",
"mediaType": "image/jpeg"
}
},
"object" : {
"id": "http://www.test.example/blog/abc123/xyz",
"type": "Article",
"url": "http://example.org/blog/2011/02/entry",
"name": "Why I love Activity Streams"
},
"target" : {
"id": "http://example.org/blog/",
"type": "OrderedCollection",
"name": "Martin's Blog"
}
}
{
"@context": "https://www.w3.org/ns/activitystreams",
"summary": "Martin's recent activities",
"type": "Collection",
"totalItems": 1,
"items" : [
{
"type": "Add",
"published": "2011-02-10T15:04:55Z",
"generator": "http://example.org/activities-app",
"nameMap": {
"en": "Martin added a new image to his album.",
"ga": "Martin phost le fisean nua a albam."
},
"actor": {
"type": "Person",
"id": "http://www.test.example/martin",
"name": "Martin Smith",
"url": "http://example.org/martin",
"image": {
"type": "Link",
"href": "http://example.org/martin/image",
"mediaType": "image/jpeg",
"width": 250,
"height": 250
}
},
"object" : {
"name": "My fluffy cat",
"type": "Image",
"id": "http://example.org/album/máiréad.jpg",
"preview": {
"type": "Link",
"href": "http://example.org/album/máiréad.jpg",
"mediaType": "image/jpeg"
},
"url": [
{
"type": "Link",
"href": "http://example.org/album/máiréad.jpg",
"mediaType": "image/jpeg"
},
{
"type": "Link",
"href": "http://example.org/album/máiréad.png",
"mediaType": "image/png"
}
]
},
"target": {
"type": "Collection",
"id": "http://example.org/album/",
"nameMap": {
"en": "Martin's Photo Album",
"ga": "Grianghraif Mairtin"
},
"image": {
"type": "Link",
"href": "http://example.org/album/thumbnail.jpg",
"mediaType": "image/jpeg"
}
}
}
]
}
Activity Vocabulary는 Activity Streams 2.0의 핵심 객체 타입과 속성을 표준적으로 정의합니다.
이 어휘에서 정의된 객체 타입은 8개의 핵심 타입과, 많은 사회적 웹 애플리케이션에서 공통적으로 사용되는 Activity 및 Object 타입 확장 세트로 구분됩니다. 핵심 타입에는 다음이 포함됩니다:
OrderedCollection,CollectionPage,
그리고OrderedCollectionPage.
Activity Streams 2.0 문서의 모든 JSON 객체는
Object 또는
Link입니다. Activity Vocabulary에서
정의된 다른 모든 타입 및 확장 타입은 이 두 개의 기본 타입에서 파생됩니다.
Activity Streams 2.0 문서 내의 JSON 객체가 다음 중 하나에 해당하면
Link입니다: (a) 객체에
type 속성이 포함되어 있고, 그 값에 "Link"가 포함된 경우 또는 (b) type 속성의 값에 포함된 타입 중 일부가
Link의 확장으로 정의된 경우(예: Mention 참고). 그 외에는 해당 JSON 객체는
Object의 인스턴스 또는 확장형으로 간주됩니다.
Object는 Activity
Streams 어휘의 기본 타입입니다.
글로벌 식별자( id 속성, 절대 IRI로 표현)와 "object type"( type 속성으로 표현)을 갖는 것 외에도, 모든
Object 타입 인스턴스는 Activity
Vocabulary에서 표준적으로 정의한 공통 속성 집합을 공유합니다. 여기에는 다음이 포함됩니다:
attachment |
attributedTo
|
audience |
content |
context |
contentMap |
name |
nameMap |
endTime |
generator |
icon |
image |
inReplyTo |
location |
preview |
published |
replies |
startTime |
summary |
summaryMap |
tag |
updated |
url |
to |
bto |
cc |
bcc |
mediaType |
duration
모든 속성은 선택 사항입니다(id와 type 포함).
id와 type 속성으로 글로벌 식별자와 객체 타입을 나타내는 Object 예시입니다:
{
"@context": "https://www.w3.org/ns/activitystreams",
"id": "http://example.org/foo",
"type": "Note",
"name": "My favourite stew recipe",
"attributedTo": {
"id": "http://joe.website.example/",
"type": "Person",
"name": "Joe Smith"
},
"published": "2014-08-21T12:34:56Z"
}
Activity Vocabulary는 여러 사회적 웹 애플리케이션에서
일반적으로 사용되는 다양한 Object 타입도 정의합니다. 이 명세는 이러한 객체들 대부분에 대해 의미적으로 구체적인 속성을 정의하지 않습니다. Activity
Vocabulary에 포함되지 않은 추가적인 세부 정보는 외부 어휘를 사용하여 표현할 수 있습니다.
또한 구현체들은 Activity Vocabulary에서 정의된 것 외에 새로운 Object 타입을 자유롭게 도입할 수 있지만, 다른 구현체에서 인식하지 못하는 확장 타입에 지나치게 의존하면 상호운용성 문제가 발생할 수 있습니다. 기존 Object 타입과 과도하게 겹치거나 중복되지 않도록 주의해야 합니다.
만약 구현체가 핵심 어휘 타입과 중복되는 확장 타입을 사용할 경우, 반드시(MUST) 핵심 어휘 타입도 명시해야
합니다. 예를 들어, Good Relations Vocabulary와 같이 특정 위치를 설명하는 자체 타입을 정의하는 어휘들이 있습니다. 구현체가 만약
http://purl.org/goodrelations/v1#Location을
객체 타입으로 사용하고자 한다면, 아래와 같이
Place임을 반드시 함께
지정해야 합니다:
gr:Location을
모두 갖는 Object 예시:{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"gr": "http://purl.org/goodrelations/v1#"
}
],
"type": ["Place", "gr:Location"],
"name": "Sally's Restaurant",
"longitude": 12.34,
"latitude": 56.78,
"gr:category": "restaurants/french_restaurants"
}
외부 어휘에서 정의된 특정 속성이 Activity Vocabulary의 속성과 겹치거나 중복될 수 있습니다. 이런 중복이 있을 때는 일관된 상호운용성을 위해 반드시(MUST) Activity Vocabulary에서 정의한 속성을 우선 사용해야 합니다.
Activity Streams를 사용하는 소비자는 종종 웹 브라우저나 콘솔 등에서 Activity Streams 객체의 텍스트 표현이 필요합니다.
name 속성은 작성자나
다른 사용자의 입력에서 유래되는 것이 바람직합니다(SHOULD).
summary
속성은, name 속성이 없을 때 자동 생성된 값 등으로서 객체의 텍스트 백업 표현으로 사용할 것이 바람직합니다(SHOULD). name이 없으면 summary 값에 마크업이 포함되면 안 되며(SHOULD NOT), 객체의 텍스트 표현으로 사용하기에 충분히 짧아야 합니다(SHOULD).
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Note",
"id": "http://example.org/note/123",
"name": "Our Weather Is Fine",
"content": "I feel that the weather is appropriate to our season and location."
}
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Note",
"id": "http://example.org/note/124",
"summary": "A note by Sally",
"content": "Everything is OK here."
}
name와 summary 속성은 없을 수도 있고(MAY), 최종
사용자의 현재 언어로 명시적 값이 없을 수도 있으며(MAY), 해당 언어 환경에서 객체의 텍스트 표현으로
사용하기엔 너무 길 수 있습니다(MAY). 이러한 경우, 소비자 구현체는 텍스트 표현에 대한 적절한 대체 전략을
가져야 합니다(SHOULD).
Link는 [RFC5988]에서 설정한 링크의 개념적 모델과
밀접하게 연관된, 또 다른 리소스에 대한 자격이 부여된 간접 참조를 설명합니다. Link 객체의 속성은 참조된 리소스의 속성이 아니며, 렌더링 에이전트가 해당 리소스를 어떻게 사용할지
이해할 수 있게 힌트를 제공합니다. 예를 들어, height와 width는 참조된 이미지의 실제 픽셀 크기가 아니라, 렌더링 시 원하는
크기를 나타낼 수 있습니다.
Link의 타겟 URI는 필수
href 속성으로 표현됩니다.
모든 Link 인스턴스는 Activity
Vocabulary에서 표준적으로 정의된 다음과 같은 공통 선택 속성을 공유합니다:
id |
name |
hreflang |
mediaType |
rel |
height |
width
예를 들어, 모든 Objects는 해당
객체의 그래픽 표현을 나타내는 값을 가진
image 속성을 가질
수 있습니다. 이 속성은 일반적으로 사용자가 볼 수 있는 이미지(JPEG, GIF, PNG 등) 리소스의 URL을 제공하는 데 사용됩니다. 하나의 객체에 여러 시각적 표현(예: 여러
스크린샷 또는 다양한 해상도의 동일 이미지)이 있을 수 있습니다. Activity Streams 2.0에서 이러한 참조를 기술하는 방법은 본질적으로 세 가지가 있습니다.
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Application",
"id": "http://example.org/application/123",
"name": "Exampletron 3000",
"image": "http://example.org/application/123.png"
}
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Application",
"id": "http://example.org/application/123",
"name": "Exampletron 3000",
"image": {
"type": "Link",
"href": "http://example.org/application/123.png",
"mediaType": "image/png"
}
}
형식적으로, 첫 번째 예시는 이미지 리소스와의 자격 없는 직접 관계를 설정하고, 두 번째는 관계에 대한 추가 속성을 명시할 수 있는 자격이 부여된 간접 관계를 설정합니다.
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Application",
"id": "http://example.org/application/123",
"name": "Exampletron 3000",
"image": [
"http://example.org/application/abc.gif",
{
"type": "Link",
"href": "http://example.org/application/123.png",
"mediaType": "image/png"
}
]
}
이러한 배열에 포함된 각각의 항목은 서로 독립적이며, 순서에는 아무런 의미가 부여되지 않습니다.
RFC 5988에 따르면 모든 Link는 링크의 맥락 목적을 설명하는 "link relation"을 가집니다. Link 내에서는
rel 속성으로 link
relation 값을 설정합니다. rel 속성이 없는 경우, 링크 관계는 미지정 상태로 간주합니다. 하나의 Link에 여러 link relation 값을 가질 수
있으며, JSON 직렬화에서는 하나의 문자열 또는 여러 값을 배열로 표현할 수 있습니다.
링크 관계의 적용 범위는 해당 Link가 즉시 포함된 객체입니다.
아래 예시에서는 두 개의 참조가 있습니다. 첫 번째의 link relation은 미지정 상태이며, 두 번째는 "thumbnail"입니다.
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Application",
"id": "http://example.org/application/123",
"name": "Exampletron 3000",
"image": [
"http://example.org/application/abc.gif",
{
"type": "Link",
"href": "http://example.org/application/123.png",
"mediaType": "image/png",
"rel": "thumbnail"
}
]
}
[HTML5] 명세는 "link relation"을 다소 다르게 정의합니다. HTML5 정의에서는 "space" U+0020, "tab" (U+0009), "LF" (U+000A), "FF" (U+000C), "CR" (U+000D), "," (U+002C) 문자가 포함되지 않은 문자열은 유효한 link relation이 될 수 있습니다. 상호운용성을 위해, Activity Streams 2.0 구현체는 [RFC5988] 및 [HTML5] 모두에 구문적으로 유효한 link relation 만을 사용해야 합니다(MUST). 등록되지 않은 link relation 값도 사용할 수 있습니다(MAY).
Link와 Object 타입은 서로 겹치지 않음을 유의하세요. 즉, 하나의 Object가 동시에 Link일 수 없습니다.
Actor 객체는 행동(Activity)을 수행할 수 있는 주체(엔터티)를 나타내는 기본 Object 타입의 특수화된 형태입니다.
Activity
Vocabulary에서는 5가지 Actor 타입을 표준적으로 정의합니다:
Application
|
Group |
Organization
|
Person |
Service.
본 명세는 Actor를 가장 일반적인 차원에서만 규정하며, 각각의 Actor에 대한 의미적으로 구체적인 속성들은 정의하지 않습니다.
모든 Actor 객체는 Object를 특수화한
것이며, Object의 모든 핵심 속성을 상속받습니다.
Activity Vocabulary에 포함되지 않은 세부 정보 표현에는 외부 어휘를 사용할 수 있습니다. 예를 들어 VCard [
vcard-rdf]는
Person,
Group, Organization
인스턴스의 부가 메타데이터를 제공하는 데 사용해야 합니다(SHOULD).
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{"vcard": "http://www.w3.org/2006/vcard/ns#"}
],
"summary": "Sally created a note",
"type": "Create",
"actor": {
"type": ["Person", "vcard:Individual"],
"id": "http://sally.example.org",
"name": "Sally Smith",
"vcard:given-name": "Sally",
"vcard:family-name": "Smith"
},
"object": {
"type": "Note",
"content": "This is a simple note"
}
}
구현체는 Activity Vocabulary에서 정의된 Actor 타입 이외에 새 타입을 도입할 수 있으나, 다른 구현이 인식하지 못하는 확장 타입에 대한 과도한 의존은 상호운용성 문제를 야기할 수 있습니다. 기존 Actor 타입과 불필요하게 중복되거나 겹치지 않도록 주의해야 합니다.
만약 구현체가 핵심 어휘 타입과 중복되는 확장 타입을 사용할 경우, 반드시(MUST) 핵심 어휘 타입도 명시해야
합니다.
예를 들어 일부 어휘(VCard 등)에서는 사람을 설명하는 자체 타입을 정의합니다.
구현체가 vcard:Individual을 Actor로 사용하고자 할 경우, 위 예시처럼
Person임도 함께 명시해야
합니다.
Activity 객체는 이미 발생했거나 현재 진행 중이거나 앞으로 발생할 수 있는 행동에 대한 정보를 제공하는 기본 Object 타입의 특수화 모델입니다.
Object의 공통 속성 외에,Activity
객체는
다음과 같은 추가 속성을 지원합니다(Vocabulary 참고):
actor |
object |
target |
origin |
result |
instrument
type 속성은 Activity Statement가 나타내는 동작의 유형을 식별하는 데 사용됩니다.
{
"@context": "https://www.w3.org/ns/activitystreams",
"summary": "Joe liked a note",
"type": "Like",
"id": "http://www.test.example/activity/1",
"actor": "http://example.org/profiles/joe",
"object": "http://example.com/notes/1",
"published": "2014-09-30T12:34:56Z"
}
Activity Vocabulary는 여러 소셜 웹 애플리케이션에서
공통적으로 사용하는 소수의 Activity 타입을 정의합니다.
본 명세는 그중 다수의 Activity에 대해 의미적으로 구체적인 속성을 정의하지 않습니다.
Activity Vocabulary에 포함되지 않은 추가 세부정보를 표현할 때 외부 어휘를 사용할 수 있습니다.
구현체는 Activity Vocabulary에 정의된 타입 이외에 새로운 Activity 타입을 자유롭게 도입할 수 있지만, 다른 구현에서 인식하지 못하는 확장 타입에 과도하게 의존하면 상호운용성 문제가 발생할 수 있습니다. 기존 Activity 타입과 불필요하게 중복되거나 겹치지 않도록 주의해야 합니다.
구현체가 핵심 어휘 타입과 중복되는 확장 타입을 사용할 경우 반드시(MUST) 핵심 어휘 타입도 지정해야 합니다.
예를 들어 일부 어휘(Schema.org 등)는 동작을 설명하는 고유 타입을 정의합니다.
구현체가 http://schema.org/LikeAction을 Activity로
사용하려면, 아래 예시처럼
Like임도 함께 지정해야
합니다.
http://schema.org/LikeAction을 함께 가진 Activity 예시:{
"@context": "https://www.w3.org/ns/activitystreams",
"summary": "Joe liked a note",
"type": ["Like", "http://schema.org/LikeAction"],
"id": "http://www.test.example/activity/1",
"actor": "http://example.org/profiles/joe",
"object": "http://example.com/notes/1",
"published": "2014-09-30T12:34:56Z"
}
구현체는 Activity 객체를 수동적인 용도(활동이 발생했거나 발생 중임을 기록) 또는 명령형 용도(애플리케이션이 명시된 동작을 일관되게 수행하도록 상태를 수정)로 자유롭게 사용할 수 있습니다. 하지만 이 명세는 포맷 사용 방식에 제약을 두는 표준 처리 모델을 정의하지 않으므로, Activity 문장이 수동 알림인지, 명령형 명령으로 해석되는지는 구현체마다 다를 수 있습니다.
IntransitiveActivity 객체는 목적어 없는 행동(비타동적 행동)을 나타내는 Activity 타입의 특수화입니다. IntransitiveActivity 객체에는
object 속성이
존재하지 않습니다.
Collection 객체는 다른
Object 또는
Link를 담는 컨테이너 역할을 하는 기본
Object의 특수화입니다.
모든
Object에서
상속받는 속성 외에도,
Collection 타입은 다음 추가 속성을
가집니다:
items |
totalItems |
first |
last |
current
Collection 내부의 항목들은 정렬되어
있을 수도 있고 아닐 수도 있습니다.
OrderedCollection 타입을 사용하면 항상 정렬된
Collection임을 명시할 수 있습니다(MAY). JSON 직렬화에서 정렬되지 않은 항목은
items 속성을, 정렬된 항목은 orderedItems 속성을 통해 나타냅니다.
{
"@context": "https://www.w3.org/ns/activitystreams",
"summary": "Object history",
"type": "Collection",
"totalItems": 2,
"items": [
{
"type": "Create",
"actor": "http://www.test.example/sally",
"object": "http://example.org/foo"
},
{
"type": "Like",
"actor": "http://www.test.example/joe",
"object": "http://example.org/foo"
}
]
}
{
"@context": "https://www.w3.org/ns/activitystreams",
"summary": "Object history",
"type": "OrderedCollection",
"totalItems": 2,
"orderedItems": [
{
"type": "Create",
"actor": "http://www.test.example/sally",
"object": "http://example.org/foo"
},
{
"type": "Like",
"actor": "http://www.test.example/joe",
"object": "http://example.org/foo"
}
]
}
하나의 Collection에 많은 항목이 포함될 수 있습니다. Collection의 모든 항목을 items (또는
orderedItems) 속성으로만 직렬화하는 것은 비현실적일 수 있습니다. 이 경우 Collection 내 항목들을 여러 부분 집합 또는
"페이지(page)"로 나눌 수 있습니다. 페이지는
CollectionPage 타입으로 식별합니다.
타입은 기본
CollectionPage
Collection 타입을 확장하며
모든 속성을 상속받습니다. 다음 추가 속성도 지정될 수 있습니다:
partOf |
next |
prev |
partOf 속성은
Collection 중 해당
CollectionPage의 항목들이 속하는 컬렉션을 식별합니다.
first, next, prev, last, current
속성은 부모 컬렉션에서 추가 항목 부분 집합을 담은
를 참조하는 데 사용됩니다.
CollectionPage
Collection 객체와 마찬가지로, CollectionPage의 항목들도 정렬되어 있을 수도, 아닐 수도 있습니다.
OrderedCollectionPage
타입으로 페이지 내 항목이 항상 엄격하게 정렬됨을 명시할 수 있습니다(MAY).
타입은
OrderedCollectionPage
와
CollectionPage
모두를 확장합니다. 해당 페이지에 포함된 첫 항목이 전체 OrderedCollection
OrderedCollection에서 차지하는 상대 인덱스 위치는
startIndex
속성 값으로 표시할 수 있습니다.
정렬 여부와 무관하게, Collection의 페이지는 일반적으로 단일 또는 이중 연결 리스트 형태로 순서대로 배치됩니다. first
속성은 이 순서에서 첫 페이지를, last 속성은 마지막 페이지를 식별합니다. prev와 next 속성은 각각
바로 앞/뒤 페이지를 참조합니다.
current 속성은 Collection에서 최근 생성 또는 업데이트된 항목 부분집합을 담은 페이지를 식별합니다.
first, last, next, prev, current의
값은
단일
이거나, CollectionPage
Link를 통해
별도 리소스의
를 참조할 수도 있습니다.
CollectionPage
{
"@context": "https://www.w3.org/ns/activitystreams",
"summary": "Sally's recent activities",
"type": "Collection",
"id": "http://example.org/foo",
"totalItems": 10,
"first": {
"type": "CollectionPage",
"id": "http://example.org/foo?page=1",
"partOf": "http://example.org/foo",
"next": "http://example.org/foo?page=2",
"items": [
{
"type": "Create",
"actor": "http://www.test.example/sally",
"object": "http://example.org/foo"
}
]
}
}
OrderedCollection에 페이징을 사용할 경우, 구현체가 각 페이지의 순서를 예측 가능한 방식으로 처리하리란 보장이 없기 때문에 까다로울 수
있습니다.
논리적 컬렉션의 전체 항목 순서를 복원하고자 하는 구현체는, 시퀀스에서 첫(또는 마지막) 페이지로 이동한 뒤 next (또는
prev) 링크를 재귀적으로 따라가며 모든 페이지를 처리해야 합니다.
OrderedCollection의 페이지들은 OrderedCollectionPage 인스턴스가 되어야 하며(SHOULD), 그렇지 않으면 소비자는 올바른 순서를 신뢰성 있게 복원할 수 없습니다.
어휘(Vocabulary)에서 정의된 여러 속성들은 자연어 값을
사용하도록 정의되어 있습니다. 이러한 값은 한 가지 또는 그 이상의 언어로 제공되는 사람이 읽을 수 있는 문자열입니다. JSON 직렬화에서는 (1) 단일 JSON 문자열 또는 (2) 잘
형성된 [BCP47] 언어 태그를 로컬라이즈된 번역 값에 매핑하는 JSON 객체로 표현할 수
있습니다. 직렬화된 JSON에서, 이 두 가지 형태는 간단한 속성 명명 규칙으로 구분됩니다. 예를 들어 "name"은
name 속성의 JSON 문자열
형태를, "nameMap"은 객체 형태를 나타냅니다.
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Object",
"name": "This is the title"
}
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Object",
"nameMap": {
"en": "This is the title",
"fr": "C'est le titre",
"es": "Este es el título"
}
}
객체 형태의 각 키는 반드시(MUST) 잘 형성된 [BCP47] 언어 태그이어야 하며, 연관된 값은 반드시(MUST) 문자열이어야 합니다.
Activity Vocabulary는 자연어 값을 사용하는 세 가지
속성을 정의합니다:
name,
summary,
content입니다.
이에 따라 JSON 직렬화에서 "name", "summary", "content"는 문자열 형태이고,
"nameMap", "summaryMap", "contentMap"는 객체 형태를 나타냅니다.
언어를 알 수 없거나 결정할 수 없는 값을 명확하게 나타내기 위해 객체 형태에서 특수 언어 태그 "und"를 사용할 수 있습니다.
"und" 언어 태그
사용:{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Object",
"nameMap": {
"und": "This is the title"
}
}
Activity Streams 2.0 문서 생성 또는 소비 시, [JSON-LD]의 메커니즘을 이용하면 @context 내
@language 속성으로 기본 언어를 지정할 수 있습니다(MAY). 이 메커니즘은
JSON-LD를 사용하여 Activity Streams 2.0을 처리하지 않는 구현체에는 이해되지 않을 수 있습니다.
@context 내에서 기본 "@language" 지정:
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"@language": "en"
}],
"type": "Object",
"name": "This is the title"
}
Activity Streams 2.0 문서 내의 자연어 값은 양방향(좌우 혼합) 텍스트를 포함할 수 있습니다(MAY). Activity Streams 2.0 문서의 기본 방향은 좌에서 우(Left-to-Right)입니다. 개별 자연어 값의 기본 방향은 아래 설명처럼 수정할 수 있습니다(MAY).
자연어 값에 대해 양방향 텍스트를 지정할 때, 텍스트의 첫 강한 방향성 문자로 정확하게 기본 방향을 결정할 수 없다면, 발행자는(SHOULD) 해당 값에 적절한 유니코드 양방향 제어 문자로 접두어나, 허용되는 경우 HTML 방향성 마크업을 붙여 기본 방향을 명확히 해야 합니다.
양방향 텍스트가 포함된 Activity Streams 2.0 문서를 소비하는 쪽에서는, 각 자연어 값의 기본 방향을(SHOULD) 마크업 태그 내부가 아닌 첫 강한 방향성 문자를 스캔하거나, 제공된 방향성 마크업을 활용해 파악해야 합니다. 기본 방향이 결정되면, 소비자는(MUST) 유니코드 양방향 알고리즘([BIDI])에 따라 자연어 값의 올바른 렌더링 및 표시를 결정해야 합니다. 이를 위해 표시 전에 문자열 앞뒤에 추가 제어 문자나 마크업을 감싸는 등의 조치가 필요할 수 있습니다.
| 속성 | 값 | 방향 | 방법 |
|---|---|---|---|
name |
"פעילות הבינאום, W3C" |
오른쪽에서 왼쪽(Right-to-Left) | 첫 강한 방향성 문자 |
name |
"The document was titled, '\u2067פעילות הבינאום, W3C\u2069'"
|
왼쪽에서 오른쪽(Left-to-Right) | 첫 강한 방향성 문자 |
name |
"\u200FHTML היא שפת סימון" |
오른쪽에서 왼쪽(Right-to-Left) | 양방향 제어 문자(Bidi Control Character) |
name |
"\u200E'سلام' is hello in Persian." |
왼쪽에서 오른쪽(Left-to-Right) | 양방향 제어 문자(Bidi Control Character) |
summary |
<p dir=\"rtl\">HTML היא שפת סימון>/p>
|
오른쪽에서 왼쪽(Right-to-Left) | HTML 마크업 |
summary |
<p>פעילות הבינאום, W3C</p>
|
오른쪽에서 왼쪽(Right-to-Left) | 마크업 무시 후 첫 강한 방향성 문자 |
summary |
<p title="سلام">Hello</p>
|
왼쪽에서 오른쪽(Left-to-Right) | 마크업 무시 후 첫 강한 방향성 문자 |
알고 있는 경우, Activity Streams 2.0 발행자는 명시적으로 자연어 속성의 언어를 나타내야 하며, map 속성이나 기본 언어 태그를 사용할 수 있습니다.
본 명세의 예시가 모두 자연어 속성의 언어를 명시적으로 표기하는 것은 아닙니다. 이는 의도된 사항입니다. 저자와 작업 그룹은 구현자가 명시적 언어 표기가 들어간 예시를 새 문서 템플릿으로 그대로 복사하여 사용하다 언어 표기가 정확하지 않게 되는 것을 막고자 했습니다.
Activity Streams 2.0에서 "확장"이란 Activity Vocabulary에 정의되지 않은 모든 속성, 액티비티, actor 또는 객체 타입을 의미합니다. 소비 구현체가 익숙하지 않은 확장을 만났을 때는 처리를 중단하거나 오류 신호를 내지 말아야 하며(MUST NOT), 해당 속성이 존재하지 않는 것처럼 계속해서 아이템을 처리해야 합니다(MUST). 확장 지원은 구현체마다 다를 수 있고, 확장에 대해 표준 처리 모델이 따로 정의되어 있지 않음을 유의해야 합니다. 따라서, 확장에 지나치게 의존하면 다른 구현체와의 상호운용성이 저하될 수 있습니다.
확장 정의와 구분에는 [JSON-LD]가 주 메커니즘으로 사용됩니다. 확장 지원을 완전히 하고자 하는 구현체는 [JSON-LD] 메커니즘을 사용해야 합니다(SHOULD).
일부 널리 쓰이는 확장은 Activity Streams 2.0 네임스페이스 문서에 포함되어 있으며, https://www.w3.org/ns/activitystreams#extensions에서 참고할 수 있습니다. Social Web Incubator Community Group은 Activity Streams 확장에 관한 위키 페이지를 유지하고 있습니다.
또, JSON-LD Processing Algorithms [ JSON-LD-API]의 현재 정의에서는, JSON-LD @context에 정의되지 않은 속성은 조용히 무시됩니다. 확장 속성이 포함된 Activity Streams 2.0 문서를 발행하는 구현체는 모든 확장에 대한 @context 정의를 제공해야 합니다(SHOULD).
또한 JSON-LD 문서에 사용할 수 없는 유효한 JSON 구조도 있다는 점을 유념해야 합니다. 예를 들어, JSON-LD에서는 GeoJSON 명세에서처럼 "배열의 배열"을 사용할 수 없습니다. 구현체는 Activity Streams 2.0 문서에서 이러한
구조를 확장 구조로 자유롭게 사용할 수 있지만, 표준 JSON-LD 처리 알고리즘을 사용하는 소비자는 이런 확장을 무시하거나 JSON-LD 알고리즘을 적용하기 전에 호환 가능한 대안 구조로
매핑해야 합니다. 예를 들어 단순 GeoJSON Point는
Place 객체로 매핑할 수 있고, 좀
더 복잡한 geometry는 아래 비규범적 예시처럼 GeoSparql
"Well-Known Text" 형식으로 변환할 수 있습니다.
{
"type": "Point",
"coordinates": [36.74, -119.77]
}
Place 대안:
{
"@context": "https://www.w3.org/ns/activitystreams",
"name": "Fresno, California",
"type": "Place",
"latitude": 36.74,
"longitude": -119.77
}
{
"type": "Polygon",
"coordinates": [
[
[100.0, 0.0],
[101.0, 0.0],
[101.0, 1.0],
[100.0, 1.0],
[100.0, 0.0]
]
]
}
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{"gsp": "http://www.opengis.net/ont/geosparql"}
],
"summary": "A polygon",
"type": "gsp:Geometry",
"gsp:asWKT": "Polygon((100.0, 0.0, 101.0, 0.0, 101.0, 1.0, 100.0, 1.0, 100.0, 0.0))"
}
JSON-LD 구문은 "Compact URI"의 사용을 지원합니다. Compact URI는 정의된 prefix를 이용하여 URI를 간략하게 직렬화하는 대체 형식입니다. 예를 들어, URI
http://example.org/term은 ex: prefix를 http://example.org/에 할당하면
ex:term으로 표현할 수 있습니다.
JSON-LD에서 Compact URI 접두사는 JSON-LD @context 정의 내에서 정의합니다. 예시:
{
"@context": {
"ex": "http://example.org/",
"term": {
"@type": "id",
"@id": "ex:term"
}
},
"term": "ex:Foo"
}
이 예시에서 속성 이름 term과 값 ex:Foo 모두 Compact URI입니다. 속성 이름 term은
http://example.org/term으로 확장되고, 값 ex:Foo는 http://example.org/Foo로
확장됩니다.
JSON-LD에서 Compact URI 형태의 값 확장은 @context 정의에서 해당 속성이 명시적으로
"type": "id"로 정의된 경우에 적용됩니다. 즉, Compact URI는 IRI(또는 URI) 값이 예상되는 곳이면 어디든 사용할 수 있습니다.
Activity Streams 2.0 구현체가 확장 지원을 완전히 하려면, JSON-LD 명세에서 정의한 Compact URI 확장을 반드시(MUST) 지원해야 합니다. 이 확장은 모든 속성 이름과, JSON-LD @context에서 타입이 @id로 명시된 모든
속성 값에 적용됩니다.
Compact URI 형식에 과도하게 의존하면 구현체 간 모호성 및 상호운용성 문제가 발생할 수 있습니다. 그러므로 Compact URI는 속성명과 type 속성의
값 외에는 가능하면 사용을피해야 합니다(SHOULD).
확장 속성을 포함하는 Activity Streams 2.0 문서를 JSON-LD 메커니즘으로 파싱 후 재직렬화할 때, 구현체는 원본 문서 내 확장 속성이 올바르게 보존되고 직렬화되는지 신중하게 확인해야 합니다(SHOULD).
예를 들어, 다음은 가상의 foo와 bar 확장 속성이 들어있는 Activity Stream 객체입니다. foo
확장은 JSON-LD @context 내에 정의되어 있고, bar 확장 속성은 아닙니다.
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{"foo": "http://example.org/foo"}
],
"type": "Note",
"content": "This is a simple note",
"foo": 123,
"bar": 321
}
이 Note 객체를 받은 구현체는 단순히 일반 JSON 객체로 파싱할 수도, 표준 JSON-LD Expand 알고리즘을 사용할 수도 있습니다.
객체를 일반 JSON으로 파싱 후 재직렬화(예: 저장 또는 재배포)하는 경우, @context와 foo, bar 속성
값을 그대로 보존하여 재직렬화된 출력에 포함시키면 됩니다.
하지만 JSON-LD Expand 알고리즘을 쓴다면 @context는 펼쳐진 결과에서 제거되며, bar 속성은 "blank node"
_:bar로 매핑됩니다. 이후 이 문서를 규범적 Activity Streams 2.0 context로 재직렬화하면, JSON-LD compacted 형태는 아래와
같습니다:
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Note",
"content": "This is a simple note",
"http://example.org/foo": 123,
"bar": 321
}
이 결과는 원본과 유사하지만, foo 속성이 완전히 확장된 URI 라벨로 바뀌는 것은 바람직하지 않을 수 있습니다. 수신 문서의 JSON-LD 확장을 처리하는
구현체가 재직렬화 시 객체가 잘 직렬화되도록 하려면, JSON-LD 확장 과정에서 사용된 원본 @context를 보존하여 JSON-LD compacted 형태로
재직렬화할 때 재사용해야 합니다(SHOULD).
Activity Streams 2.0 문서는 신원, 연락처 정보, 물리적 위치, 신체적 특징 등과 같은 잠재적으로 민감한 개인정보를 포함할 수 있으며(그리고 포함할 가능성이 높습니다). 또한, 전반적으로 Activity 데이터는 개별 또는 그룹 Actor의 행동 프로필을 생성하는 데 분석될 수 있습니다.
Activity Streams 2.0 문서를 생성하거나 소비하는 구현체는 반드시 모든 잠재적 사용자에게 다음 사항을 공개적으로 문서화 및 알릴 조치를 취해야 합니다: (a) 구현체가 발행·소비·수집하는 잠재적 민감 개인정보의 종류, (b) 그러한 정보를 발행·소비·수집하는 이유, (c) 그 정보가 사용되는 방식, (d) 해당 정보를 공유하는 제3자의 신원, (e) 그 정보를 다른 주체와 공유하는 이유.
Activity Streams 2.0 문서를 발행하는 구현체는 기본적으로 사용자가 추가 정보를 “opt-in”(자발적 동의)하지 않는 한 문서에 포함되는 민감 개인정보의 종류와 양 모두를 제한하는 입장을 취해야 합니다.
Activity Streams 2.0 문서를 소비하는 구현체는, 기본적으로, 사용자가 해당 정보 저장·공유에 “opt-in”하지 않는 한, 소비한 문서 내에 포함된 민감 개인정보를 저장하거나 공유해서는 안 됩니다.
여기서 “opt-in”은 반드시 사용자의 명시적 행동을 의미하지는 않습니다. 예를 들어, 특정 민감 개인정보의 사용이 구현체 사용 목적상 명백히 내포되어 있다면(예: 위치 추적 서비스), 위 문서화 지침을 지키는 한 그 구현체의 사용은 그 정보 사용·공유에 대한 암묵적 동의로 간주할 수 있습니다.
Activity Streams를 공공 데이터 스트림으로 구현하는 발행자 또는 소비자는 원치 않는 상업적/악성 콘텐츠 가능성을 고려해야 하며, 그러한 콘텐츠를 식별하거나 구현체에 포함하지 않도록 예방 조치를 취해야 합니다.
발행자는 크로스사이트 스크립팅 공격 등 잠재적 악의적 사용자 입력이 자신이 발행하는 Activity Streams 데이터에 포함되지 않도록 합당한 조치를 취해야 합니다.
소비자가 유입된 콘텐츠를 최종 사용자에게 재송출하는 경우에는, 유입된 악성 입력이 재송출되지 않도록 반드시(MUST) 합리적인 조치를 취해야 합니다.
소비자가 수집된 콘텐츠를 검색 엔진 크롤링 대상으로 재송출하는 경우 사이트가 검색엔진 최적화(SEO) 허점으로 이용되지 않도록 합당한 조치를 취해야 합니다. 예를 들어 신뢰할 수 없는 하이퍼링크를 텍스트로 변환하거나 rel="nofollow" 속성을 추가할 수 있습니다.
소비자는 공격자가 속성을 위조해 악의적 콘텐츠를 주입하거나 정상 콘텐츠를 숨기거나 훼손하거나 사용자를 현혹하는 “스푸핑” 공격 가능성도 인지해야 합니다.
Activity Streams는 JSON 문서이며 [RFC7159]에 서술된 동일한 보안 고려사항이 적용됩니다.
Activity Streams 구현체는 URI를 다룹니다. [RFC3986] 7절을 참고하세요.
Activity Streams 구현체는 IRI를 다룹니다. [RFC3987] 8절을 참고하세요.
application/activity+json 미디어 타입
본 명세는 Activity Streams 2.0 형식을 준수하는 문서를 식별하기 위해
application/activity+json
MIME 미디어 타입을 등록합니다.
| Type name: | application |
| Subtype name: | activity+json |
| Required parameters: | 없음 |
| Optional parameters: |
profile: application/activity+json 미디어 타입의 profile 파라미터는 하나 이상의 프로파일 URI를 지정할 수 있습니다. 이 프로파일
URI들은 [RFC6906]에서 정의된 식별 의미를 가집니다.
"profile" 미디어 타입 파라미터는 반드시 따옴표로 감싸야 하며, 비어있지 않은 공백구분
URI 목록이어야 합니다(프로파일 URI들).
profile-param = "profile=" profile-value
profile-value = <"> profile-URI 0*( 1*SP profile-URI ) <">
profile-URI = URI 위 문법의 "URI"는 [RFC3986] 3절의
"URI"를 의미합니다.
|
| Encoding considerations: |
"application/activity+json" 미디어 타입을 사용하는 리소스는 "application/json"
미디어 타입의 모든 요구조건을 준수해야 하며, [RFC7159]
11절의 인코딩 고려사항이 그대로 적용됩니다.
|
| Security considerations: | 본 명세에서 정의된 바와 같습니다. |
| Contact: | James M Snell <jasnell@gmail.com> |
Activity Streams 2.0 형식은 JSON-LD 관례를 사용하지만, Activity Streams 2.0 구현에 추가 요구 사항과 제약이 있기 때문에 별도 미디어 타입을 사용합니다.
Activity Streams 2.0은 제한된 JSON-LD 프로파일로 볼 수 있으므로, 구현체는 `application/ld+json; profile="https://www.w3.org/ns/activitystreams"` 미디어 타입을 `application/activity+json`과 동등하게 취급하는 것이 권장됩니다.
본 명세의 모든 도표/예시/참고 사항과 “비규범적”으로 명시된 절은 비규범적입니다. 그 외 모든 부분은 모두 규범적입니다.
적합한(conforming) 문서는 문서를 위한 모든 적합성 기준을 준수하는 문서입니다. 가독성을 위해 일부 적합성 요구사항은 발행자에 대한 요구처럼 기술되지만, 그런 요구들은 암묵적으로 문서 자체에 적용됩니다. 모든 문서는 발행자를 가진다고 가정합니다.
적합 문서는 Activity Streams 1.0의 폐기/구식 문법을 포함해서는 안 됩니다. 적합 문서는 Activity Vocabulary의 속성과 타입을 포함해야 합니다. 다른 어휘를 사용하는 적합 문서는 C절의 예시처럼 동등한 Activity Vocabulary 속성과 타입도 포함해야 합니다. 적합 문서는 2절에 명시된 대로 JSON-LD 또는 기타 직렬화 형식에서 본 사양이 허용하지 않은 기능을 사용해서는 안 됩니다. 적합 문서가 Activity Streams 2.0 Vocabulary에서 정의한 것 외의 타입/속성을 포함하는 경우 5절의 확장성 기능을 사용해야 합니다.
문서의 예시(포괄적 목록 아님):
적합한 구현체란 적합 문서를 발행, 저장, 분석, 소비 혹은 기타 방식으로 처리하는 소프트웨어를 말합니다. 구현체는 크게 발행자와 소비자의 두 종류가 있습니다.
적합 발행자는 적합한 문서를 생성 및 발행하는 구현체입니다. 적합 발행자는 2절의 직렬화 요건에 따라 문서를 공개해야 하며, 6절의 개인정보 보호와 7절의 보안사항도 반드시 고려해야 합니다.
발행자의 예시(포괄적 아님):
적합 소비자는 적합한 문서를 읽고 분석하는 구현체입니다. 적합 소비자는 Activity Streams 1.0의 폐기/구식 속성이나 타입도 허용해야 하며, 자신이 사용하는 도메인에 부적합한 속성이나 타입은 무시해야 합니다.
적합 소비자는 적합 문서를 다른 데이터 형식으로 다시 발행할 수 있습니다. 적합 소비자는 적합 문서를 사용해 화면·인쇄·음성 등 다양한 방식으로 사용자에게 제공할 수 있습니다. 적합 소비자는 이 때 정보의 의미가 잘 보존되도록 형식·미디어 변환을 충실히 해야 하며, 재발행할 때 6절 개인정보 보호와 7절 보안도 반드시 고려해야 합니다.
예시(포괄적 아님):
Activity Streams 2.0 명세는 W3C 소셜 웹 워킹 그룹의 산물입니다. 편집자는 본 명세의 현재 형태를 만드는 데 도움을 준 워킹 그룹 모든 구성원들의 토론, 이슈 제기와 테스트에 감사의 뜻을 전합니다.
또한, 명세가 W3C 소셜 웹 워킹 그룹의 산출물로 채택되기 이전에 Activity Streams에 기여한 모든 분들에게도 감사를 표합니다. Activity Streams 1.0은 커뮤니티 중심 노력의 결과였으며, 아래에 제한되지 않은 많은 커뮤니티의 기여자들—Abdul Qabiz, Adina Levin, Adrian Chan, Adriana Javier, Alan Hoffman, Alex Kessinger, Alexander Ovchinnikov, Alexander Zhuravlev, Alexandre Loureiro Solleiro, Amy Walgenbach, Andres Vidal, Angel Robert Marquez, Ari Steinberg, Arjan Scherpenisse, Arne Roomann-Kurrik, Beau Lebens, Ben Hedrington, Ben Metcalfe, Ben Werdmuller, Benjamin Goering, Bill de hOra, Bo Xing, Bob Aman, Bob Wyman, Brett Slatkin, Brian Walsh, Brynn Evans, Charlie Cauthen, Chris Chabot, Chris Messina, Chris Toomey, Christian Crumlish, Dan Brickley, Dan Scott, Daniel Chapman, Danny Ayers, Dare Obasanjo, Darren Bounds, David Cramer, David Nelson, David Recordon, DeWitt Clinton, Douglas Pearce, Ed Summers, Elias Bizannes, Elisabeth Norris, Eric Marcoullier, Eric Woods, Evan Prodromou, Gee-Hsien Chuang, Greg Biggers, Gregory Foster, Henry Saputra, Hillary Madsen, Howard Liptzin, Hung Tran, Ian Kennedy, Ian Mulvany, Ivan Pulleyn, Jacob Kim, James Falkner, James Pike, James Walker, Jason Kahn, Jason Kantz, Jeff Kunins, Jeff Martin, Jian Lin, Johannes Ernst, John Panzer, Jon Lebkowsky, Jon Paul Davies, Jonathan Coffman, Jonathan Dugan, Joseph Boyle, Joseph Holsten, Joseph Smarr, Josh Brewer, Jud Valeski, Julien Chaumond, Julien Genestoux, Jyri Engestroem, Kaliya Hamlin, Kevin Marks, Laurent Eschenauer, Laurie Voss, Leah Culver, Libby Miller, Manu Mukerji, Mark Weitzel, Marko Degenkolb, Marshall Kirkpatrick, Martin Atkins, Martin Svensson, Marty Alchin, Mary Hoder, Matt Leventi, Matt Wilkinson, Matthias Mueller-Prove, Max Engel, Max Wegmueller, Melvin Carvalho, Michael Buckbee, Michael Chan, Michael Richardson, Michael Sullivan, Mike Macgirvin, Mislav Marohnić, Mo Jangda, Monica Wilkinson, Nate Benes, NeilFred Picciotto, Nick Howard, Nick Lothian, Nissan Dookeran, Nitya Narasimhan, Pablo Martin, Padraic Brady, Pat Cappelaere, Patrick Aljord, Peter Ferne, Peter Reiser, Peter Saint-Andre, Phil Wolff, Philip (flip) Kromer, Richard Cunningham, Richard Zhao, Rick Severson, Robert Hall, Robert Langbert, Robert Dolin, Robin Cover, Ryan Boyd, Sam Sethi, Scott Raymond, Scott Seely, Simon Grant, Simon Wistow, Stephen Garcia, Stephen Sisk, Stephen Paul Weber, Steve Ivy, Steve Midgley, Steven Livingstone-Perez, Sylvain Carle, Sylvain Hellegouarch, Tantek Çelik, Tatu Saloranta, Tim Moore, Timothy Young, Todd Barnard, Tosh Meston, Tyler Gillies, Will Norris, Zach Copley, Laurent-Walter Goix, Matthew Marum, Andy Smith, 그리고 Zach Shepherd—의 초기 기여가 없었다면 지금의 명세도 존재하지 않았을 것입니다.
본 절은 비규범적입니다.
주: 이 부록은 비규범적이지만 MUST와 같은 규범적 용어를 사용합니다. 규범적 용어가 등장하는 곳에서는, 구현자가 본 부록에서 기술한 Activity Streams 1.0 역호환 모델을 올바르게 구현하고자 할 때 필요함을 의미합니다.
본 명세에서 정의된 문법은 JSON Activity Streams 1.0에서 정의된 문법과 다르지만, 원본 명세에서 정의된 근본적인 모델은 그대로 유지됩니다. 본 명세는 기존 Activity Streams 1.0 문서를 Activity Streams 2.0 문서로 매핑하고 처리할 수 있도록 하는 구체적인 처리 규칙을 정의합니다.
본 명세에서 정의된 JSON 문법은 원본 JSON Activity Streams 1.0 [ AS1] 명세에서 정의된 것과는 하위 호환되지 않는 방식으로 다르게 정의되어 있습니다. 구현체는 여전히 JSON Activity Streams 1.0 문법을 지원할 수 있지만, 이는 폐기된 것으로 간주되어야 합니다. 즉, 구현체가 1.0 문법을 소비할 수는 있지만, 특별히 2.0이 아닌 옛 구현과 상호작용할 때를 제외하고 1.0 문법을 출력해서는 안 됩니다.
구체적으로:
application/stream+json" MIME 미디어 타입을, 2.0
문법에 따르면 "application/activity+json"을 사용할 수 있습니다.
application/stream+json" 또는 좀 더 일반적인 "application/json" MIME 미디어 타입으로 식별된
직렬화를 처리할 경우, 구현체는 반드시(MUST) [AS1]에서 정한 문법·처리 규칙을 준수해야 합니다. 2.0 문법과 처리 규칙은
"application/activity+json" 미디어 타입으로 직렬화된 경우에만 적용됩니다.
id를 JSON-LD @id 키워드의 별칭으로,
objectType과 verb를 JSON-LD @type 키워드의 별칭으로 처리해야 합니다.
displayName 속성을 사용하며, 이는 Activity Streams 2.0에서는 name으로
이름이 변경되었습니다. 구현체는 displayName을 name의 별칭으로 처리해야 합니다.
title 속성을 사용하는데, 이는 2.0에서 제거되었습니다. 구현체가 1.0 문서를 2.0 문서로 처리할 때
title 속성은 확장으로 취급해야 합니다.
content와
summary 속성을 자연어
값으로 재정의합니다. 즉, 값이 문자열이거나 언어 태그 → 문자열 매핑 객체가 될 수 있습니다. 1.0 문법에서는 순수 문자열만 허용됩니다. 1.0 값이 본 명세에서도 유효한
부분집합이므로, 구현체가 이 값을 계속 지원하기 위해 별도의 조치를 할 필요는 없습니다.
upstreamDuplicates 및 downstreamDuplicates 속성을 폐기하고
대체 방안을 제공하지 않습니다. 이는 실제 구현 근거 부족 때문입니다. 해당 속성은 계속 사용할 수도 있지만(MAY),
구현체는 사용을 지양해야 합니다(SHOULD).
post" 동사를 객체 생성과 서비스에 "게시/업로드"하는 행위를 모두 설명하는 데 사용했습니다. 본 명세는
"post" 동사를
Create와
Add Activity 타입으로
분리했습니다. 구현체가 1.0 문서를 2.0으로 변환할 때, 동작에 target 속성이 명시되지 않았다면 "post"를
Create로, target 속성이 있으면 Add로 처리해야 합니다(SHOULD).
이 지침을 따르면, 1.0 형태의 모든 JSON Activity Streams 직렬화도 2.0 구현체에서 문제없이 처리할 수 있습니다.
본 절은 비규범적입니다.
활동의 데이터 출처(data provenance) 및 주석(annotation)과 같은 특정 특성을 다루기 위해 여러 어휘를 함께 사용하는 것이 가능합니다. 예시: Eric이 팔로워들에게 공유할 짧은 메모를 작성합니다. 메모를 게시한 후 맞춤법 오류를 발견합니다. 메모를 수정하고 다시 게시합니다. 나중에 Eric은 해당 정보가 부정확하다고 판단하고 메모를 삭제합니다.
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"oa": "http://www.w3.org/ns/oa#",
"prov": "http://www.w3.org/ns/prov#",
"dcterms": "http://purl.org/dc/terms/",
"dcterms:created": {
"@id": "dcterms:created",
"@type": "xsd:dateTime"
}
}
],
"summary": "Editing history of a note",
"type": "Collection",
"items": [
{
"id": "http://example.org/activity/20150101000000",
"type": [ "Create", "prov:Activity" ],
"actor": {
"id": "http://example.org/#eric",
"name": "Eric"
},
"summary": "Eric wrote a note.",
"object": {
"id": "http://example.org/entry/20150101000000",
"type": [ "Note", "prov:Entity" ],
"attributedTo": "http://example.org/#eric",
"content": "Remember... all I'm offering is the trooth. Nothing more."
},
"published": "2015-01-01T00:00:00Z"
},
{
"id": "http://example.org/activity/20150101000059",
"type": [ "Update", "prov:Activity", "oa:Annotation" ],
"summary": "Eric edited a note.",
"dcterms:created": "2015-01-01T00:00:59Z",
"dcterms:creator": { "@id": "http://example.org/#eric" },
"oa:hasBody": {
"id": "http://example.org/entry/20150101000059",
"type": [ "Note", "prov:Entity" ],
"content": "Remember... all I'm offering is the truth. Nothing more.",
"prov:wasAttributedTo": { "@id": "http://example.org/#eric" },
"prov:wasRevisionOf": { "@id": "http://example.org/entry/20150101000000" }
},
"oa:hasTarget": { "@id": "http://example.org/entry/20150101000000" },
"oa:motivatedBy": { "@id": "oa:editing" },
"prov:generated": { "@id": "http://example.org/entry/20150101000059" },
"prov:wasInformedBy": { "@id": "http://example.org/activity/20150101000000" }
},
{
"id": "http://example.org/activity/20150101010101",
"type": [ "Delete", "prov:Activity" ],
"actor": "http://example.org/#eric",
"summary": "Eric deleted a note.",
"object": "http://example.org/entry/20150101000059",
"published": "2015-01-01T01:01:01Z"
}
]
}
본 절은 비규범적입니다.
다음은 2016-12-15 이전의 candidate recommendation에서 본 문서에 적용된 대표적인 변경 사항입니다.
CollectionPage
속성 관련 설명을 명확하게 수정했습니다.
@vocab 키워드와 확장 용어 접두사를 사용한 객체로 context를 제공하는 문서
'http://www.test.example/martin'이 'http://example.org/foo.jpg'를 생성했다는 문장을 표현하며,
추가적인 세부 정보는 없음
id와 type 속성을 사용해 글로벌 식별자와 객체 타입을 표현한 Object 예시
Place와 gr:Location을
모두 가진 Object 예시Like와
http://schema.org/LikeAction을 모두 가진 Activity 예시"und" 언어 태그 사용@context 내에서 기본 "@language" 지정
Place 대안