종단 간 암호화(E2EE) 메신저 앱

인터넷이 끊겨도 대화가 이어지는 종단간 암호화 하이브리드 메신저

2026-04-01 (수) 21:25:57 조회 177
문의하기
종단 간 암호화(E2EE) 메신저 앱
JavaScript Gemini Node.js Java SQLite Cloudflare PHP HTML5 CSS3 Web API Modern Frontend Framework

프로젝트 소개

안녕하세요! 최근에 개인 프로젝트로 개발 중인 하이브리드 메신저 앱의 프로토타입을 완성하여 여러분께 소개하고 피드백을 구하고자 쇼케이스에 올립니다.

Aura는 웹 기반(JS/Node.js)의 프론트엔드/백엔드에 안드로이드 WebView 브릿지를 결합한 하이브리드 메신저입니다. 단순한 채팅을 넘어, 서버 관리자가 대화 내용을 알 수 없도록 종단간 암호화를 적용했고, 상대방이 오프라인일 때 통신사 문자로 자동 우회하는 기능(Fallback)을 구현하는 데 집중했습니다.

주요 기능 및 구현 포인트

1. iMessage 방식의 오프라인 SMS 자동 전환(Fallback) 가장 공을 들인 부분입니다. 상대방이 Aura 앱 회원이 아니거나 현재 오프라인 상태일 경우, 서버 소켓 전송에만 의존하지 않습니다. 안드로이드의 SmsManager를 WebView Javascript Interface로 연결하여, 내 스마트폰의 요금제를 통해 실제 통신사 SMS 문자로 대화 내용이 자동 우회 전송됩니다. 앱 내에서는 일반 채팅방처럼 자연스럽게 UI가 이어지도록 처리했습니다.

2. 하이브리드 기반 연락처 동기화 Native 단에서 안드로이드 READ_CONTACTS 권한을 통해 주소록(이름, 휴대전화 번호)을 읽어오고, 이를 JSON으로 파싱하여 웹 프론트엔드로 전달합니다. 웹에서는 이 데이터를 서버 DB와 대조하여 가입자/미가입자를 분리해 렌더링하고, 미가입자에게 SMS 초대 및 문자 채팅을 즉시 시작할 수 있게 연동했습니다.

3. 종단간 암호화(E2EE)와 Race Condition 해결 개인정보 보호를 위해 RSA와 AES를 혼합한 E2EE를 적용했습니다.

  • 이슈: 두 유저가 동시에 방에 입장할 때, 서로 "열쇠가 없네"하고 서버에 새로운 키를 중복으로 덮어씌워버려 암호 해독에 실패하는 Race Condition 문제가 빈번했습니다.
  • 해결: 네트워크 지연 시 섣불리 새 키를 만들지 않고 대기(Delay)를 주거나, 서버에서 404 Not Found가 확실히 떨어졌을 때만 키를 생성하도록 예외 처리를 강화했습니다. 또한 키가 없거나 에러가 났을 때는 튕겨내지 않고 '임시 평문(PLAIN) 모드'로 우회하여 대화의 흐름이 끊기지 않도록 방어 로직을 구축했습니다.

주요 기술 스택

  • Frontend: Vanilla JS, HTML/CSS (Crypto JS, JSEncrypt)
  • Backend: Node.js, Sockket.io, SQLite
  • Native: Android (Java), WebView, AndroidBridge, Firebase Cloud Messaging (FCM)

사용 방법

https://aura.swnest.net 에 접속하여 바로 서비스를 이용할 수 있습니다. 별도의 설치나 복잡한 설정 없이 웹 브라우저를 통해 즉시 접근 가능합니다.

개발하며 느낀 점

단순히 소켓으로 텍스트를 주고받는 것을 넘어, Native API(SMS, 주소록)와 Web을 유기적으로 연결하는 과정에서 발생하는 비동기 타이밍 이슈들이 가장 까다로웠습니다. 특히 캐시 문제와 소켓 중복 연결, E2EE 키 동기화 타이밍을 맞추는 과정에서 프론트와 백엔드의 상태 관리가 얼마나 중요한지 뼈저리게 배웠습니다.


아직 부족한 점이 많은 프로토타입 단계입니다. 기술적 조언이나 아키텍처 개선 방향 하이브리드 앱 최적화에 대한 어떤 피드백이든 감사하게 받겠습니다! 긴 글 읽어주셔서 감사합니다.

댓글 (1)

로그인 후 댓글을 남길 수 있습니다.
Glitter Gim

흥미롭습니다. SMS로 자연스럽게 우회되는 구조가 인상적이네요. 다만 폴백이 발생할 때, 사용자가 지금 보내는 메시지가 E2EE인지 SMS인지 구분할 수 있게 설계되어 있는지 궁금합니다.