TRENDSHIFT 딥다이브 · 2026-06-27

simplex-chat/simplex-chat 딥다이브
— 사용자 식별자가 단 하나도 없는 첫 번째 메시징 네트워크

전화번호도, 사용자명도, 이메일도, 심지어 랜덤 숫자 ID도 없다. SimpleX는 '단방향 메시지 큐 주소'만으로 메시지를 전달하는, 세계 최초로 사용자 식별자가 전혀 없는 메신저다. 코어는 Haskell로 작성되었고, Signal의 이중 래칫(Double Ratchet) 암호화 위에 포스트-퀀텀 저항 키교환을 매 래칫 단계마다 적용한다. iOS(Swift)/Android(Kotlin/Compose Multiplatform)/데스크탑/CLI를 모두 지원하며, 서버를 직접 운영할 수 있다. (저장소: simplex-chat/simplex-chat · 버전 6.5.6.1 · AGPL-3.0 · ★27k+ · Trail of Bits 보안 감사 2회 완료 · Jack Dorsey·Asymmetric 투자 유치)
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 시스템 요구사항 · 설치
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

이 레포가 무엇을 하는 물건인가.

핵심 메시지

"Signal은 전화번호가 필요하고, Telegram은 사용자명이 필요하고, Matrix는 도메인 주소가 필요하다.
SimpleX는 아무것도 필요하지 않다 — 일회용 초대 링크 하나면 된다."

다른 모든 메신저는 사용자에게 어떤 형태의 식별자를 부여한다. 전화번호, 사용자명, 이메일, 공개키, 혹은 랜덤 UUID라도 — 이 식별자들이 모이면 '누가 누구와 언제 통신했는가'라는 메타데이터 그래프가 드러난다. SimpleX는 메시지를 '사람'이 아니라 '일회용 단방향 큐 주소'로 전달함으로써 이 그래프 자체를 없앤다.

코어는 Haskell로 구현된 SMP(SimpleX Messaging Protocol) 서버·클라이언트 라이브러리이며, 그 위에 iOS(Swift), Android·Desktop(Kotlin/Compose Multiplatform), CLI(Haskell 터미널 앱)가 올라간다. 자체 서버를 운영할 수도 있고, 공식 프리셋 서버(smp11, smp12, smp14.simplex.im)를 그대로 쓸 수도 있다.

용어
SMP — SimpleX Messaging Protocol
SimpleX가 자체 설계한 서버-클라이언트 메시지 릴레이 프로토콜. 핵심 규칙은 "서버는 큐(queue)만 알고, 누가 그 큐를 쓰는지 모른다". 각 연결마다 독립된 2개의 단방향 큐(송신용·수신용)가 생성되며, 큐 ID는 서버마다 다른 랜덤 바이트다. SMP 서버 소스는 별도 레포 simplex-chat/simplexmq에 있고, 이 레포는 그 라이브러리를 사용하는 채팅 앱이다.
용어
단방향 큐 (Unidirectional / Simplex Queue)
A→B 방향 메시지 전용 큐. 쌍방향 채팅에는 큐가 2개 필요하다(A→B 큐, B→A 큐). 각 큐는 별도 SMP 서버에 있을 수 있고, 큐끼리는 서로의 존재를 모른다. 덕분에 서버 측에서 "이 두 큐가 같은 대화의 양방향"임을 알 수 없다. 영어 'simplex'(단방향)에서 이름을 따왔다.
용어
이중 래칫 (Double Ratchet) + 포스트-퀀텀
Signal이 설계하고 WhatsApp 등도 쓰는 최강 E2E 암호 방식. SimpleX는 여기에 더해 매 래칫 단계마다 CRYSTALS-Kyber 기반 포스트-퀀텀 키교환을 수행한다(v5.6+). 현재의 양자 컴퓨터로는 물론, 미래의 양자 컴퓨터가 나와도 과거 메시지를 해독할 수 없도록 '지금 모아뒀다 나중에 깨기(harvest now, decrypt later)' 공격을 차단한다.

2왜 주목받는가

Signal·Matrix 대비 차별점과 트렌딩 이유.

2026년 상반기 TrendShift Daily 상위에 오른 배경은 세 가지가 겹친다. ① 메타데이터 프라이버시에 대한 인식 확산(EU AI법·각국 디지털 감시 논쟁), ② Trail of Bits의 2번째 보안 감사(2024년 7월) 공개로 신뢰도 상승, ③ Jack Dorsey·Asymmetric의 투자 유치(2024년 8월)로 미디어 노출 급증. 여기에 포스트-퀀텀 암호를 실제 적용한 몇 안 되는 오픈소스 메신저라는 기술적 차별점이 더해진다.

