결론부터
- 1MTProto 는 앱과 서버의 통신 규약 — 위층 API·암호화·전송 세 층.
- 2키 교환·암호화·순서·재전송·시간 맞추기는 라이브러리 몫.
- 3개발자 몫은 세션 파일과 api_id 를 지키는 것.
MTProto 는 무엇인가
MTProto 는 텔레그램 앱과 텔레그램 서버가 주고받는 통신 규약입니다. 공식 앱도, TDLib 도, 봇 API 를 처리하는 텔레그램 쪽 서버도 이 규약으로 이야기합니다. 지금 쓰는 판은 MTProto 2.0 입니다.
사용자 입장에서 '텔레그램 암호화는 안전한가'가 궁금하다면 텔레그램 암호화(MTProto) — 무엇을 막고 무엇은 못 막나를 먼저 읽습니다. 이 글은 개발자가 무엇을 직접 하고 무엇을 맡기는지를 봅니다.
세 층으로 나눠 보기
| 층 | 하는 일 |
|---|---|
| 위층 — API 호출 | '메시지 보내기' 같은 요청과 응답을 정해진 이진 형식으로 바꾼다. 개발자가 실제로 다루는 메서드가 여기 있다 |
| 가운데 — 인증과 암호화 | 기기마다 만든 인증 키로 메시지를 암호화하고, 위조·순서 바꿔치기를 막는다 |
| 아래 — 전송 | 암호화된 덩어리를 실어 나른다. TCP, 웹소켓(HTTPS 위 포함), HTTP·HTTPS 를 쓸 수 있다 |
라이브러리가 대신 해 주는 것
MTProto 를 직접 구현하면 아래를 전부 스스로 만들어야 합니다. TDLib 같은 라이브러리를 쓰면 이 부분은 신경 쓰지 않아도 됩니다.
- 인증 키 만들기 — 앱을 처음 켤 때 서버와 키 교환(디피-헬먼, 2048비트)으로 기기 전용 키를 만들고, 이후로는 거의 바꾸지 않습니다(인증 키 만들기).
- 메시지 암호화와 검증 — 메시지 내용에서 계산한 값과 인증 키로 그 메시지만의 암호 키를 만들어 감싸고, 받은 쪽은 같은 계산으로 위조 여부를 확인합니다.
- 세션과 순서 — 연결이 끊겨도 이어지는 세션, 시각에 묶인 메시지 번호, 세션 안의 순번으로 중복과 순서 뒤바뀜을 걸러 냅니다.
- 받았다는 확인과 다시 보내기 — 상대가 받았다고 알려 오지 않은 메시지는 다시 보냅니다.
- 시간 맞추기 — 기기 시계가 많이 틀리면 메시지 번호가 거부되므로, 서버가 보내는 보정 값으로 맞춥니다.
클라우드 대화와 비밀 대화
| 대화 | 암호화 구간 | 뜻 |
|---|---|---|
| 일반(클라우드) 대화 | 내 기기 ↔ 텔레그램 서버 | 서버에 저장돼 여러 기기에서 이어 볼 수 있다 |
| 비밀 대화 | 내 기기 ↔ 상대 기기(종단간) | 서버도 내용을 풀 수 없다. 만든 기기에서만 보인다 |
비밀 대화는 MTProto 위에 종단간 암호화를 한 겹 더 얹은 구조입니다. 키가 어디 있는지는 비밀 대화 암호화 구조, 사용법은 비밀 대화에 있습니다.
직접 구현하려는 경우
공식 문서는 직접 구현보다 TDLib 같은 기존 구현을 쓰라고 권하고, 직접 만든다면 클라이언트 보안 지침을 반드시 지키라고 합니다. 키 교환 중 받은 값의 검사를 하나만 빠뜨려도 암호화 전체가 무너질 수 있기 때문입니다.
| 다음 글 | 무엇 |
|---|---|
| API 4가지 고르기 | TDLib 과 봇 API 중 무엇이 맞는지 |
| 클라이언트 보안 지침 | 직접 구현할 때 반드시 검사할 것 |
| TL 스키마·레이어 읽는 법 | API 메서드 목록을 읽는 법 |
자주 묻는 질문
MTProto 는 무엇인가요?
텔레그램 앱과 서버가 주고받는 통신 규약입니다. 요청을 이진 형식으로 바꾸는 층, 암호화 층, 전송 층으로 나뉩니다.
MTProto 를 직접 구현해야 하나요?
대부분은 아닙니다. 공식 문서는 TDLib 같은 기존 구현을 쓰라고 권하고, 직접 만든다면 클라이언트 보안 지침을 지키라고 합니다.
일반 대화와 비밀 대화의 암호화는 무엇이 다른가요?
일반 대화는 기기와 서버 사이를 암호화하고, 비밀 대화는 두 기기 사이를 종단간 암호화해 서버도 내용을 풀 수 없습니다.
세션 파일이 새면 어떻게 되나요?
세션 파일은 로그인된 계정 그 자체라 비밀번호 없이 그 계정으로 접속될 수 있습니다. 비밀번호처럼 지킵니다.
참고한 공식 문서
한눈에 정리
- 1세 층
API · 암호화 · 전송.
- 2라이브러리 몫
키 교환 · 순서 · 재전송.
- 3내 몫
세션 파일 · api_id 보관.
최종 수정 2026-10-06