Matrix는 2014년 공개된 이후 프랑스 정부와 독일군이 공식 내부 메신저 인프라로 채택할 만큼 검증된 오픈 표준 프로토콜로, 이메일처럼 서로 다른 서버끼리도 메시지를 주고받을 수 있는 연합(federation) 구조가 핵심입니다. 카카오톡이나 디스코드처럼 하나의 회사가 모든 서버와 데이터를 독점하는 구조와 달리, 누구나 자기 서버를 세우고 그 위에서 독립적인 메신저 생태계를 운영할 수 있다는 점이 Matrix를 특별하게 만들어요. 그렇다면 Matrix/Element로 셀프호스팅 메신저를 어떻게 운영할 수 있을까요?
Matrix 프로토콜의 구조
Matrix는 메시지 전송 방식을 정의한 개방형 프로토콜이고, 실제로 이 프로토콜을 구현한 서버 소프트웨어가 필요한데 그중 가장 대표적인 구현체가 Synapse예요. 서버(홈서버)는 사용자 계정과 방 목록을 관리하고, 사용자는 Element 같은 클라이언트 앱으로 접속해서 대화를 주고받아요. 여기서 중요한 건 프로토콜과 클라이언트가 분리되어 있다는 점인데, 덕분에 같은 Matrix 계정으로 데스크톱은 Element, 모바일은 다른 서드파티 앱을 섞어 써도 대화 기록이 자연스럽게 동기화돼요.
연합 구조가 주는 실질적인 이점
이메일 계정이 gmail.com이든 회사 도메인이든 서로 메일을 주고받을 수 있는 것처럼, Matrix 계정도 내 서버(예: matrix.example.com)에서 만들었더라도 다른 사람이 운영하는 Matrix 서버 사용자와 방을 만들어 대화할 수 있어요. 이게 왜 중요하냐면, 완전히 폐쇄된 사설 메신저를 만드는 게 아니라 필요할 때는 외부와도 연결되는 유연한 메신저를 스스로 운영할 수 있다는 뜻이기 때문이에요. 물론 연합 기능을 끄고 완전히 내부용으로만 운영하는 것도 설정 하나로 가능해서, 가족이나 팀 내부용 메신저로 좁혀 쓰는 것도 자유롭게 선택할 수 있어요.
Synapse 홈서버 Docker Compose 구성
Synapse는 PostgreSQL을 데이터베이스로 사용하는 구조라 Docker Compose로 함께 묶어 띄우는 게 일반적이에요. 아래는 최소 구성 예시예요.
services:
synapse:
image: matrixdotorg/synapse:latest
restart: unless-stopped
environment:
- SYNAPSE_SERVER_NAME=matrix.example.com
- SYNAPSE_REPORT_STATS=no
volumes:
- synapse_data:/data
ports:
- "8008:8008"
depends_on:
- db
db:
image: postgres:15
restart: unless-stopped
environment:
- POSTGRES_DB=synapse
- POSTGRES_USER=synapse
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_INITDB_ARGS=--encoding=UTF-8 --locale=C
volumes:
- synapse_db:/var/lib/postgresql/data
volumes:
synapse_data:
synapse_db:
초기 구동 시 homeserver.yaml 설정 파일이 자동 생성되는데, 이후에는 이 파일에서 연합 허용 여부, 회원가입 개방 여부, 미디어 저장 경로 같은 세부 옵션을 직접 조정할 수 있어요. PostgreSQL의 로케일을 C로 지정하는 부분을 놓치기 쉬운데, 이후에 바꾸려면 데이터베이스를 새로 만들어야 하니 처음 설정할 때 챙겨두는 게 좋아요.
종단 간 암호화와 브리지
Element에서 만드는 1:1 대화와 비공개 방은 기본적으로 종단 간 암호화가 적용되어서, 서버를 운영하는 사람조차 대화 내용을 열어볼 수 없는 구조예요. 여기에 더해 Matrix 생태계에는 브리지라는 개념이 있는데, 슬랙이나 디스코드, 텔레그램 같은 외부 메신저의 대화를 Matrix 방으로 연동해서 여러 메신저를 오가지 않고 Element 한 곳에서 확인할 수 있게 해줘요. 팀에서 여러 메신저를 병행해서 쓰고 있다면, 브리지를 통해 알림을 한곳으로 모으는 용도로도 유용해요.
Signal·디스코드와 비교했을 때의 위치
Signal은 보안성과 단순함에 집중한 폐쇄형 서비스라 서버를 직접 운영할 수 없고, 디스코드는 커뮤니티 기능은 풍부하지만 결국 하나의 회사가 모든 데이터를 관리해요. Matrix/Element는 이 둘의 중간 지점에 있다고 볼 수 있는데, Signal 수준의 암호화를 지원하면서도 서버를 직접 소유하고 필요하면 다른 서버와도 연합할 수 있는 유연함을 갖췄어요. 다만 그만큼 서버 운영 부담은 Signal이나 디스코드를 그냥 쓰는 것보다 훨씬 크다는 점은 감안해야 해요.
결론
Matrix/Element는 대화 데이터를 스스로 소유하면서도 필요하면 외부 서버와 연결될 수 있는 유연함을 갖춘, 몇 안 되는 오픈 프로토콜 메신저예요. Synapse와 PostgreSQL을 함께 구동하는 초기 설정만 넘기면, 가족이나 팀 규모에서 카카오톡이나 디스코드를 대체할 만큼 안정적인 사설 메신저로 자리 잡을 수 있어요. 화상회의까지 자체 인프라로 채우고 싶다면 Jitsi Meet 셀프호스팅을 함께 구성하는 것도 좋은 조합이에요.
자주 묻는 질문
Q1. Matrix와 Element는 같은 건가요?
아니요, Matrix는 메시지가 오가는 방식을 정의한 개방형 프로토콜이고 Element는 그 프로토콜 위에서 동작하는 여러 클라이언트 앱 중 가장 널리 쓰이는 앱이에요.
Q2. 다른 서버 사용자와도 대화할 수 있나요?
네, Matrix는 이메일처럼 연합(federation) 구조를 갖고 있어서 내 홈서버 계정으로 다른 사람이 운영하는 Matrix 서버의 사용자와도 대화방을 만들 수 있어요.
Q3. 종단 간 암호화는 기본으로 켜져 있나요?
네, 최신 버전의 Element에서 만드는 1:1 대화와 비공개 방은 기본적으로 종단 간 암호화가 적용되어서 서버 운영자도 대화 내용을 들여다볼 수 없어요.
Q4. 슬랙이나 디스코드 메시지도 Matrix로 가져올 수 있나요?
네, 브리지(bridge)라는 별도 컴포넌트를 설치하면 슬랙, 디스코드, 텔레그램 같은 외부 메신저의 메시지를 Matrix 방으로 연동해서 한 화면에서 확인할 수 있어요.
Q5. 서버 운영 부담이 큰 편인가요?
네, 대표 구현체인 Synapse는 PostgreSQL과 여러 워커 프로세스를 함께 관리해야 해서 Signal 같은 단일 앱보다는 초기 설정과 유지보수 부담이 있는 편이에요.
Q6. 가족이나 소규모 팀 메신저로도 적합한가요?
네, 몇 명에서 몇십 명 규모라면 Synapse 하나로도 충분히 안정적으로 운영할 수 있고, 방 단위로 공개/비공개를 나눠 가족방과 업무방을 분리해서 쓰기에도 좋아요.
관련 글