비교 항목SimpleXSignalMatrix (Element)Telegram
사용자 식별자없음 (큐 주소만)전화번호 필수사용자명@도메인전화번호 필수
메타데이터 보호누가 누구와 통신하는지 서버가 모름전화번호 연결 그래프 노출서버가 계정 보유거의 없음
서버 구조분산, 독립 릴레이, 서버간 통신 없음중앙 서버연합 서버중앙 서버
E2E 암호이중 래칫 + 포스트-퀀텀이중 래칫선택적 (방 설정)Secret Chat만
자체 서버 운영완전 지원불가가능불가
스팸 방지ID가 없어서 스팸 불가능전화번호로 타겟팅 가능사용자명 노출사용자명 노출
보안 감사Trail of Bits 2회 (2022·2024)복수복수없음(공개 감사)
코어 언어HaskellJava/Kotlin, SwiftTypeScript/GoC++
라이선스AGPL-3.0AGPL-3.0Apache 2.0비공개
주의 — 트레이드오프
식별자 없음 = 편의성 희생

친구에게 연락하려면 반드시 초대 링크나 QR코드를 먼저 공유해야 한다. 사용자명 검색으로 누군가를 찾거나 전화번호로 연락처를 동기화하는 기능이 없다. 연락처가 많은 일반 사용자에게는 불편하다.

또한 Signal처럼 "친구가 이미 쓰고 있을 확률"이 낮아 네트워크 효과가 약하다. 2024년 기준 활성 사용자 수를 공식적으로 집계조차 못 한다(식별자가 없으므로).

강점 — 메타데이터 완전 격리
서버는 진짜로 아무것도 모른다

SMP 릴레이 서버는 '큐에 메시지가 왔다 갔다'는 사실만 안다. 발신자가 누구인지, 수신자가 누구인지, 이 큐가 어떤 대화에 속하는지 모른다. 서버 운영자를 신뢰할 필요가 없다는 뜻이다 — 사용자가 공식 서버를 써도, 적대적 국가가 운영하는 서버를 강제로 써도, 메시지 내용과 상대방 정보는 노출되지 않는다.

3기술 스택 전체 지도

Haskell 코어부터 Swift/Kotlin 클라이언트, 암호 레이어, 서버 인프라까지.

백엔드 / 코어 라이브러리 (Haskell)

모듈/패키지역할주요 기술
simplex-chat.cabalGHC 9.6.3 기반 빌드. Cabal + Stack 지원GHC, cabal-install, hpack
Simplex.Chat (src/)채팅 로직 최상위 — 연결·메시지·파일·그룹 관리Haskell, STM, UnliftIO
Simplex.Chat.Controller이벤트 루프·상태 관리·명령 디스패처ReaderT 패턴, TVar, MVar
Simplex.Chat.Store (SQLite)로컬 암호화 DB (SQLite + sqlcipher)SQLite, 마이그레이션 시스템
Simplex.Chat.Protocol채팅 레벨 메시지 포맷 (JSON)Aeson, JSON 직렬화
Simplex.Chat.MobileiOS/Android FFI 바인딩 — Swift/Kotlin에 C API 제공Foreign Function Interface (FFI)
Simplex.Messaging.AgentSMP 프로토콜 에이전트 (simplexmq 라이브러리)SMP, XFTP, 큐 관리
Simplex.Messaging.Crypto암호 원시함수 — Curve25519/448, NaCl, Kybercrypton, libsodium, Kyber-1024
Simplex.FileTransfer (XFTP)대용량 파일 전송 프로토콜 (암호화, 분산)XFTP, HTTP/2, 청크 업로드

클라이언트 앱

플랫폼언어/프레임워크경로특이사항
iOSSwift, SwiftUIapps/ios/Haskell 코어를 XCFramework로 임베드. TestFlight 베타 상시 운영
AndroidKotlin, Jetpack Composeapps/multiplatform/ (android)Compose Multiplatform 기반. Haskell 코어 .so 링크
Desktop (Win/Mac/Linux)Kotlin, Compose Multiplatformapps/multiplatform/ (desktop)JVM 기반. 동일 Kotlin 코드베이스로 3개 OS 지원
CLI / 터미널Haskellapps/simplex-chat/WebSocket JSON API 서버 모드 지원. 봇 개발에 활용
봇 예제Haskellapps/simplex-bot/, apps/simplex-bot-advanced/WebSocket API로 봇 작성 예시. 다른 언어로도 봇 작성 가능

암호 레이어 상세

