개발자 문서
한국어

시작하기

파발 소개

파발이 무엇이고 어떻게 짜여 있는지, 지금 무엇이 되고 무엇이 아직 안 되는지.

파발이란

파발(擺撥)은 조선 시대에 말을 갈아타며 급한 소식을 이어 달리던 역참 제도입니다. Pabal.me 는 그 이름을 딴 메신저로, 조직이나 공동체가 자기 서버에서 운영하는 텔레그램 호환 메신저입니다.

  • 서버를 직접 운영합니다. 계정·대화·사진이 모두 운영자의 서버와 데이터베이스(PostgreSQL)에 저장됩니다. 서버 프로그램의 이름은 HunsTelegram(Java 21)입니다.
  • 텔레그램의 말을 그대로 씁니다. 앱과 서버 사이는 텔레그램과 같은 MTProto 2.0(레이어 216), 봇과 서버 사이는 텔레그램과 같은 HTTP Bot API 입니다. 그래서 텔레그램용으로 만든 앱·라이브러리·봇이 주소만 바꿔 파발에 붙습니다.
  • 텔레그램과는 연결되지 않은 별도의 세계입니다. 파발 계정은 파발 서버에만 있고, 텔레그램 사용자와 메시지를 주고받을 수는 없습니다.

어떻게 짜여 있나

사람 · 프로그램 입구 파발 서버 (HunsTelegram) 파발 앱Pabal.app · 텔레그램 앱 봇 프로그램라이브러리 · curl 브라우저사이트 · 문서 · 링크 MTProto:8443 · 자체 암호화 HTTPS :443Caddy (인증서 자동) 게이트웨이MTProto 2.0 · 레이어 216 Bot API · 웹훅/bot<토큰>/<메서드> 웹사이트 · 문서/ · /docs/ · /사용자명 서비스 메시지함 · 대화 목록 실시간 업데이트 (pts) 그룹 · 사진 · 프로필 가입 코드 · 인증 키 @BotFather · 봇 등록부 관리 화면 (127.0.0.1) PostgreSQL이벤트저장소 파일사진 원본data/media MTProto 봇 웹훅 POST (HTTPS)
파발의 구성 — 입구는 두 개, 기록은 한 곳

다이어그램 설명

  • 세 영역: 왼쪽은 서버 밖에서 도는 것(앱·봇 프로그램·브라우저), 가운데는 서버의 두 입구, 오른쪽은 서버 안입니다. 봇 프로그램도 서버 밖, 운영자나 개발자의 컴퓨터에서 돕니다.
  • 입구는 둘뿐입니다: 앱은 MTProto 포트(8443) 로 바로 붙고(MTProto 가 스스로 암호화하므로 HTTPS 가 필요 없음), 웹사이트와 Bot API 는 HTTPS(443) 로 들어옵니다.
  • 봇은 두 길 중 하나로 붙습니다: 보통은 HTTPS 의 Bot API(실선), 원하면 앱과 같은 MTProto(파란 점선)로도 됩니다. 어느 쪽이든 같은 봇 계정·같은 메시지함입니다.
  • 빨간 점선은 거꾸로 가는 유일한 화살표입니다: 봇이 웹훅을 설정하면 서버가 봇 프로그램의 HTTPS 주소로 새 소식을 보냅니다. 나머지는 모두 바깥에서 서버로 들어오는 요청입니다.
  • 기록은 한 곳입니다: 모든 변경은 서비스를 거쳐 PostgreSQL 의 이벤트 저장소에 남고, 사진 원본만 파일로 둡니다. 앱에서 보낸 메시지도, 봇이 보낸 메시지도 같은 길을 지나므로 푸시·대화 목록·재접속 복구가 모두에게 똑같이 적용됩니다.

지금 되는 것, 아직 안 되는 것

기능상태메모
가입·로그인 (전화번호 + 코드)코드는 SMS · 이메일 · 관리자 전달 중 운영자가 고름
1:1 대화, 실시간 수신, 여러 기기꺼져 있던 기기는 다시 켜면 놓친 것을 따라잡음
메시지 고치기·지우기상대 화면에도 바로 반영
기본 그룹 (만들기·멤버 넣기·내보내기·이름)멤버는 그룹 정보에서 직접 넣음
사진 보내기, 프로필 사진원본 한 가지 크기로 저장
봇 — @BotFather, HTTP Bot API, 웹훅, MTProto 봇버튼·콜백·명령어 메뉴·사진·그룹
관리 화면, 운영 설정서버의 127.0.0.1 에만 열림
웹사이트 10개 언어, 사용자명·초대 링크 페이지개발자 문서도 10개 언어
채널, 슈퍼그룹아직앱에 제대로 보이지 않을 수 있음
문서·동영상·음성 파일, 앨범아직보내면 MEDIA_INVALID 로 거절
서식 있는 글 (굵게·기울임), 봇의 parse_mode아직글자 그대로 보냄. 명령·멘션·링크·해시태그는 자동 표시
음성·영상 통화, 비밀 대화아직
2단계 인증 (클라우드 비밀번호)아직설정하려 해도 거절
휴대폰 앱, 푸시 알림아직지금은 macOS 데스크톱 앱
초대 링크로 그룹에 들어가기아직링크는 만들어지지만 눌러도 멤버가 되지 않음
인라인 모드(@봇 검색어), 결제, 게임아직

