-
정적 웹사이트를 이용한 탈중앙 소셜 네트워킹 프로토콜로, 각 사용자가 자신의 데이터를 직접 소유하고 관리하는 구조
- 모든 데이터는 암호화된 JSON 저장소에 보관되며, 브라우저 클라이언트가 피드를 집계하고 게시물을 발행
-
서버나 릴레이 없이 친구 간 웹사이트와 브라우저 간 직접 통신으로 작동
- 사용자의 도메인 이름이 곧 신원이며, HTTPS/TLS를 통해 인증
- 단순한 구조로 자기 주권형 소셜 네트워크를 구현, 개인 간 신뢰 기반 교류에 초점
sAT Protocol 개요
-
s@는 정적 사이트 기반의 탈중앙 소셜 네트워킹 프로토콜로, 각 사용자가 자신의 웹사이트에 데이터를 저장
- 모든 데이터는 암호화된 JSON 파일 형태로 저장되며, 브라우저 클라이언트가 이를 읽고 게시물 발행 및 피드 집계 수행
-
중앙 서버나 릴레이 없이 작동하며, 데이터는 사용자의 사이트에서 친구의 브라우저로 직접 이동
-
상호 팔로우 관계가 있어야 게시물 교류가 가능하며, 인플루언서 중심 구조를 배제
- 프로토콜은 GitHub Pages 등 특정 호스팅 서비스에 종속되지 않음
신원(Identity)
- 사용자의 도메인 이름이 신원 역할을 수행
- HTTPS/TLS를 통해 도메인 소유자가 콘텐츠를 게시했음을 인증
디스커버리(Discovery)
-
https://{domain}/satellite/profile.json 경로에서 프로토콜 버전과 공개키를 제공
{
"satproto_version": "0.1.0",
"public_key": "<base64-encoded X25519 public key>"
}
- 기본 경로 /satellite/ 외에 다른 경로를 사용할 경우, .well-known/satproto.json 파일로 실제 저장소 위치 지정 가능
암호화 모델(Encryption Model)
- 모든 사용자 데이터는 암호화된 JSON 저장소에 저장되며, 사용자와 팔로워만 복호화 가능
-
X25519 키쌍을 사용해 공개키를 profile.json에 게시하고, 개인키는 브라우저 localStorage에 저장
- 게시물 데이터는 XChaCha20-Poly1305로 암호화되며, 콘텐츠 키는 팔로워별로 libsodium의 crypto_box_seal로 암호화
-
keys/_self.json 파일에는 사용자의 콘텐츠 키와 게시 비밀정보가 포함되어 있으며, 본인만 복호화 가능
키 회전 및 언팔로우
- 언팔로우 시 새로운 콘텐츠 키를 생성하고 모든 게시물을 재암호화
- 남은 팔로워에 대해 새 키 봉투를 생성하고 keys/_self.json 갱신
- 언팔로우된 사용자는 더 이상 게시물을 복호화할 수 없음
복호화 흐름
- 방문자가 친구의 사이트를 방문하면, 자신의 개인키로 keys/{follower-domain}.json을 복호화하여 콘텐츠 키 획득
- 이후 posts/index.json과 개별 게시물(posts/{id}.json.enc)을 가져와 복호화
데이터 구조(Data Schema)
- 각 게시물은 개별적으로 암호화된 파일로 저장되며, posts/index.json은 게시물 ID를 최신순으로 나열
- 게시물 객체 예시:
{
"id": "20260309T141500Z-a1b2",
"author": "alice.com",
"created_at": "2026-03-09T14:15:00Z",
"text": "Hello, decentralized world!",
"reply_to": null,
"reply_to_author": null
}
- 게시물 ID는 ISO8601 UTC 타임스탬프와 4자리 랜덤 해시로 구성
팔로우 목록(Follow List)
피드 집계(Feed Aggregation)
- 클라이언트는 팔로우 목록을 읽고 각 팔로워의 게시물을 복호화하여 시간순 피드를 구성
- 게시물은 created_at 기준 내림차순으로 정렬
댓글(Reply)
- 댓글은 reply_to와 reply_to_author 필드가 설정된 게시물
-
중첩 댓글은 지원하지 않으며, 최상위 게시물에만 직접 댓글 가능
- 원 게시물을 볼 수 없는 경우(비팔로우 상태 등) 댓글은 표시되지 않음
게시(Publishing)
- 새 게시물 생성 → 콘텐츠 키로 암호화 → 정적 사이트에 업로드 → posts/index.json 갱신
- 업로드에는 GitHub Contents API 등 사용 가능
- 게시 비밀정보는 keys/_self.json에 암호화되어 저장
정적 사이트 구조 예시
{domain}/satellite/
profile.json # 공개키 및 프로필
posts/
index.json # 게시물 ID 목록
{id}.json.enc # 암호화된 게시물
follows/
index.json # 팔로우 목록
keys/
_self.json # 콘텐츠 키 및 자격정보
{domain}.json # 팔로워별 콘텐츠 키
FAQ
- “RSS + 암호화인가?” → 예
- “AT Protocol에서 파이어호스 없는 버전인가?” → 예
- “확장성 있는가?” → 아니오 (“우정도 확장되지 않는다”)
- “s는 slow/shitty의 약자인가?” → 예
- “자가 호스팅 가능한가?” → 예, 단 CORS 활성화 필요