레이어알고리즘목적
E2E 메시지 암호Double Ratchet (Curve448 초기 키교환)완전 순방향 비밀성 + 사후 침해 복구
포스트-퀀텀CRYSTALS-Kyber-1024 (NIST PQC 표준)매 래칫마다 PQ 캡슐화 키교환 (v5.6+)
큐 레이어 암호NaCl cryptobox (Curve25519)서버-클라이언트 구간 추가 암호화
전송 레이어TLS 1.2/1.3 (CHACHA20POLY1305_SHA256)클라이언트-서버 전송 암호화
로컬 DB 암호SQLCipher (AES-256)기기 분실 시 데이터 보호
파일 전송XFTP + AES-256-GCM최대 1GB 파일 암호화 전송·저장
재생 공격 방지tlsunique 채널 바인딩 + 큐별 에페머럴 서명키캡처된 패킷 재사용 차단

서버 인프라

컴포넌트설명
SMP 서버 (simplexmq)인메모리 메시지 큐. Haskell로 구현. 포트 5223(SMP), 443(HTTPS 서버 정보 페이지). 메시지는 수신 즉시 삭제
XFTP 서버대용량 파일 청크 릴레이. 역시 Haskell. 기본 포트 443
배포 방법설치 스크립트 (install.sh), Docker, Linode Marketplace 원클릭
Private Message Routingv6.0+: 수신자가 고른 서버를 통해 메시지 라우팅 — 발신자 IP를 수신 서버에 노출하지 않음
Tor 지원SMP/XFTP 서버 .onion 주소 운영 가능. 클라이언트 SOCKS5 프록시 설정으로 Tor 우회
재현 가능한 빌드서버 바이너리 reproducible build 지원 (docs/REPRODUCE.md)

4아키텍처 심화 분석

단방향 큐 메커니즘, 프라이빗 메시지 라우팅, 이중 래칫 흐름.

단방향 큐 + 릴레이 메시징 구조

Alice SMP Relay (서버) Bob ───── ────────────────── ─── [1] 연결 요청 초기화 Alice가 큐 생성 요청 → 수신큐 (recvQ) 생성 recvQ 등록 (큐ID만, 소유자 모름) → 초대 링크 생성 ┌──────────────┐ simplex://… │ recvQ: ID_A1 │ │ (Alice 전용) │ [2] 링크 공유 (앱 외부 채널) └──────────────┘ ───────────────────────────────────────────────────▶ [3] Bob이 링크 수락 Bob이 sendQ 생성 ┌──────────────┐ (서버에 Alice의 recvQ ID_A1 등록) │ sendQ: ID_B1 │ ◀──────────────────── │ (Bob 전용) │ └──────────────┘ Bob도 자신의 recvQ 생성 ┌──────────────┐ │ recvQ: ID_B1 │ ◀──── Bob의 수신 큐 └──────────────┘ [4] 메시지 전송 (Alice → Bob) Alice가 메시지 암호화 → sendQ(ID_B1)에 PUT 메시지 도착 Bob이 recvQ(ID_B1) POLL ────────────────────────▶ ┌──────────────────┐ ──────────────────────────▶ │ [암호화 메시지] │ │ ID_B1에 임시 저장 │ └──────────────────┘ ※ 서버는 ID_B1과 Alice의 관계를 모름. ID_A1(Alice 수신)과 ID_B1의 연결도 모름. [5] 큐 레이어 분리 (핵심) ┌────────────────────────────────────────────────────────────────┐ │ A→B 채널: Alice의 sendQ ↔ SMP-서버1 ↔ Bob의 recvQ │ │ B→A 채널: Bob의 sendQ ↔ SMP-서버2 ↔ Alice의 recvQ │ │ │ │ 서버1과 서버2는 서로를 모른다. │ │ 각 서버는 자신이 처리하는 큐가 누구 것인지 모른다. │ └────────────────────────────────────────────────────────────────┘

Private Message Routing (v6.0, 2024)

Alice Alice의 프록시 서버 Bob의 SMP 서버 Bob ───── ──────────────────── ───────────────── ─── 메시지 전송 ────────────▶ 프록시 서버로 라우팅 요청 전달 (Bob IP 없이) ─────────────────────────▶ ─────────────────────▶ 수신 ※ Bob의 SMP 서버는 Alice의 IP를 모른다 (프록시만 봄) ※ Alice의 프록시 서버는 메시지 내용을 모른다 (E2E 암호화) ※ Alice의 IP가 Bob의 서버에 직접 노출되지 않음

이중 래칫 + 포스트-퀀텀 키교환 흐름

