


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

아래에서 직접 실행해 보기
🛠️ 주요 기능 요약
| 구분 | 기능 명칭 | 상세 내용 |
| 접속 제어 | Web-based Login | prompt 대신 웹 UI를 통해 암호 키를 입력받아 보안성과 사용자 편의성 동시 확보 |
| 통신 보안 | End-to-End Encryption | CryptoJS를 이용해 메시지를 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


답글 남기기
댓글을 달기 위해서는 로그인해야합니다.