ActivityPub에는 두 층이 있습니다. 하나는 분산된 웹사이트들이 서로 정보를 나눌 수 있게 하는 서버 대 서버 연합 프로토콜이고,
다른 하나는 사용자가 휴대폰, 데스크톱 앱, 웹 앱 같은 클라이언트를 통해 자기 서버의 계정으로 활동할 수 있게 하는 클라이언트 대 서버 프로토콜입니다.
구현체는 둘 중 하나만 지원할 수도 있고 둘 다 지원할 수도 있습니다. 어느 한쪽을 만들고 나면 다른 쪽을 붙이는 일이 아주 멀지는 않으며,
둘을 함께 지원하면 사이트가 분산형 소셜 웹의 일부가 되고 여러 서비스에서 동작하는 클라이언트와 라이브러리를 활용할 수 있습니다.
ActivityPub에서 사용자는 서버의 계정을 통해 Actor로 표현됩니다. 같은 사람이 여러 서버에 계정을 가지고 있으면 각각은 별도의 Actor입니다.
모든 Actor는 세상에서 메시지를 받는 inbox와, 다른 사람에게 메시지를 보내는 outbox를 가집니다.
inbox와 outbox는 특별한 마법이 아니라 Actor의 ActivityStreams 설명 문서 안에 들어 있는 URL입니다.
예를 들어 어떤 Actor 문서를 가져오면 그 JSON 안에서 프로필 이름, 사용자 이름, 팔로워 목록, 받은 편지함, 보낸 편지함 주소를 확인할 수 있습니다.
ActivityPub는 ActivityStreams 어휘를 사용합니다. ActivityStreams에는 소셜 네트워크에서 필요한 활동과 콘텐츠를 표현하는 공통 단어가 이미 들어 있습니다.
더 필요한 것이 있으면 JSON-LD로 확장할 수 있지만, 확장을 하지 않는다면 보통의 JSON 문서처럼 읽어도 충분히 이해할 수 있습니다.
메시지 흐름은 이렇게 생각하면 쉽습니다. 사용자가 친구에게 보낼 Note를 작성하면 클라이언트는 그 Note를 자기 Actor의 outbox로 보냅니다.
서버는 이 객체가 Activity가 아니라 새로 만들어진 객체라는 것을 보고, 필요하면 Create Activity로 감싸서 “누가 무엇을 만들었다”는 형태로 정리합니다.
그런 다음 보내는 서버는 받는 사람의 Actor 문서를 조회해 상대 Actor의 inbox 주소를 찾고, 그 inbox로 Activity를 POST합니다.
그래서 사용자가 보기에는 “내 outbox에서 상대 inbox로 메시지가 흘러간다”고 이해할 수 있습니다. 실제로는 클라이언트 대 서버 단계와 서버 대 서버 연합 단계가 나뉘어 있습니다.
나중에 사용자는 자기 앱으로 inbox를 GET해서 새로 받은 활동을 읽습니다. 또 어떤 Activity는 이미 Activity 형태이기 때문에 서버가 다시 Create로 감싸지 않습니다.
예를 들어 좋아요는 Like Activity 그대로 outbox에 제출됩니다.
공개 글을 만들 때는 수신자에 팔로워 컬렉션과 ActivityStreams의 Public 대상을 함께 넣을 수 있습니다.
이렇게 주소가 지정된 활동은 팔로워에게 전달되고, 공개 대상으로 표시된 내용은 권한 없이도 읽을 수 있는 공개 게시물로 다뤄집니다.
1.1절은 ActivityPub가 Social Web Working Group에서 만든 여러 관련 규격 중 하나라고 설명합니다.
구현자는 필요에 따라 Micropub이나 Social Web Protocols 개요 같은 보완 규격도 함께 살펴볼 수 있습니다.
문단별 대조표
원문 Overview를 어느 부분에서 풀어 설명했는지
원문 흐름
이 페이지의 한국어 설명
핵심 단어
두 프로토콜 소개
서버 대 서버 연합 프로토콜과 클라이언트 대 서버 Social API를 먼저 나눠 설명합니다.
federation, client to server
구현 조합
둘 중 하나만 구현할 수도 있고, 둘을 함께 지원하면 분산형 소셜 웹과 범용 클라이언트의 이점을 얻는다고 풀이합니다.
Client, Server
Actor와 inbox/outbox
사용자는 서버 계정 단위의 Actor로 표현되고, 각 Actor는 메시지를 받는 inbox와 내보내는 outbox를 가진다고 설명합니다.
Actor, inbox, outbox
ActivityStreams와 JSON-LD
ActivityPub가 ActivityStreams 어휘를 쓰며, JSON-LD를 깊게 몰라도 기본 문서는 JSON처럼 읽을 수 있다고 풀었습니다.
ActivityStreams, JSON-LD
Note 제출과 Create 포장
사용자가 Note를 outbox에 보내면 서버가 새 객체 생성으로 해석해 Create Activity로 감쌀 수 있다고 설명합니다.
Note, Create
원격 inbox 배달
보내는 서버가 받는 사람 Actor를 조회하고, 그 Actor의 inbox에 Activity를 POST하는 흐름으로 정리했습니다.
POST, remote inbox
inbox 읽기, Like, 공개 발행
inbox GET으로 받은 활동을 읽고, Like Activity는 Create로 감싸지 않으며, followers와 Public으로 공개 범위를 표현한다고 설명합니다.
GET, Like, Public
1.1 Social Web Working Group
ActivityPub가 Social Web Working Group의 관련 규격 중 하나이며, Micropub과 Social Web Protocols도 함께 볼 수 있다고 안내합니다.
Micropub, Social Web
원문과 나란히 대조하려면 W3C Overview 원문을 함께 열어 보세요.
원문 1단계
두 프로토콜을 먼저 구분합니다
Overview는 ActivityPub를 “클라이언트가 내 서버와 말하는 규칙”과 “서버끼리 서로 전달하는 규칙”으로 나눠 설명합니다.
이 구분을 잡고 읽으면 뒤의 6장과 7장이 자연스럽게 이어집니다.
원문 2단계
사용자는 Actor로 표현됩니다
원문은 사람 자체가 아니라 서버 위의 계정을 Actor로 봅니다. 같은 사람이 서버마다 계정을 만들면 각 계정은 서로 다른 Actor가 됩니다.
이 Actor 문서 안에 inbox와 outbox URL이 들어 있습니다.
원문 3단계
JSON-LD를 몰라도 JSON처럼 읽을 수 있습니다
ActivityStreams와 JSON-LD가 기반이지만, 확장을 깊게 다루지 않는다면 Actor, Note, Create, Like 같은 값은 평범한 JSON 필드처럼 읽어도 됩니다.
다만 구현에서는 @context와 vocabulary 의미를 보존해야 합니다.
원문 4단계
Note가 Create Activity로 감싸집니다
사용자가 단순 Note를 outbox에 올리면 서버는 “새 Note를 만들었다”는 뜻의 Create Activity로 감싸 배달할 수 있습니다.
이미 Like 같은 Activity라면 다시 Create로 감싸지 않습니다.
원문 5단계
상대 Actor의 inbox를 찾아 전달합니다
보내는 서버는 받는 사람의 Actor 문서를 가져와 inbox를 찾고, 그 URL로 Activity를 POST합니다.
그래서 학습용으로는 “내 outbox에서 상대 inbox로 흐른다”고 생각하면 충분합니다.
원문 6단계
Public과 followers로 공개 범위를 표현합니다
공개 글은 followers 컬렉션과 Public 대상을 함께 주소로 넣을 수 있습니다. followers는 배달 대상이고,
Public은 인증 없이 읽을 수 있는 공개 대상이라는 의미입니다.