텔레그램과의 관계

파발은 텔레그램의 공개된 프로토콜을 따르는 별도의 서버입니다. 텔레그램 사(社)와 관계가 없고, 텔레그램 서버에 접속하지도 않습니다.

  • 호환되는 것: MTProto 2.0 (전송 4종, 핸드셰이크, 임시 키 바인딩), 레이어 216 의 요청·응답 형식, HTTP Bot API 의 주소 형식·요청·응답·오류 형식. 공식 텔레그램 데스크톱 6.2.6 을 수정 없이(서버 주소와 공개키만 바꿔) 붙여 확인했습니다.
  • 다른 것: 계정과 데이터가 서버마다 따로입니다. 사용자 ID·메시지 ID·파일 ID 는 이 서버 안에서만 뜻이 있습니다. 텔레그램에서 쓰던 봇 토큰은 쓸 수 없고, 파발의 @BotFather 에게서 새로 받아야 합니다.

앱과 서버는 링크를 https://pabal.me/ 로 만듭니다. 브라우저에서 열면 앱을 여는 작은 페이지가 뜹니다.

링크앱에서 여는 주소
pabal.me/<사용자명>사람이나 봇의 대화 열기tg://resolve?domain=<사용자명>
pabal.me/+<초대 코드>그룹 초대 링크 (앱이 열리지만, 링크로 들어가기는 아직 안 됨)tg://join?invite=<초대 코드>
pabal.me/joinchat/<초대 코드>예전 형식의 초대 링크 (같은 뜻)tg://join?invite=<초대 코드>

사용자명은 영문자로 시작하는 영문자·숫자·밑줄 5~32자입니다(봇은 bot 으로 끝남). docs, admin, health 처럼 사이트가 쓰는 경로와 같은 이름은 링크로 열리지 않습니다.

보안 모델

  • 앱 ↔ 서버: MTProto 2.0 으로 암호화됩니다. 앱은 서버의 RSA 공개키를 몸속에 넣고 빌드되어, 다른 서버가 파발 서버인 척할 수 없습니다. 대화는 텔레그램의 "클라우드 대화"와 같아서 서버는 내용을 읽을 수 있습니다(종단간 암호화가 아님). 서버를 믿을 수 있는 사람이 운영해야 하는 이유입니다.
  • 봇 ↔ 서버: Bot API 는 HTTPS 로만 공개합니다. 봇 토큰은 봇의 비밀번호입니다 — 새어 나갔으면 @BotFather 에서 /revoke 로 바꾸세요. 이전 토큰과 그 토큰으로 붙어 있던 연결이 즉시 끊깁니다.
  • 서버 → 웹훅: 서버는 HTTPS 이고 공인 주소인 웹훅에만 요청을 보냅니다. 사설망·루프백·클라우드 메타데이터 같은 내부 주소는 거절합니다. 봇은 secret_token 으로 요청이 진짜 파발 서버에서 왔는지 확인할 수 있습니다.
  • 관리: 관리 화면은 서버 자신(127.0.0.1)에만 열리고, 토큰이 있어야 데이터를 볼 수 있습니다. 운영자는 SSH 터널로 들어갑니다.
  • 저장: 인증 키는 서버가 복호화에 써야 하므로 데이터베이스에 그대로 들어 있습니다. 데이터베이스와 백업은 서버의 RSA 비밀키만큼 지켜야 합니다.

용어

용어
MTProto텔레그램이 만든, 앱과 서버 사이의 암호화 프로토콜. 파발은 2.0 을 씁니다.
레이어 (layer)MTProto 위에서 오가는 요청·응답 형식의 판(版). 파발은 216 입니다.
인증 키 (auth key)앱이 처음 접속할 때 서버와 만드는 2048비트 비밀. 로그인은 이 키에 붙습니다.
DC텔레그램의 데이터 센터 번호. 파발은 서버 한 대가 DC 1~5 를 모두 맡습니다.
업데이트, pts새 메시지·수정·삭제 같은 변화. pts 는 사용자별 변화의 순번으로, 끊겼던 기기가 무엇을 놓쳤는지 알게 합니다.
피어 (peer)대화 상대 — 사람, 봇, 그룹.
봇 토큰<봇 ID>:<비밀> 꼴의 문자열. Bot API 주소에 넣어 봇을 증명합니다.
웹훅봇이 새 소식을 가지러 오는 대신, 서버가 봇의 HTTPS 주소로 보내 주는 방식.