로그인회원가입

MQTT와 AES-256으로 만드는 나만의 보안 웹 채팅 프로그램: Talk

**보안형 MQTT 채팅 프로그램(Talk)**의 주요 기능과 구현 시 고려했던 핵심 보안 사항들입니다.

스크린샷, 클릭시 새 탭에서 실행

아래에서 직접 실행해 보기


🛠️ 주요 기능 요약

구분기능 명칭상세 내용
접속 제어Web-based Loginprompt 대신 웹 UI를 통해 암호 키를 입력받아 보안성과 사용자 편의성 동시 확보
통신 보안End-to-End EncryptionCryptoJS를 이용해 메시지를 AES-256 방식으로 암호화하여 전송
경로 은닉Dynamic Topic Hashing암호 키를 SHA-256으로 해싱하여 고유한 토픽(data_...) 생성
익명성Auto Nickname형용사와 명사 조합에 랜덤 ID를 붙여 사용자 익명성 보장 (예: 다정한 피자)
안정성Auto Reconnect연결이 끊겼을 때 3초 후 자동으로 재연결을 시도하는 로직 포함
리소스Local Library외부 CDN 의존도를 낮추기 위해 JS 파일을 서버 로컬 경로로 설정

🔐 구현 시 고려했던 핵심 보안 사항

1. 데이터 평문 노출 차단 (AES-256 암호화)

공용 MQTT 브로커(EMQX)를 사용하면 누군가 토픽을 구독하여 대화 내용을 가로챌 수 있다는 점이 가장 큰 위협이었습니다.

  • 해결: 메시지가 브라우저를 떠나기 전 암호화하고, 받는 쪽에서만 복호화하게 하여 브로커 관리자조차 내용을 알 수 없게 설계했습니다.
  • 데이터 타입 변경: 메시지 유형을 chat이 아닌 일반적인 string으로 정의하여 MQTT Explorer 상에서도 일반 데이터 스트림처럼 보이게 위장했습니다.

2. 대화방 경로의 기밀성 (SHA-256 토픽 생성)

고정된 토픽 주소를 사용하면 누군가 지속적으로 모니터링할 위험이 있었습니다.

  • 해결: 사용자가 입력한 비밀번호를 그대로 토픽으로 쓰지 않고, **해시값(Hash)**으로 변환하여 사용했습니다.
  • 효과: 비밀번호를 모르는 사람은 우리가 어느 방(Topic)에서 대화하는지 경로조차 유추할 수 없습니다.

3. 클라이언트 사이드 보안 (Memory-only Key)

비밀번호를 소스 코드에 저장하거나 하드코딩하면 보안이 무의미해집니다.

  • 해결: SECRET_KEY를 브라우저의 변수(메모리)에만 저장하고 페이지를 새로고침하거나 닫으면 즉시 삭제되도록 구현했습니다.
  • 로컬 라이브러리: 스크립트 파일을 본인 서버(micro2iot.com)에서 불러오게 하여, 외부 서버 해킹을 통한 스크립트 변조(XSS 공격) 가능성을 차단했습니다.

4. 사후 흔적 제거 (Will Message & No History)

  • 유언 메시지(Last Will): 사용자가 비정상적으로 종료되었을 때 브로커가 자동으로 퇴장 메시지를 보내도록 설정하여 세션 관리를 깔끔하게 했습니다.
  • 기록 비저장: 별도의 데이터베이스를 두지 않아, 브라우저를 닫는 순간 모든 대화 기록이 휘발되어 물리적인 증거가 남지 않습니다.

HTML chat.html

코멘트

답글 남기기