어떠한 중간 단계도 신뢰하지 않습니다. 그래서 모든 중간 단계를 제거했습니다.
HTML 파일 하나가 Bytz의 전부입니다. 그 파일을 상대와 공유하고 초대 키 한 줄만 전달하면 대화가 시작됩니다. 앱 스토어를 거치지 않아도 되고, 전화번호를 넘길 일도 없습니다. 지금 이 페이지를 띄운 브라우저 안에서 모든 게 돌아갑니다.
| 항목 | Telegram | Signal | Bytz |
|---|---|---|---|
| 가입에 전화번호 필요 | 필수 | 필수 | 없음 |
| 앱 설치 / 스토어 의존 | 필요 | 필요 | HTML 파일 1개 |
| 기본 1:1 대화 E2E | Secret Chat에서만 | ✅ | ✅ |
| 받은 클라이언트 직접 확인 | 불가 | 불가 | 가능 (파일 해시) |
| 메시지 ratchet 단위 | 재키잉 (100 msg / 1주) | 메시지 단위 (Double Ratchet) | 메시지 단위 (Double Ratchet) |
| 대화 전체 초기화 | 가능 | 제한적 | 양쪽 기록 + 미전달 메시지 정리 |
설치도 가입도 따로 없고, 흐름은 단순합니다.
단일 HTML 파일 하나를 다운로드합니다. 무엇이 들어 있는지 직접 확인하고 싶다면 텍스트 편집기로 열어 코드를 그대로 읽어볼 수도 있습니다.
브라우저에서 그 파일을 열고, 직접 정한 인증키로 방을 만듭니다. 인증키는 이 기기 바깥으로 나가지 않습니다. 잃어버리면 같은 방으로 돌아올 길이 없으니, 처음부터 안전한 곳에 따로 보관해 두세요.
방 안의 설정에서 초대 키를 만들어 상대에게 보냅니다. 상대는 그 키와 자기만의 인증키로 입장하고, 이 시점부터 양쪽 세션이 자동으로 맞춰집니다. 인증키는 각자의 것이라, 상대 쪽으로 넘어가지 않습니다.
Telegram과 Signal은 가입 단계에서 전화번호를 요구합니다. 번호가 계정을 만들고, 계정이 대화를 묶고, 대화는 다시 번호로 돌아옵니다. 이 연결은 한 번 생기면 서비스 밖에서도 쉽게 풀리지 않습니다. Bytz에는 이 시작점이 없습니다. 방 키와 세션 키로만 연결하기 때문에, 받은 적 없는 정보가 어디선가 새어나갈 일도 없습니다.
Telegram에서 종단 간 암호화된 대화를 하려면 Secret Chat 모드를 따로 열어야 합니다. 깜빡하고 일반 채팅으로 메시지를 보내면 서버에 평문이 남고요. Bytz는 그 선택을 없앴습니다. Secret Chat 같은 별도 모드가 있는 게 아니라, 그 모드만 있다고 보시면 됩니다.
Bytz 서버가 하는 일은 양쪽 브라우저 사이에서 암호화된 프레임을 중계하는 것뿐입니다. 메시지 내용도, 복호화에 필요한 키도 서버에는 저장되지 않습니다. 서버가 실제로 보는 것은 참가자를 식별하기 위한 해시 값과 프레임의 길이 버킷 정도입니다. 대화의 본문이나 파일의 내용은 그 시야 바깥에 있습니다. 상대가 잠시 오프라인이라 메시지가 큐에 머물 때도 암호문 상태 그대로 보관되다가 전달되는 순간 삭제됩니다. 설령 서버가 털리거나 압수되더라도, 안에서 나오는 건 남이 풀 수 없는 암호문뿐입니다.
방을 연 쪽이 만든 초대 키는 참여자의 기기 안에서만 본인 증명에 쓰입니다. 서버에 올라가는 것은 공개 키 한 장뿐이고, 참여하는 순간에도 비공개 부분은 바깥으로 나가지 않습니다. 서버는 매번 새 난수를 던지고, 상대가 자기 자리에서 풀어낸 답만 받아 대조해 들여보냅니다. 초대 키가 서버 로그를 한 번도 스쳐 가지 않도록 설계된 경로입니다.
메신저를 설치할 때 우리는 보통 앱 스토어를 믿고 받아서 씁니다. 그 파일이 진짜 공식 배포본인지 확인할 방법은 사용자에게 주어지지 않았죠. Bytz는 메인 화면에 HTML 해시 확인을 두었습니다. 이 파일의 SHA-256을 바로 뽑아서 공식 배포 해시와 대조해볼 수 있습니다. 코드 전체가 한 파일에 들어 있으니, 의심이 들면 열어서 직접 읽어볼 수도 있습니다.
세션 ECDH 개인키는 extractable: false로 생성됩니다. 브라우저
API로 꺼내려 해도 거부되고, 대화 탭이 닫히면 메모리에서 함께 사라집니다.
장기 보관이 필요한 키는 브라우저 저장소에 남지만, 사용자가 정한 인증키에서
파생된 AES-GCM으로 싸인 뒤에야 기록됩니다. 기기 파일을 통째로 복사해
가더라도, 그 인증키가 없이는 안에 든 키를 다시 꺼내지 못합니다.
대화 초기화는 내 기기 기록만 지우는 버튼이 아닙니다. 상대방 기기의 기록도 함께 삭제되고, 아직 전달되지 않은 메시지까지 같이 정리됩니다. 일부 메시지를 되돌리는 “보낸 메시지 삭제”가 편집의 성격이라면, 대화 초기화는 폐기에 가깝습니다. 대화 자체를 양쪽이 동시에 닫는 쪽입니다.
개인 번호를 먼저 등록해야 한다는 게 부담스러운 상황. 연결해서 용건만 확인하고 흔적 없이 끝내야 할 때 적합합니다.
누가 누구와 연락했는지, 무슨 이야기를 했는지 양쪽 다 민감한 취재. 번호 없이 바로 시작할 수 있고, 대화가 끝나면 양쪽 기기에서 함께 정리됩니다.
사고가 터졌을 때 평소 쓰는 계정과 엮이지 않은 채널을 긴급히 열어야 할 때. 파일 하나만 공유하면 3분 안에 대화 채널이 생깁니다.
한 번의 협업, 일회성 외부 컨택, 누구와 무슨 이야기를 나눴는지가 평소 계정과 묶이지 않기를 바라는 자리. 연락처, 주소록, 평소 쓰는 메신저 계정 어디에도 흔적이 남지 않습니다.
메시지를 보낼 때마다 사용하는 키가 한 칸씩 다음으로 넘어갑니다. 거기에 더해 답장이 오갈 때는 양쪽이 함께 만든 새 비밀로 키 자체를 한 번 더 갈아 끼웁니다. 어느 한 시점의 키가 노출되더라도, 그 앞과 뒤의 메시지까지 함께 풀리지는 않습니다.
ECDH(P-256) 위에 ML-KEM-768의 shared secret을 얹어 세션 키를 파생하고, 메시지 서명에는 ECDSA와 ML-DSA-65를 함께 맞물려 검증합니다. 지금의 암호 해독에도, 나중에 양자 컴퓨터가 등장한 뒤 돌이켜 해독하거나 위조하려는 시도에도 함께 대비합니다.
메시지든 세션 합의 신호든 대화 초기화 명령이든, 받는 쪽은 서명부터 확인합니다. 타임스탬프 허용 범위와 중복 검사 캐시를 함께 점검하기 때문에, 누가 예전 프레임을 잡아 두었다가 나중에 다시 흘려보내도 받아주지 않습니다.
긴 숫자 해시를 비교하라고 하면 아무도 안 합니다. Bytz는 상대 확인용 fingerprint를 6단어로 줄여서 보여줍니다. 사용자가 실제로 맞춰볼 수 있어야 검증도 의미를 가집니다.
나가는 frame은 정해진 크기 bucket에 맞춰 padding을 채웁니다. 송신 직전에는 0–500ms의 jitter를 섞어 보내고요. 메시지 내용이 암호화돼 있어도 길이와 타이밍은 정보가 됩니다. 그 단서까지 흐립니다.
외부에서 스크립트나 폰트, 이미지를 불러오지 않습니다. 브라우저의 콘텐츠 보안 정책(CSP)이 처음부터 외부 호출을 막아두기 때문에, 코드가 변조되더라도 거기서 데이터가 다른 서버로 빠져나갈 길은 없습니다. 검증할 대상이 한 파일에 모여 있으니, 누가 실제로 읽어보고 판단하기도 그만큼 수월합니다.
모든 보안 도구에는 바깥쪽 경계가 있습니다. Bytz가 무엇을 해결하지 않는지 먼저 밝혀두는 게 맞다고 봤습니다.