프라이버시 우선 설계로 Tempy.email을 구축한 방법
대부분의 이메일 서비스는 메시지를 데이터베이스에 저장하고, 검색을 위해 인덱싱하고, 백업을 유지하며, 무기한으로 보관합니다.
우리는 반대로 합니다: 모든 것이 메모리에 존재합니다. 타이머가 만료되면 데이터는 사라집니다.
전통적인 이메일의 프라이버시 문제
Gmail, Outlook 또는 기존 이메일 서비스를 사용할 때:
- 이메일이 디스크에 저장됨 → 소환장, 유출 또는 판매 가능
- 검색을 위해 인덱싱됨 → 통신에 대한 메타데이터 생성
- 백업됨 → 여러 사본이 존재하여 노출 증가
- 무기한 보관됨 → 10년 전 이메일이 여전히 존재
- 광고를 위해 스캔됨 → 타겟 광고를 위해 콘텐츠 분석
- 로그 유지됨 → IP 주소, 타임스탬프, 접근 패턴 추적
진정으로 삭제되는 것은 없습니다.
"삭제"를 눌러도 데이터는 다음에 존재할 수 있습니다:
- 백업 테이프
- 검색 인덱스
- 서버 로그
- 컴플라이언스 아카이브
- 법적 보존 시스템
우리의 접근 방식: 메모리 전용 아키텍처
tempy.email은 하나의 원칙 위에 구축되었습니다: RAM에 없으면 존재하지 않습니다.
전통적인 이메일:
사용자 → 웹 서버 → 데이터베이스 → 디스크 → 백업 → 아카이브
(데이터가 영원히 존재)
tempy.email:
사용자 → 웹 서버 → Redis (RAM 전용) → 만료 → 사라짐
(데이터가 10분간 존재)
영구 저장소 없음
없는 것:
- ❌ PostgreSQL, MySQL 또는 디스크 기반 데이터베이스 없음
- ❌ 파일 스토리지 없음 (S3, 디스크, NAS)
- ❌ 백업 없음
- ❌ 아카이브 없음
- ❌ 이메일 콘텐츠 로그 없음
- ❌ "소프트 삭제" 없음 (삭제로 표시하지만 데이터 유지)
있는 것:
- ✅ Redis (인메모리 키-값 저장소)
- ✅ TTL (Time-To-Live) 모든 키에 적용
- ✅ 자동 만료
이메일 저장 방식
이메일이 도착하면:
// TTL과 함께 Redis에 이메일 저장
await redis.set(
`mailbox:${address}:emails`,
JSON.stringify(email),
'EX', 600 // 600초(10분) 후 만료
);
10분 후:
- Redis가 자동으로 키를 삭제
- 메모리가 해제됨
- 데이터가 완전히 사라짐 (삭제 표시가 아닌 실제로 사라짐)
복구할 것이 없으므로 "복구" 프로세스도 없습니다.
서버 로그는?
로깅을 최소화합니다:
전통적인 서버 로그:
2026-02-12 10:15:23 User [email protected] logged in from 203.0.113.5
2026-02-12 10:15:45 [email protected] opened email "Password Reset"
2026-02-12 10:16:12 [email protected] deleted 3 emails
tempy.email 로그:
2026-02-12 10:15:23 Mailbox created (no email address logged)
2026-02-12 10:15:45 Email received (no content logged)
2026-02-12 10:25:23 Mailbox expired
이벤트를 기록하지, 식별 가능한 데이터를 기록하지 않습니다.
프라이버시 기능
1. 사용자 계정 없음
원해도 계정을 만들 수 없습니다:
- 가입 양식 없음
- 비밀번호 없음
- "내 계정" 페이지 없음
- 사용자 데이터베이스 없음
이유: 계정은 신원을 만듭니다. 우리는 당신이 누구인지 알고 싶지 않습니다.
2. 추적이나 분석 없음
많은 "프라이버시 우선" 서비스도 여전히 사용하는 것들:
- Google Analytics
- Facebook Pixel
- Mixpanel
- Hotjar
우리가 사용하는 것: 위의 어떤 것도 없음.
추적하는 것:
- 생성된 총 메일박스 수 (카운터)
- 처리된 총 이메일 수 (카운터)
추적하지 않는 것:
- 누가 생성했는지
- 언제 생성했는지
- 어떤 IP에서 왔는지
- 어떤 브라우저를 사용했는지
3. 이메일 콘텐츠 스캔 없음
이메일 콘텐츠를 분석하지 않습니다:
- 광고
- 머신러닝 훈련
- 패턴 감지
- 콘텐츠 분류
이메일은 사람이나 알고리즘이 읽지 않은 상태로 시스템을 통과합니다.
4. IP 로깅 없음
기록하지 않는 것:
- IP 주소
- 지리적 위치
- ISP
- 기기 핑거프린트
이유: "익명화된" IP 로그조차 상관관계 공격을 통해 역익명화될 수 있습니다.
5. 타사 서비스 없음
사용하지 않는 것:
- 추적하는 CDN (프라이버시 모드의 Cloudflare만 사용)
- 분석 플랫폼
- 광고 네트워크
- 소셜 미디어 위젯
- 타사 폰트 (Google Fonts를 로컬로 제공)
이유: 모든 타사 서비스는 잠재적인 데이터 유출 경로입니다.
기술적 구현
Redis 설정
// 모든 키에 기본 TTL 적용
const DEFAULT_TTL = 600; // 10분
// 메일박스 키
await redis.setex(
`mailbox:${address}`,
DEFAULT_TTL,
JSON.stringify({ created: Date.now() })
);
// 이메일 키
await redis.rpush(`mailbox:${address}:emails`, emailJson);
await redis.expire(`mailbox:${address}:emails`, DEFAULT_TTL);
자동 정리
Redis가 만료를 자동으로 처리합니다:
T+0: 이메일 도착 → Redis에 저장
T+600초: TTL 만료 → Redis가 키 삭제 → 메모리 해제
크론 작업 없음. 수동 정리 없음. "소프트 삭제" 없음.
이메일 새니타이제이션
이메일을 저장하기 전에 HTML을 새니타이즈하여 다음을 방지합니다:
- XSS 공격
- 추적 픽셀
- 악성 스크립트
- 프라이버시 유출
var sanitizer = new HtmlSanitizer();
sanitizer.AllowedTags = ["p", "a", "b", "i", "ul", "ol", "li"];
// <img> 없음, <script> 없음, 추적 없음
var cleanHtml = sanitizer.Sanitize(rawHtml);
접근할 수 없는 것들
원한다 해도 (원하지 않지만), 우리가 물리적으로 할 수 없는 것:
- 삭제된 이메일 복구 → 백업이 존재하지 않음
- 과거 데이터 보기 → TTL이 모든 것을 삭제
- 사용자 행동 추적 → 분석할 로그가 없음
- 사용자 식별 → 계정도 없고, 기록된 IP도 없음
- 데이터 요청에 응하기 → 넘길 데이터가 없음
이것은 정책적 결정이 아닙니다. 아키텍처적인 것입니다.
우리가 받아들이는 트레이드오프
프라이버시 우선 설계는 제한을 수용한다는 것을 의미합니다:
제공할 수 없는 것:
- ❌ 이메일 검색 (인덱싱 없음)
- ❌ 장기 저장 (기본 10분)
- ❌ 이메일 복구 (만료되면 사라짐)
- ❌ 사용자 계정 (메일박스를 "저장"할 수 없음)
- ❌ 실제 받은편지함으로 이메일 전달
제공할 수 있는 것:
- ✅ 완벽한 프라이버시
- ✅ 제로 추적
- ✅ 즉시 삭제
- ✅ 데이터 유출 위험 없음 (유출할 데이터가 없음)
- ✅ 마음의 평화
"프라이버시 중심" 이메일과의 비교
| 기능 | ProtonMail | Tutanota | tempy.email |
|---|---|---|---|
| 암호화 | ✅ E2E | ✅ E2E | ⚠️ 전송 중만 |
| 영구 저장 | ✅ 예 | ✅ 예 | ❌ 아니오 (10분 TTL) |
| 사용자 계정 | ✅ 예 | ✅ 예 | ❌ 계정 없음 |
| 데이터 소환장 위험 | ⚠️ 암호화된 데이터 존재 | ⚠️ 암호화된 데이터 존재 | ✅ 소환할 데이터 없음 |
| IP 로깅 | ⚠️ 선택적 | ⚠️ 선택적 | ❌ 절대 없음 |
| 사용 목적 | 영구 비공개 이메일 | 영구 비공개 이메일 | 일회용/테스트 |
ProtonMail과 Tutanota는 영구적인 비공개 이메일에 탁월합니다.
tempy.email은 데이터가 전혀 존재하지 않기를 원하는 일회용 사용을 위한 것입니다.
결론
대부분의 서비스가 말합니다: "우리는 당신의 데이터를 보지 않겠습니다" 우리는 말합니다: "우리는 당신의 데이터를 볼 수 없습니다 (충분히 오래 존재하지 않습니다)"
대부분의 서비스가 말합니다: "요청하시면 삭제하겠습니다" 우리는 말합니다: "요청 여부와 관계없이 10분 후 자동 삭제됩니다"
대부분의 서비스가 말합니다: "우리는 프라이버시 중심입니다" 우리는 말합니다: "프라이버시가 우리의 아키텍처입니다"
이것은 정책에 의한 프라이버시가 아닌, 설계에 의한 프라이버시입니다.
직접 확인해보세요: 임시 주소를 생성하세요. 10분 후 그 이메일은 영원히 사라집니다. "보관"된 것도 아니고, "삭제"된 것도 아닙니다. 사라진 것입니다.