초기 연결 (초대 링크 스캔 시) ───────────────────────────── Alice ──[초대링크: Curve448 공개키 + Kyber-1024 공개키]──▶ Bob Bob ──[확인 메시지 헤더: 자신의 Curve448 공개키 + Kyber 캡슐화]──▶ Alice → 양측이 공유 비밀(shared secret) 도출 → 이중 래칫 초기화 메시지 교환 (매 래칫 단계) ────────────────────────── 메시지 N: ├─ Diffie-Hellman 래칫 (Curve448 에페머럴 키 회전) ├─ Kyber-1024 캡슐화 (포스트-퀀텀 KEM 교환) ← v5.6+ ├─ HKDF로 체인 키 파생 ├─ 메시지 키 파생 → AES-256-GCM 암호화 └─ 이전 메시지와 독립적인 새 키 (순방향 비밀성) 결과: ✓ 양자 컴퓨터도 미래에 '지금 캡처한 트래픽' 해독 불가 ✓ 키 하나 유출 = 그 메시지 하나만 노출 (나머지는 안전)
비유

"SimpleX 큐 = 매번 주소가 바뀌는 우편함"이라고 생각하자. 친구에게 편지를 보낼 때마다 새 우편함 번호를 알려주고, 이전 번호는 폐기한다. 우편배달부(SMP 서버)는 그 번호의 우편함이 누구 것인지 모른다. 편지 내용(E2E 암호)도 읽을 수 없고, 발신인과 수신인의 관계도 모른다. 심지어 두 방향(A→B, B→A)이 각각 다른 우체국(서버)을 쓰면, 그 우체국들도 서로 연결된 대화인지 모른다.

핵심 설계 패턴

패턴구현효과
식별자 없는 라우팅큐 ID = 랜덤 바이트, 큐마다 에페머럴 인증키서버가 통신 그래프 구축 불가
방어 심층(Defense in Depth)TLS + 큐 암호 + E2E 이중 래칫 + PQ-KEM + 패딩한 레이어 뚫려도 나머지가 보호
로컬 우선 저장SQLite + SQLCipher, 서버에는 임시 메시지만서버 압수수색 = 빈 창고
전송 격리프로파일별 / 연락처별 별도 TCP 연결·Tor 서킷트래픽 상관관계 분석 방해
STM 동시성 (Haskell)Software Transactional Memory로 상태 관리데드락 없는 동시 다중 큐 처리
ReaderT 아키텍처ChatController가 스레드 간 공유 환경 제공모나딕 에러 처리, 테스트 용이

5디렉토리 구조 해부

저장소 최상위 레이아웃과 각 폴더의 역할.

simplex-chat/ ├── simplex-chat.cabal ← Haskell 빌드 명세 (GHC 9.6.3, 의존성 선언) ├── cabal.project ← 멀티-패키지 빌드 설정 (simplexmq 의존) ├── Dockerfile ← scratch 기반 최소 이미지 (멀티스테이지 빌드) ├── install.sh ← 터미널 앱 원클릭 설치 스크립트 ├── flake.nix ← Nix 패키지 빌드 (재현 가능한 빌드) │ ├── src/Simplex/ │ ├── Chat.hs ← 채팅 메인 진입점 (defaultChatConfig 등) │ ├── Chat/ │ │ ├── Controller.hs ← 이벤트 루프·상태 타입 (ChatController, ChatConfig) │ │ ├── Store/ ← SQLite DB 레이어 (마이그레이션, 쿼리) │ │ ├── Protocol.hs ← 채팅 레벨 프로토콜 (메시지 포맷) │ │ ├── Messages/ ← 메시지 타입, 콘텐츠 이벤트 │ │ ├── Mobile/ ← FFI 진입점 (iOS·Android에서 호출) │ │ ├── Library/ ← 명령 처리·구독자·내부 로직 │ │ ├── Operators/ ← 프리셋 서버 설정 (공식 SMP 릴레이 목록) │ │ └── Terminal/ ← CLI TUI 렌더링 │ └── FileTransfer/ ← XFTP 파일 전송 클라이언트 │ ├── apps/ │ ├── simplex-chat/ ← CLI 터미널 앱 (Main.hs + Server.hs) │ ├── ios/ ← iOS Swift 앱 프로젝트 (Xcode) │ ├── multiplatform/ ← Android + Desktop (Kotlin/Compose Multiplatform) │ │ └── common/src/commonMain/kotlin/chat/simplex/common/ │ │ ├── model/ ← 앱 모델 (ChatModel, GroupInfo 등) │ │ ├── views/ ← Composable UI 컴포넌트 │ │ └── platform/ ← 플랫폼별 분기 (Android/Desktop) │ ├── simplex-bot/ ← 기본 봇 예제 (WebSocket API 사용) │ ├── simplex-bot-advanced/ ← 고급 봇 예제 │ ├── simplex-broadcast-bot/ ← 브로드캐스트 봇 │ └── simplex-directory-service/ ← 공개 그룹 디렉토리 서비스 │ ├── docs/ │ ├── SIMPLEX.md ← 설계 철학·경쟁자 비교 │ ├── SERVER.md ← SMP 서버 자체 호스팅 가이드 │ ├── SECURITY.md ← 보안 정책·취약점 신고 절차 │ ├── GLOSSARY.md ← 암호·통신 용어 사전 │ ├── guide/ ← 사용자 가이드 │ └── protocol/ ← 프로토콜 명세 (simplex-chat.md) │ ├── blog/ ← 마크다운 블로그 포스트 (릴리스 노트) ├── tests/ ← Haskell HUnit/QuickCheck 테스트 ├── scripts/ ← CI·빌드 보조 스크립트 └── eth/ ← 이더리움 기부 주소 관련 파일
구조 포인트

