기본 원칙
Solo2는 두 사람 사이에 프라이빗 터널을 만듭니다. 직접적으로. 중개자 없이.
우리 서버는 딱 한 가지만 합니다: 터널의 양 끝을 서로 소개해서 찾을 수 있게 합니다. 이를 위해 최소한의 것만 필요합니다 — 두 피어의 식별자 — 소개에 걸리는 밀리초 동안만 RAM 메모리에 보관합니다. 두 기기가 서로를 찾는 순간, 해당 데이터는 메모리에서 삭제됩니다. 어떤 시점에서도 디스크에 기록되지 않습니다.
연결되면 서버는 사라집니다. 대화에 참여하지 않습니다. 보지 않습니다. 저장하지 않습니다. 얼마나 오래 지속되는지, 얼마나 자주 대화하는지, 무엇에 대해 이야기하는지 알지 못합니다.
우리를 믿어달라고 하지 않습니다. 직접 확인해 보세요:
테스트 1 — 서버는 불필요합니다.
직접 터널이 구축되면 우리 서버는 더 이상 관여하지 않습니다. 그 순간 서버가 다운되더라도 대화는 중단 없이 계속됩니다. 기기가 켜져 있고 인터넷에 연결되어 있는 한, 터널은 당신의 것입니다. 우리는 더 이상 거기에 없습니다.
테스트 2 — 10기가바이트 파일을 보내세요.
빠르기만 한 게 아닙니다 — 우리 서버는 전혀 신경 쓰지 않습니다. 24시간 동안 10기가바이트 이상의 파일을 계속 보내 보세요. 우리 서버는 알아차리지도 못합니다, 관여하지 않으니까요. 다른 메시징 서비스에서 같은 걸 시도해 보세요.
테스트 3 — 망원경에 대해 이야기하세요.
한 오후를 누군가와 망원경이나 낚싯대, 또는 인터넷에서 한 번도 검색한 적 없는 것에 대해 이야기하며 보내세요. 며칠 기다리세요. 망원경 광고는 어디에도 나타나지 않습니다. 당신의 말은 터널 밖으로 나가지 않았습니다.
당신의 데이터, 당신의 책임.
이것은 우리의 가장 큰 장점이자, 솔직히 말하면, 적응하는 데 가장 오래 걸릴 부분입니다. 메시지, 파일, 연락처는 기기 안의 암호화된 금고에 저장됩니다. 어떤 서버에도 사본이 없습니다. 24개의 단어로 보호됩니다 — Bitcoin과 같은 수준의 보안입니다. 하지만 한 곳에만 있습니다. Solo2를 두 번째 기기에 설치하지 않는 한 — 두 금고는 동시에 연결되면 자동으로 동기화됩니다. 암호화된 백업을 내보낼 수도 있습니다. 유일한 기기를 잃어버리면 구해줄 클라우드는 없습니다. 당신의 데이터는 당신의 것입니다, 모든 결과와 함께.
상세히
Solo2 서버는 완전히 눈이 멀었습니다. 누구와 대화하는지, 무엇을 말하는지, 어떤 파일을 공유하는지 알지 못합니다. 기기 간 연결을 설정하는 기술적 신호조차 서버가 읽을 수 없습니다 — 종단 간 암호화되어 전송됩니다.
메시지는 기기 간 직접 이동하며, 종단간 암호화됩니다. 대화 기록은 브라우저에 암호화되어 저장되며, 서버에는 절대 저장되지 않습니다.
암호화 키는 매 메시지마다 자동으로 교체됩니다. 모든 메시지는 즉시 폐기되는 고유한 키로 암호화됩니다. 이것은 기술적으로 Double Ratchet으로 알려져 있으며, 누군가가 키를 획득하더라도 단 하나의 메시지만 읽을 수 있을 뿐 대화 전체를 읽을 수 없다는 것을 의미합니다. 또한, 각 통신 라운드 후에 보안이 자동으로 복원됩니다. 손상된 키는 다음 메시지가 교환되는 즉시 무용지물이 됩니다.
기기 간 직접 연결이 불가능한 경우(예: 네트워크 제한), 미러 서버(기술적으로 TURN이라 함)를 사용합니다: 데이터가 한 기기에서 다른 기기로 반사되지만, 미러는 반사하는 내용을 인식하지 못합니다 — 모든 것이 종단간 암호화되어 이동하며 서버는 읽을 수 없습니다. 또한, 모든 패킷은 균일한 크기로 패딩되어 관찰자가 트래픽의 크기나 빈도를 분석하여 정보를 추론하는 것을 방지합니다.
애플리케이션에서 사용 중인 연결 유형을 항상 확인할 수 있습니다 — 직접 연결 또는 미러 서버를 통한 연결 — 그에 따라 대응할 수 있습니다.
마스터 키는 256비트의 실제 엔트로피로 무작위 생성됩니다 — Bitcoin과 동일한 수준입니다. 계정을 만들 때 Solo2는 24개의 단어로 표현되는 고유한 키를 생성합니다. 비밀번호는 서비스 접근을 보호합니다. 24개의 단어는 데이터의 열쇠입니다. 두 개의 서로 다른 문을 위한 두 개의 서로 다른 열쇠입니다.
서버가 사라져도 데이터는 살아남습니다. 24개 단어로 서버 연결 없이 로컬 금고에 접근할 수 있습니다. 데이터는 진정으로 사용자의 것입니다.
1. 서버에 있는 데이터
1.1 사용자 계정
사용자 기록에 존재하는 모든 필드입니다. 이 외에는 아무것도 없습니다.
| 데이터 | 사유 | 보호 | 기간 |
|---|---|---|---|
| 사용자 이름 | 로그인을 위해 | 일반 텍스트 (설계상 공개) | 계정을 삭제할 때까지 |
| 비밀번호 | 인증 | Argon2id로 보호 (OWASP 권장, 특수 하드웨어 공격에 내성). 실제 비밀번호는 절대 저장하지 않습니다 | 계정을 삭제할 때까지 |
| 공개 이름 | 연락처가 사용자를 알아볼 수 있도록 | 일반 텍스트 (사용자가 선택) | 변경하거나 계정을 삭제할 때까지 |
| 연결 코드 | Solo2 내 사용자의 주소 — 전화번호와 같습니다. 누군가가 사용자를 찾고 연결 요청을 보낼 수 있도록 공유하는 것입니다 | 일반 텍스트, 고유 (~10자) | 계정을 삭제할 때까지 |
| 경제적 잔액 | 계정에 추가한 금액 | 숫자 (센트 단위) | 계정을 삭제할 때까지 |
| 보너스 잔액 | 받은 보너스 (프로모션). 금전 잔액보다 먼저 소비됩니다 | 숫자 (센트 단위) | 계정을 삭제할 때까지 |
| 계정 유형 | 현재 플랜 (체험, 표준, 골드, 플래티넘) | 1바이트 (정수: 0=체험, 1=표준, 2=골드, 3=플래티넘, 4=일시정지, 5=정지) | 변경되거나 계정을 삭제할 때까지 |
| 가입 날짜 및 시간 | 계정 생성 시점 | 전체 날짜 및 시간 (타임스탬프) | 영구 |
| 내부 식별자 | 시스템은 사용자 이름을 사용하지 않고 당신을 참조하기 위해 두 개의 내부 코드가 필요합니다. 하나는 기본 ID이고 다른 하나는 참조 코드입니다. 둘 다 불투명합니다 — 시스템 외부에서는 아무 의미가 없습니다 | 각각 24자의 무작위 코드 2개 (예: u_7kX9mP2...). 이름, 날짜 또는 개인 데이터를 포함하지 않습니다 — 순수하게 무작위입니다 | 계정을 삭제할 때까지 |
| 보안 버전 | 비밀번호 보호 알고리즘의 어떤 버전이 사용되었는지 | 내부 번호 | 계정을 삭제할 때까지 |
| 상태 표시기 | 기술 플래그 (잔액 변경 여부, 최대 보안 모드 활성화 여부) | 1바이트 — 글자 하나에 해당합니다. 그 이상은 들어갈 수 없습니다 | 계정을 삭제할 때까지 |
데이터 양의 목안으로: 전체 기록은 약 400바이트 — 이 단락보다 짧습니다. 이름(원한다면 가명), 비밀번호 지문(고정 크기, 60바이트), 암호화된 마스터 키(읽을 수 없는 약 128바이트의 불투명한 덩어리), 잔액을 위한 숫자 두 개, 몇 개의 날짜, 그리고 1바이트의 설정 플래그. 이것이 서버에 존재하는 당신의 전부입니다.
1.2 활성 세션
| 데이터 | 사유 | 보호 | 기간 |
|---|---|---|---|
| 세션 토큰 해시 | 로그인 상태 유지 | 비가역적 지문 (SHA-256). 원래 토큰은 서버에 저장되지 않습니다 | 24시간 — 이후 완전히 삭제됩니다 |
| 생성 날짜 | 시스템이 언제 생성되었는지 알 수 있도록 — 자동 정리에 유용 | 숫자 타임스탬프 (유닉스 초) | 세션과 함께 삭제됩니다 |
| 만료 날짜 | 세션은 생성 후 24시간에 만료됩니다. 사용으로 갱신되지 않습니다 — 고정된 만료 날짜가 있습니다 | 숫자 타임스탬프 (생성 + 24시간) | 24시간 — 이후 완전히 삭제됩니다 |
로그아웃하거나 만료되면 해당 행이 데이터베이스에서 완전히 삭제됩니다. 세션이 존재했다는 흔적이 남지 않습니다.
1.3 연결 요청
| 데이터 | 사유 | 보호 | 기간 |
|---|---|---|---|
| 요청자 ID | 누가 요청을 보냈는지 확인 | 24자의 무작위 내부 코드 | 3일 — 이후 자동으로 삭제됩니다 |
| 수신자 ID | 누구에게 보내는지 확인 | 24자의 무작위 내부 코드 | 3일 — 이후 자동으로 삭제됩니다 |
| 상태 | 대기 중 / 수락됨 / 거절됨 | 1바이트 (정수: 0=대기 중, 1=수락됨, 2=거부됨) | 해결 시 또는 만료 시 삭제 (3일) |
| 생성 날짜 | 요청이 언제 생성되었는지 알아 자동 삭제할 수 있도록 함 | 숫자 타임스탬프 (유닉스 초) — 4~8바이트 | 3일 — 이후 자동으로 삭제됩니다 |
중요 참고: 요청이 보류 중인 동안(최대 3일), 서버는 사용자 A가 사용자 B에게 연결을 요청했다는 것을 알고 있습니다. 3일이 지나면 요청은 자동으로 삭제됩니다. 연결이 수락되면 서버는 그 관계를 저장하지 않습니다. 연락처 목록은 브라우저 안에서만, 암호화되어 존재합니다.
1.4 연결 코드
| 데이터 | 사유 | 보호 | 기간 |
|---|---|---|---|
| 연결 코드 (alias) | 다른 사용자가 당신을 찾고 터널 생성을 요청할 수 있는 짧은 식별자 | 내부 ID에서 파생된 무작위 8자리 코드 | 영구적 (공개 연결 식별자입니다) |
1.5 푸시 구독 (알림)
| 데이터 | 사유 | 보호 | 기간 |
|---|---|---|---|
| 알림 주소 | 브라우저에 알림 전송 | 브라우저 제공업체(Google, Mozilla 또는 Apple)의 URL | 알림을 비활성화하거나 계정을 삭제할 때까지 |
| 푸시 암호화 키 | 브라우저만 읽을 수 있도록 알림 암호화 | Web Push 표준 | 주소와 동일 |
1.6 피드백 (지원)
| 데이터 | 사유 | 보호 | 기간 |
|---|---|---|---|
| 메시지 | 도움을 드리기 위해 | 일반 텍스트 | 처리할 때까지 |
| 사용자 ID | 누가 도움이 필요한지 확인 | 내부 ID | 메시지와 동일 |
1.7 연결 시그널링 (임시)
두 기기가 직접 연결되려면, 연결 설정을 위한 기술 신호(WebRTC 프로토콜)를 교환해야 합니다. 서버가 당신의 사용자 코드와 상대방의 사용자 코드를 메모리에 보유하는 유일한 순간은 이 연결 요청을 처리하는 밀리초 동안입니다. 찰나에 끝나고, RAM에만 존재하며, 디스크에 기록되지 않습니다. 신호 자체는 종단간 암호화됩니다
| 데이터 | 사유 | 보호 | 기간 |
|---|---|---|---|
| 연결 신호 | 기기 간 직접 연결 설정 | 수신자의 공개 키로 종단간 암호화됨. 서버는 읽거나 수정할 수 없습니다 | 60초 |
1.8 미러 서버 (TURN 릴레이)
직접 연결이 불가능한 경우, 미러 서버를 사용합니다: 데이터가 거울을 통과하는 빛처럼 통과합니다 — 한쪽에서 다른 쪽으로 반사되지만, 거울은 반사하는 내용을 인식하지 못합니다. 모든 패킷은 균일한 크기로 패딩되어 관찰자가 메시지와 단순한 연결 하트비트를 구별할 수 없게 합니다.
| 데이터 | 사유 | 보호 | 기간 |
|---|---|---|---|
| 접근 자격 증명 | 미러 서버 인증 | 신원이 비가역적 해시로 변환됩니다 — 미러 서버는 사용자가 누구인지 모릅니다 | 24시간 |
1.9 처리된 결제
결제는 익명성과 실제로 마찰이 있는 유일한 지점입니다. 이에 대해 솔직하게 말씀드리겠습니다.
Solo2에 가입하면 사용자 이름(가명 가능), 비밀번호, 공개 이름(역시 가명 가능)을 선택합니다. 어떤 데이터도 실제 인물과 연결되지 않습니다. 그러나 카드로 결제하면, 금융 기관은 사용자가 누구인지 알고 있습니다.
결제 게이트웨이로부터 저희가 받는 것은 확인과 금액뿐입니다. 카드 명의자의 이름, 카드 번호, 신분증 또는 결제자의 개인 데이터를 받거나 저장하지 않습니다. 소액이므로 법적으로 매점에서 사탕을 사는 현금 영수증과 동등합니다: 매점 주인은 결제하는 사람의 신분증을 기록하지 않습니다.
또한, 결제 기록은 의도적으로 연결 해제되어
| 데이터 | 사유 | 보호 | 기간 |
|---|---|---|---|
| 결제 기록 | 회계 및 세금 의무 | 확인 + 금액. 결제자의 개인 데이터 없음. 어떤 사용자 계정과도 연결 없음 | 영구 (법적 의무) |
최악의 시나리오에 대해:
저희의 모든 수입은 합법적이며 결제 게이트웨이를 통해 기록됩니다. 해당 세금을 납부합니다. 그러나 고객의 익명성은 저희 측에서 완전합니다.
2. 서버에 없는 데이터
이것이 저희를 정의합니다. Solo2 서버는 다음을 저장하지 않으며 접근할 수 없습니다
- 메시지
- 파일
- 연락처 목록
- 채팅 기록
- 위치
- 사용 분석
- 기기 데이터
- 통신 메타데이터
IP 주소에 대해
IP 주소는 어떤 데이터베이스에도 저장되지 않습니다. 서버의 기술 로그에서 IP 주소는 비가역적 해시로 변환됩니다 — 악용 패턴 감지에는 유용하지만, 원래 IP로 되돌릴 수 없습니다. 이 로그는 7일마다 자동으로 삭제됩니다. 연결 신호에는 IP가 포함될 수 있지만, 종단간 암호화되어 있어 서버는 읽을 수 없습니다.
3. 브라우저의 데이터 (금고)
아래 모든 것은 사용자의 브라우저에만 존재합니다
데이터는 저장 상태에서 암호화됩니다 — 누군가 브라우저 저장소에 접근하더라도 비밀번호 없이는 읽을 수 없는 암호화된 블록만 발견합니다.
백업을 내보낼 때, 동일한 보호(Argon2id + AES-256-GCM)로 암호화됩니다. 비밀번호를 아는 사람만 복호화할 수 있습니다.
| 데이터 | 암호화 | 제어 |
|---|---|---|
| 메시지 | AES-256-GCM | 삭제 시점은 사용자가 결정 |
| 파일 | AES-256-GCM | 삭제 시점은 사용자가 결정 |
| 연락처 (페어) | AES-256-GCM | 연결할 대상은 사용자가 결정 |
| 확인 상태 | AES-256-GCM | 각 연락처의 신원은 사용자가 직접 확인 |
| 검색 인덱스 | 비가역 토큰(HMAC)으로 암호화 | 메시지에서 재구성 |
| 전달 상태 | AES-256-GCM | 어떤 메시지가 전달되었는지 |
| 대기 중인 메시지 | AES-256-GCM | 연결이 없을 때의 전송 대기열 |
브라우저 임시 저장소
| 데이터 | 유형 | 기간 | 사유 |
|---|---|---|---|
| 사용자 세션 | 브라우저 로컬 메모리 (localStorage) | 로그아웃할 때까지 | 로그인 유지 |
| 앱 버전 | 브라우저 로컬 메모리 (localStorage) | 영구 | 업데이트 감지 |
| 테마 설정 | 브라우저 로컬 메모리 (localStorage) | 영구 | 비주얼 테마 기억 |
| 언어 설정 | 브라우저 로컬 메모리 (localStorage) | 영구 | 언어 기억 |
| 비밀번호 (최대 보안 모드) | 탭 메모리 (sessionStorage) | 탭을 닫으면 사라집니다 | 페이지 새로고침 시 암호화 재초기화 |
브라우저 보안에 대한 참고사항
Solo2는 웹 브라우저 내에서 실행됩니다. 저장 상태의 암호화된 데이터는 보호되지만, 애플리케이션이 열려 있고 복호화된 메시지가 화면에 표시될 때 보안은 사용자의 환경에도 달려 있습니다:
- 브라우저 확장 프로그램:
- 클린 브라우저:
- 네이티브 애플리케이션:
4. 네트워크 연결
Solo2 애플리케이션
| 도메인 | 사유 | 전송되는 데이터 |
|---|---|---|
| solo2.net | 애플리케이션 API | 인증, 시그널링, 프레즌스 |
| pay.menzuri.com | 결제 게이트웨이 | 결제 시에만 |
다른 어떤 도메인도 없습니다.
기기의 공용 IP 주소를 확인하는 것조차(사용자 간 직접 연결 설정에 필요) 자체 서버를 사용합니다(기술적으로 STUN이라 함). 외부 서비스에 위임하지 않습니다. 저희가 직접 관리합니다.
소개 페이지
소개 페이지(solo2.net) — 애플리케이션과 독립적 — 는 독일에 위치한 자체 서버에 호스팅된 익명 측정 시스템을 사용합니다:
| 도메인 | 사유 | 전송되는 데이터 |
|---|---|---|
| stats.menzuri.com | 익명 방문 측정 | 방문 페이지 (쿠키 없음, IP 없음, 식별 없음) |
이 시스템은 쿠키를 설치하지 않고, IP 주소를 기록하지 않으며, 사용자를 식별하지 않고, 방문 간 추적하지 않으며, 제3자와 데이터를 공유하지 않습니다. Solo2 애플리케이션에는 이 시스템이나 다른 어떤 종류의 분석 도구도 없습니다.
5. 데이터 삭제
두 가지 다른 작업이 있으며, 그 차이를 아는 것이 중요합니다:
로컬 데이터 삭제
애플리케이션 설정에서 두 가지 로컬 삭제 옵션이 있습니다:
- 내 데이터 삭제
- 비상 리셋
두 경우 모두, 서버의 계정은 계속 존재합니다.
기기 간 자동 복구
한 기기에서 데이터를 잃고 다른 기기가 연결되어 있으면, Solo2가 상황을 감지하고 신원과 금고를 자동으로 복원할 것을 제안합니다. 복원은 기기 간 직접 연결로 암호화되어(Argon2id) 전달됩니다 — 서버를 거치지 않습니다.
서버에서 계정 삭제
- 모든
- 삭제는 원자적입니다
- 결제 기록은 의도적으로 연결 해제된 상태로
- 서버 로그의 식별자는 비가역적 해시입니다: 계정이 삭제되면 로그를 계정에 연결할 수 없습니다.
- 브라우저의 금고는 이 작업으로 자동 삭제되지 않습니다(브라우저에 접근할 수 없음). 삭제하려면 먼저 핵 삭제를 실행하거나 브라우저에서 사이트 데이터를 지우세요.
5b. 마스터 키와 24개 단어
Solo2에서 계정을 생성하면 256비트의 실제 엔트로피를 가진 마스터 키가 생성됩니다(Bitcoin과 동일). 이 키는 사용자만 아는 24개 단어로 표현됩니다. 비밀번호가 이 키를 래핑하여 서버에 암호화된 상태로 저장합니다 — 서버는 읽을 수 없습니다.
이는 두 개의 독립적인 키를 가진다는 의미입니다
정확한 알고리즘 (검증 가능)
생성: CSPRNG
마스터 키를 보호하는 방법
| 계층 | 내용 | 위치 |
|---|---|---|
| 비밀번호 | 서버 접근. 마스터 키를 래핑 | 사용자의 기억 속 + 서버의 해시 |
| 기기 비밀 | 설치 시 자동 생성되는 보이지 않는 두 번째 인증 요소 | 기기 내 (추출 불가) |
| 마스터 키 (24개 단어) | 256비트의 실제 엔트로피, 무작위 생성. Bitcoin 수준 (BIP39) | 사용자가 보관하는 종이 + 서버에 래핑된 상태 |
| 키 교체 | 모든 메시지는 사용 후 파기되는 고유한 키를 사용 (Double Ratchet) | 자동, 투명하게 |
비밀번호를 변경하면
비밀번호 변경은 즉각적입니다. 마스터 키만 새 비밀번호로 다시 래핑됩니다 — 신원은 변하지 않고, 금고는 다시 암호화되지 않으며, 연락처에 영향이 없고, 24개 단어는 동일하게 유지됩니다. 밀리초 단위의 작업입니다.
복구
비밀번호를 잃으면 24개 단어로 금고에 접근할 수 있습니다 — 서버 없이. 24개 단어를 잃으면 비밀번호로 로그인하여 서버가 래핑된 키를 돌려줍니다. 둘 다 잃으면 데이터는 복구 불가능합니다. Bitcoin처럼, 이것은 설계된 보안입니다.
6. 누군가 무단으로 서버에 접근하면 어떻게 되는가
공격자가 Solo2 서버에 완전한 접근 권한을 얻으면 다음을 얻게 됩니다:
- 사용자 이름 및 공개 이름
- 연결 코드
- 공개 키 (브라우저에 있는 개인 키 없이는 무용지물)
- 비밀번호 해시 (Argon2id 덕분에 극히 비용이 큰 무차별 대입 공격 없이는 무용지물)
- 세션 토큰 해시 (원본 토큰 없이는 무용지물)
- 대기 중인 연결 요청 (내부 ID, 3일 후 만료)
- 계정 유형, 잔액 및 가입 날짜
- 결제 기록 (특정 사용자에게 연결 불가)
얻을 수 없는 것:
- 메시지 없음 (서버에 존재한 적 없음)
- 파일 없음 (서버에 존재한 적 없음)
- 연락처 목록 없음 (서버에 존재한 적 없음)
- 채팅 기록 없음 (서버에 존재한 적 없음)
- 암호화 개인 키 없음 (브라우저에 존재)
- IP 주소 없음 (기록되지 않음)
7. 저희의 약속
이 선언문은 데이터 관리에 관련된 변경이 있을 때마다 업데이트됩니다. 데이터베이스에 새 필드를 추가하면 여기에 나타납니다. 무언가를 제거해도 마찬가지입니다.
현재 유효한 버전은 항상 이 페이지입니다.