기술 · GProtocol

GProtocol 프로토콜

GProtocol은 앱과 노드 사이의 모든 통신을 정의합니다. 요청과 응답의 형식, 62개의 액션, 오류를 표현하는 방법, 그리고 암호문만 허용되는 필드입니다.

현재 버전 8.0.0

전송과 버전

  • 앱에서 노드로: WebSocket + JSON. 필드 이름은 모두 카멜 케이스를 씁니다.
  • 노드 사이: libp2p. 프로토콜 ID는 /gather/message/1.0.0 같은 형태입니다. 노드 간 프로토콜은 노드 내부에서 구현되며 GProtocol에 속하지 않습니다.
  • 버전 규칙: 호환이 깨지는 변경이 있으면 메이저 버전을 올리고, 마이너 버전에서는 필드만 추가합니다. 로그인할 때 프로토콜 버전을 보내며, 메이저 버전이 다른 요청은 거부되고 업그레이드하라는 안내가 표시됩니다.
  • 실시간 액션(입력 중 표시, 통화 시그널링 등)은 전달할 수 없으면 폐기되며 오프라인 메시지로 저장되지 않습니다.

요청과 응답

requestType
regular는 노드가 처리하고, route는 노드 간 직접 전달
action
액션 경로. 예: /message/send
requestId
응답과 요청을 짝짓는 데 사용
submitter / receiver
양쪽의 주소. 보낸 사람은 노드가 인증된 신원으로 바꿔 넣음
data
업무 데이터. 내용에 해당하는 것은 모두 앱에서 이미 암호화됨
signature
요청 서명
errorKey
오류는 key로 표현하며, 앱은 key에 따라 해당 언어의 문구를 표시하고 노드가 돌려준 문자열은 사용자에게 그대로 표시되지 않음

노드가 보는 메시지

앱이 입구 노드로 보내는 1:1 메시지의 예입니다. 라우팅에 필요한 항목은 평문이고, 내용은 암호문일 뿐입니다.

wss://…/ws · /message/send
{
  "requestType": "route",
  "action": "/message/send",
  "requestId": "9c1e…a42f",
  "submitter": "N4k2…Qx7",
  "receiver": "Np8V…3dL",
  "timestamp": 1794420000000,
  "data": "q8Zr4t…/Hk1yWQ==",
  "signature": "3045…e1b0"
}

예시: 항목 이름은 GProtocol 8.0.0과 같고, 값은 가상의 예입니다.

14개 모듈, 62개 액션

삭제된 모듈은 더 이상 싣지 않습니다.

모듈액션 수용도
/user10핸드셰이크, 로그인과 로그아웃, 하트비트, 접속 상태, 노드 간 직접 프로필 교환
/message9전송, 수신 확인, 오프라인 가져오기, 읽음, 입력 중, 보내기 취소, 수정, 공감 표시
/file8분할 업로드와 다운로드, 자격 증명으로 가져오기
/call71:1 통화 시그널링, ICE와 중계 설정
/friend6친구 요청, 수락, 거절, 삭제, 목록
/key6X3DH 사전 키의 업로드, 가져오기, 보충, 잔량 부족 알림
/group4익명 팬아웃, 암호화된 상태 블록 읽기/쓰기, 보내기 취소(노드는 그룹을 보관하지 않음)
/push3푸시 토큰 등록, 해제, 테스트
/backup2암호화된 관계 백업과 즐겨찾기 백업
/device2이 노드의 활성 세션, 강제 로그아웃
/node2노드 신원 증명, 노드 디렉터리
/card · /security · /tip3연락처 카드, 보안 코드 확인, 후원 전달

프로토콜의 보안 설계

로그인

지갑 키가 「사용자 · 기기 · 타임스탬프」에 서명합니다. 노드는 아주 짧은 시간 창 안의 서명만 받아들이며, 프로토콜 메이저 버전도 함께 확인합니다.

노드 신원

앱이 난수를 보내면 노드가 서명해 돌려줍니다. 앱은 공개 키가 노드 ID와 일치하는지 확인하고, 운영자 귀속 증명과 릴리스 매니페스트도 검증합니다.

오프라인 메일함

메일함 식별자는 매일 바뀝니다. 내용은 X25519로 봉인되며 보낸 사람은 봉인 안쪽에 들어갑니다. 가져오기와 수신 확인에는 모두 서명이 필요합니다.

그룹

노드에는 익명의 전달 대상과 암호화된 상태 블록만 보이며, 그룹 이름과 멤버는 보이지 않습니다.

파일

가져오기 자격 증명은 파일 키에서 파생되며, 노드는 공유 목록을 저장하지 않습니다.

백업

백업 위치는 클라이언트가 파생하며 쓰기에는 서명이 필요합니다. 전체 네트워크가 공유하던 키는 폐지되었습니다.

프로토콜 현황

GProtocol은 아직 고정되지 않았으며, 출시 전에 메이저 버전이 바뀔 수 있습니다. 메이저 버전 간 호환은 현재 제공하지 않습니다. 프로토콜 정의 라이브러리는 현재 공개되어 있지 않습니다.