핵심 라이브러리(simplexmq)는 별도 저장소에 있다 — cabal.projecthttps://github.com/simplex-chat/simplexmq를 직접 의존한다. 이 레포(simplex-chat)는 그 위에 올라가는 채팅 앱 레이어다. SMP 서버 바이너리를 직접 빌드하려면 simplexmq 레포를 봐야 한다.

apps/multiplatform/의 Kotlin/Compose 코드는 Android와 Desktop(JVM)이 공유하고, iOS만 Swift로 분리되어 있다. Haskell 코어는 각 플랫폼에 네이티브 라이브러리(XCFramework, .so)로 컴파일되어 FFI로 호출된다.

6학습 포인트 (기술별)

이 레포에서 무엇을 배울 수 있는가 — Haskell·암호·프라이버시 프로토콜.

Haskell 실전 패턴 학습

배울 것어디서핵심 개념
ReaderT 모나드 스택Controller.hs, Chat.hs환경 공유·에러 전파 (ExceptT, ReaderT IO)
STM (Software Transactional Memory)Controller.hs, Library/TVar, TMVar로 데드락 없는 동시성
GADTs + DataKindsProtocol.hs, Messages/CIContent.hs타입 안전한 메시지 타입 계층
Template Haskell (JSON 파생)거의 모든 파일Aeson deriveJSON으로 자동 JSON 직렬화
FFI (Foreign Function Interface)Chat/Mobile.hsHaskell→C→Swift/Kotlin 브리지 패턴
SQLite 마이그레이션Chat/Store/버전별 스키마 마이그레이션·롤백 설계
대규모 Haskell 프로젝트 구조simplex-chat.cabalexposed-modules, flag 시스템, cabal.project

암호 · 보안 프로토콜 학습

배울 것어디서핵심 개념
Double Ratchet 구현 이해docs/GLOSSARY.md, simplexmq 레포KDF 체인, 에페머럴 키 회전, 순방향 비밀성
포스트-퀀텀 암호 (Kyber)blog/20240314-simplex-chat-v5-6-...mdKEM (Key Encapsulation Mechanism), NIST PQC
NaCl/libsodium 사용법Simplex.Messaging.Cryptocryptobox, keypair 생성, 서명·검증
메타데이터 위협 모델docs/SIMPLEX.md, SECURITY.md트래픽 분석, Sybil 공격, 재생 공격 방어
TLS pinning + 채널 바인딩docs/SECURITY.mdtlsunique, 서버 오프라인 인증서 검증
보안 감사 보고서 읽기docs/*.pdf (Trail of Bits 2022·2024)실제 감사 방법론·발견사항 분석

분산 시스템 · 네트워크 학습

배울 것어디서핵심 개념
SMP 프로토콜 설계docs/SIMPLEX.md, simplexmq/protocol/큐 기반 메시지 릴레이, 서버리스 라우팅
XFTP 파일 전송 프로토콜blog/20230301-...file-transfer-protocol.md청크 분산, 암호화 파일 배포
Tor 통합 패턴docs/SERVER.md (Tor 섹션)SOCKS5 프록시, .onion 서버 운영
Private Message Routingblog/20240604-...private-routing.md퍼 메시지 전송 익명성, 프록시 체인

실습 아이디어

PRACTICE IDEAS

SimpleX 기반 채팅 봇 만들기

apps/simplex-bot/ 예제를 보고 자신만의 봇을 만들어본다. CLI를 WebSocket JSON API 서버 모드로 실행하면(simplex-chat -p 5225) 다른 언어(Python, Node.js)에서도 봇을 만들 수 있다. 예: 특정 메시지에 자동 응답하는 에코봇, RSS 피드를 SimpleX 그룹에 전달하는 봇.

7시스템 요구사항 · 설치

클라이언트 설치 / 자체 SMP 서버 운영 방법.

클라이언트 요구사항

플랫폼최소 요구사항설치 방법
iOSiOS 16+App Store 또는 TestFlight (베타)
AndroidAndroid 8.0+ (API 26)Google Play / F-Droid / APK 직접 다운로드
Desktop (Windows)Windows 10 64-bitGitHub Releases에서 .exe 다운로드
Desktop (macOS)macOS 12+GitHub Releases에서 .dmg 다운로드
Desktop (Linux)Ubuntu 20.04+ / Debian 11+GitHub Releases에서 .AppImage 또는 .deb
CLI (터미널)Linux/macOS/Windows (x86_64, ARM64)curl -o- https://raw.githubusercontent.com/simplex-chat/simplex-chat/stable/install.sh | bash

CLI 빠른 시작

# 터미널 앱 설치 (Linux/macOS)
curl -o- https://raw.githubusercontent.com/simplex-chat/simplex-chat/stable/install.sh | bash

# 실행
simplex-chat

# WebSocket API 서버 모드 (봇 개발용)
simplex-chat -p 5225

자체 SMP 서버 운영 요구사항

항목권장 사양비고
서버VPS (1 vCPU, 512MB RAM)저사양으로도 충분. 메시지는 인메모리 임시 저장
OSUbuntu 22.04 LTSDebian 계열 권장
도메인필수 (smp.example.com)A·AAAA 레코드 설정. 클라이언트 링크 생성에 필요
방화벽포트 80, 443, 5223 개방80·443: TLS/HTTPS 정보 페이지, 5223: SMP 프로토콜
저장소2GB+로그·큐 레코드용 (메시지 본문은 즉시 삭제)

SMP 서버 설치 (3단계)

# 1. simplexmq 설치 스크립트 실행
curl -o- https://raw.githubusercontent.com/simplex-chat/simplexmq/stable/scripts/install.sh | bash

# 2. 방화벽 설정
ufw allow 80/tcp && ufw allow 443/tcp && ufw allow 5223/tcp

# 3. 서버 초기화 (도메인을 실제 도메인으로 교체)
su smp -c 'smp-server init --yes \
    --store-log \
    --no-password \
    --control-port \
    --socks-proxy \
    --fqdn=smp.example.com'

# 서비스 시작
systemctl enable smp-server && systemctl start smp-server

# 서버 주소 확인 (앱에 입력할 주소)
smp-server -v
서버 운영 포인트

자체 SMP 서버를 운영해도 다른 SMP 서버(공식 또는 타인 운영) 사용자와 통신할 수 있다. 이메일처럼 서버가 달라도 메시지가 전달된다. 단 서버끼리 직접 통신하지 않는다는 점이 이메일과 다르다 — 클라이언트가 상대방 큐가 있는 서버에 직접 접속해서 메시지를 넣는다.

8직접 해볼 수 있는 실습 과제

난이도별 3~5개 — LV.1(입문)부터 LV.5(고급)까지.

LV.1 — 입문

SimpleX 앱 설치 후 자체 연결 테스트 LV.1

모바일 앱 또는 CLI를 설치하고, 친구나 자기 자신의 두 번째 기기와 QR코드로 연결해본다. 연결 과정에서 "링크 공유 → 수락 → 메시지 교환"이 어떻게 동작하는지 체감한다.

확인 포인트: 연결 정보 화면의 "보안 코드 확인" 기능을 써보고, 이 코드가 왜 MITM 방지에 중요한지 GLOSSARY.md를 읽어 이해한다.

앱 → 새 연결 → QR코드 표시 → 상대방 스캔 → 연결됨 확인 → 보안 코드 비교
LV.2 — 초급

CLI 터미널 앱으로 메시지 주고받기 LV.2

Linux/macOS 서버에 simplex-chat CLI를 설치하고 모바일 앱과 연결해 메시지를 주고받는다. CLI 명령어(/connect, /send, /chats)를 익힌다.

심화: CLI를 simplex-chat -p 5225로 WebSocket 모드로 실행하고, Python의 websockets 라이브러리로 JSON API에 접속해 메시지를 프로그래밍 방식으로 보내본다.

cat docs/CLI.md 읽기 → simplex-chat 실행 → /connect 명령으로 연결 → /send @contact "hello"
LV.3 — 중급

나만의 SMP 릴레이 서버 운영하기 LV.3

VPS(월 $5~10 수준)에 smp-server를 설치하고, 도메인을 연결한 후 앱에서 해당 서버를 추가해 메시지가 자체 서버를 통해 전달되는지 확인한다. 서버 정보 페이지(HTTPS)가 작동하는지, 일별 통계가 기록되는지 점검한다.

심화: Tor onion 주소도 함께 설정하고, 앱의 SOCKS5 프록시를 127.0.0.1:9050으로 설정해 Tor 경유 연결도 테스트한다.

docs/SERVER.md 따라하기 → smp-server init → systemctl enable → 앱에서 서버 추가
LV.4 — 고급

Haskell 봇 예제 분석 및 수정 LV.4

apps/simplex-bot-advanced/ 코드를 읽고, 봇이 WebSocket JSON API를 어떻게 사용하는지 분석한다. 봇에 기능을 추가해본다 — 예: 특정 키워드 수신 시 외부 API(날씨, 환율)를 조회해서 응답, 또는 파일 수신 시 자동 저장.

Haskell 학습 포인트: Controller.hsChatController 타입과 ReaderT 스택을 읽고, 대규모 Haskell 앱의 상태 관리 방식을 이해한다.

cabal build apps/simplex-bot-advanced → 코드 수정 → cabal run → 모바일 앱으로 테스트
LV.5 — 최고급

SMP 프로토콜 직접 구현해보기 (학습용) LV.5

simplexmq/protocol/simplex-messaging.md(별도 레포)의 프로토콜 명세를 읽고, Python으로 SMP 서버에 직접 TCP 연결을 맺어 큐 생성(NEW)→메시지 전송(SEND)→수신(SUB/GET) 명령을 날려본다. TLS 위에서 SMP 바이너리 프레임을 직접 파싱하는 과정에서 프로토콜 설계의 디테일을 체득한다.

목표: "사용자 식별자 없이 큐 ID만으로 메시지를 전달한다"는 것이 코드 레벨에서 어떻게 구현되는지 직접 확인한다.

simplexmq/protocol/ 명세 읽기 → Python ssl.SSLSocket으로 smp.simplex.im:5223 연결 → 바이너리 프레임 파싱 구현

9관련 기술 심화 학습 로드맵

SimpleX 코드베이스를 이해하기 위한 주차별 학습 경로.

주차주제학습 자료 / 실습
1주차Haskell 기초Learn You a Haskell for Great Good (무료 온라인). 타입·모나드·IO 액션 이해. 목표: Maybe, IO, do 표기법 익숙하게 사용
2주차Haskell 동시성Parallel and Concurrent Programming in Haskell (Simon Marlow). STM 챕터 중점. TVar·TMVar·STM 트랜잭션 실습
3주차ReaderT 패턴 · 모나드 변환자mtl 라이브러리 문서 + simplex-chat Controller.hs 읽기. ExceptT, ReaderT IO 스택 직접 구현해보기
4주차암호 기초 (대칭·비대칭)Cryptography I (Coursera, Dan Boneh). AES-GCM, Curve25519, 디피-헬만 키교환 원리 이해
5주차이중 래칫 알고리즘Signal Double Ratchet 공식 명세 (signal.org/docs/specifications/doubleratchet). SimpleX GLOSSARY.md의 관련 항목과 연결
6주차포스트-퀀텀 암호NIST PQC 표준화 문서 (Kyber/ML-KEM). simplex-chat 블로그 포스트 20240314-v5-6-quantum-resistance.md 읽기
7주차네트워크 프로토콜 설계simplexmq/protocol/simplex-messaging.md 전체 읽기. SMP 큐 생명주기(생성·구독·메시지·삭제) 플로우차트 직접 그려보기
8주차Compose MultiplatformJetBrains Compose Multiplatform 공식 튜토리얼. apps/multiplatform/의 ChatModel.kt, views/ 코드 읽기
9주차SQLite + 암호화 DBSQLCipher 공식 문서. simplex-chat/Store/ 마이그레이션 패턴 분석. 버전별 스키마 변화 추적
10주차보안 감사 보고서 읽기docs/SimpleX_Design_Review_2024_Summary_Report.pdf (Trail of Bits). 발견된 취약점·완화 방법·미해결 사항 정리
11주차Tor + 프라이버시 네트워킹Tor 공식 문서. SMP 서버 .onion 주소 설정 실습. Tor vs VPN vs SimpleX Private Routing 비교 분석
12주차종합 프로젝트SimpleX 기반 자신만의 서비스 구현 (알림봇, 파일 공유 서버, 비밀 메모 앱 등). 전체 스택(Haskell 서버 + Kotlin UI) 수정 경험

10핵심 키워드 사전

이 레포를 읽다가 막히는 용어 모음.

용어한국어 설명
SMP (SimpleX Messaging Protocol)SimpleX가 설계한 서버-클라이언트 메시지 릴레이 프로토콜. 큐 기반, 사용자 식별자 없음. 포트 5223
XFTP (SimpleX File Transfer Protocol)대용량 파일을 암호화·청크 분산하여 릴레이하는 프로토콜. 최대 1GB 지원
Unidirectional Queue (단방향 큐)한 방향으로만 메시지를 전달하는 큐. A→B 채널과 B→A 채널이 별도 큐·별도 서버
Double RatchetSignal이 설계한 E2E 암호 알고리즘. 매 메시지마다 키를 회전시켜 순방향 비밀성·사후 침해 복구 제공
Forward Secrecy (순방향 비밀성)장기 키가 유출되어도 과거 메시지는 해독 불가. 세션키를 주기적으로 교체
Post-Compromise Security키가 한 번 유출되어도 이후 메시지는 안전. 다음 래칫 단계에서 새 키로 회복
Kyber / ML-KEMNIST가 표준화한 포스트-퀀텀 KEM. 격자 암호 기반. SimpleX는 Kyber-1024 사용
KEM (Key Encapsulation Mechanism)공개키로 대칭키를 '캡슐화'해서 전달하는 방식. 포스트-퀀텀 키교환의 기본 메커니즘
NaCl / libsodium고성능 암호 라이브러리 (Daniel Bernstein 설계). SimpleX가 큐 레이어 암호에 사용
SQLCipherSQLite의 암호화 확장. 전체 DB 파일을 AES-256으로 암호화. SimpleX 로컬 DB에 사용
STM (Software Transactional Memory)Haskell의 동시성 메커니즘. 트랜잭션으로 공유 상태를 관리, 데드락 없음
ReaderT 패턴Haskell에서 환경(설정·공유 상태)을 함수에 명시적으로 전달하지 않고 모나드 스택으로 전달하는 패턴
FFI (Foreign Function Interface)Haskell 코드를 C ABI로 내보내서 Swift/Kotlin에서 호출하는 인터페이스. Mobile.hs가 진입점
Compose MultiplatformJetBrains의 Kotlin UI 프레임워크. 하나의 Kotlin 코드로 Android·Desktop·iOS UI를 생성
tlsuniqueTLS 세션 고유 채널 바인딩값. SimpleX가 재생 공격 방지를 위해 서버 명령 서명에 사용
Private Message Routingv6.0+ 기능. 발신자 IP를 수신 SMP 서버에 노출하지 않기 위한 프록시 경유 라우팅
Trail of Bits미국의 저명한 보안 감사 회사. SimpleX를 2022년(구현 감사)·2024년(프로토콜 설계 감사) 두 차례 검토
AGPL-3.0GNU Affero General Public License. 서버에서 실행해도 소스 공개 의무 발생. 상업적 사용 시 별도 계약 필요
Sybil 공격P2P 네트워크에서 다수의 가짜 노드를 만들어 네트워크를 장악하는 공격. SimpleX는 서버가 서로를 모르므로 해당 없음
Transport Isolation프로파일별·연락처별로 별도 TCP 연결과 Tor 서킷을 사용해 트래픽 상관관계 분석을 어렵게 하는 기능

11참고 링크

공식 문서·감사 보고서·관련 자료.

분류링크설명
메인 레포github.com/simplex-chat/simplex-chat채팅 앱 소스 (Haskell + Swift + Kotlin)
프로토콜 레포github.com/simplex-chat/simplexmqSMP/XFTP 서버·프로토콜 라이브러리
공식 사이트simplex.chat앱 다운로드·블로그·공식 문서
설계 철학docs/SIMPLEX.md경쟁자 비교·프라이버시 모델 설명
용어 사전docs/GLOSSARY.md암호·통신 용어 상세 해설
SMP 서버 운영docs/SERVER.md자체 서버 설치·Tor 설정 가이드
Trail of Bits 감사 2022블로그: v4.2 보안 감사구현 보안 감사 결과 (2022년 11월)
Trail of Bits 감사 2024블로그: v6.1 프로토콜 설계 감사암호 프로토콜 설계 검토 (2024년 7월)
포스트-퀀텀 상세블로그: v5.6 양자 저항성Kyber 통합 배경·기술 설명
투자 유치 발표블로그: v6.0 비전·투자Jack Dorsey·Asymmetric 투자·Private Routing 소개
CLI 문서docs/CLI.md터미널 앱 명령어 레퍼런스
Signal Double Ratchetsignal.org/docs/specifications/doubleratchetSimpleX가 채택한 E2E 암호 알고리즘 공식 명세
NIST PQC ML-KEMcsrc.nist.gov — FIPS 203 (ML-KEM)Kyber의 NIST 표준화 문서