프라이버시 아키텍처
"메일 본문은 기기를 떠나지 않습니다"는 약속이 아니라 구조입니다. 이 페이지는 메일메일이 어떤 데이터를 어디로 보내고, 무엇을 코드 차원에서 불가능하게 만들어 두었는지 그대로 적습니다. 법적 고지는 개인정보처리방침에 있습니다.
한눈에 보기
메일메일에는 메일을 저장하거나 중계하는 서버가 없습니다. iPhone이 메일 제공자(네이버·Gmail 등)에 직접 접속하고, 요약·번역은 iPhone 안의 Apple 온디바이스 모델이 만들며, 워치에는 요약 카드만 건너갑니다. 저희가 운영하는 유일한 서버는 "새 메일이 있을지 모르니 깨어나라"는 신호를 보내는 신호기이고, 그 서버가 아는 것은 푸시 토큰 하나입니다.
1. 기기를 떠나지 않는 것
| 데이터 | 어디에 있나 | 보호 |
|---|---|---|
| 메일 본문 | iPhone/iPad 로컬 DB(SwiftData) | 기기 최초 잠금 해제 전까지 암호화(iOS 파일 보호). 워치·서버·로그 어디에도 안 감 |
| AI 요약(헤드라인·핵심·분류) | iPhone 로컬 DB → 워치 카드 | Apple Foundation Models로 기기 안에서 생성. 외부 AI API 호출 없음 |
| 번역문 | 메모리에만 | Apple Translation(온디바이스)으로 번역 → 요약 직후 폐기. 저장 안 함 |
| 앱 비밀번호 · OAuth 토큰 | iPhone 키체인 | 기기 전용(iCloud 키체인 동기화 차단). 워치·서버 미전송 |
| 발신자·제목 | iPhone 로컬 DB → 워치 카드 | 워치 카드에는 요약 카드 필드(발신자·제목·헤드라인·수신시각·분류·답장 후보)만 담깁니다. 본문 필드 자체가 없습니다 |
| 프로필 아바타 사진 | iPhone 앱 전용 폴더 | 256px 썸네일만 보관, 원본 폐기. 백업·동기화 없음 |
| 개인화 학습 데이터 | iPhone 로컬 | 발신자는 해시 토큰으로만 저장(이메일 평문 없음). Pro 동기화 시에도 가중치·해시만 E2E 암호화 |
| 돌아보기 회고(Pro) | iPhone 로컬 | 입력이 본문이 아니라 이미 만들어 둔 요약(헤드라인·분류)입니다. 회고 경계 타입에는 본문 필드가 없고, 요약도 기기 안 모델이 만듭니다 |
2. 기기를 떠나는 것 — 전부
아래가 iPhone 밖으로 나가는 데이터의 전체 목록입니다. 이 표에 없는 전송은 없습니다.
| 어디로 | 무엇을 | 왜 |
|---|---|---|
| 메일 제공자(네이버·다음·Gmail·회사 IMAP) | IMAP 로그인·메일 읽기·읽음/보관 플래그·당신이 고른 빠른 답장 발송(SMTP) | 당신 메일함과의 직접 TLS 연결. 저희를 거치지 않음 |
| Microsoft(Outlook) | OAuth 로그인, Graph API 메일 읽기·답장 발송 | 동일 — 직접 연결. 토큰은 키체인 |
| 메일메일 깨우기 신호기(Cloudflare Worker) | { token, env } — APNs 푸시 토큰과 환경값, 정확히 두 필드 | 약 10분마다 "내용 없는" 푸시로 앱을 깨워 백그라운드 sync. 그 외 키가 섞이면 서버가 400으로 거부 |
| 같은 신호기(Outlook 사용 시) | 구독 ID, 푸시 토큰, 환경, 검증 해시 | Microsoft가 "새 메일" 알림을 보낼 곳. 메일 내용은 포함되지 않음 |
| Apple(App Store) | 구매·영수증 | StoreKit. 검증도 기기 안에서 |
| Apple(iCloud, Pro 선택) | 암호화된 개인화 프로파일 블롭 | 기기 이전 시 학습 보존. 내용 = 가중치·발신자 해시·카테고리 친화. 키는 iCloud 키체인(저희는 복호 불가) |
| 사용자 본인의 미리 알림 앱 | 추출된 할 일 제목 + 메일 제목 | Pro 기능, 사용자가 탭할 때만. 본문 아님 |
| Apple(iCloud 키체인) | 개인화 salt·암호 키(각 32바이트 난수) | 기기를 바꿔도 학습이 이어지도록. Apple 종단간 암호화라 저희는 볼 수 없습니다 |
| Apple(Siri·단축어) | 헤드라인·발신자·개수, 당신이 말한 검색어 | "메일 브리핑"을 물었을 때만 결과가 시스템에 전달됩니다. 음성 검색은 당신이 말한 단어가 Siri를 거쳐 앱에 들어올 뿐, 검색 자체는 기기 안에서 돕니다. 본문 없음 |
| Cloudflare(웹사이트) | 출시 알림 신청 이메일·언어·시각 | 웹에서 신청한 경우만. 앱과 무관하며 안내 발송 후 파기 |
직접 확인하는 법: Proxyman·Charles 같은 프록시로 트래픽을 보면 mailmail.app 도메인으로 가는 요청은 /v1/register·/v1/unregister(Outlook 사용 시 /v1/graph/*)뿐이고(현재 빌드는 신호기가 꺼져 있어 이 요청도 나가지 않습니다), 본문에는 토큰 문자열만 있습니다.
3. 하지 않는 것
- 앱은 회원가입·계정이 없습니다. 앱을 쓰려고 이메일 주소를 저희에게 알려줄 일이 없습니다(웹사이트에서 출시 알림을 신청한 경우만 예외 — 안내 발송 후 파기하며, 요청하시면 즉시 삭제합니다).
- 광고 SDK·분석 SDK·크래시 리포팅 SDK 없음. 크래시·성능 진단은 Apple MetricKit을 기기 안에서 개수로만 집계합니다.
- 클라우드 AI 없음. Apple Intelligence 미지원 기기에서도 클라우드로 대체하지 않고, "요약 불가"를 정직하게 표시합니다.
- 메일 본문 로그 없음. 디버그 빌드에서도 본문을 로그에 남기는 코드가 없습니다.
- 워치로 본문 전송 없음. 워치 카드 타입에는 본문 필드가 존재하지 않습니다.
4. 코드가 강제하는 방법
정책이 아니라 타입과 링크 구조로 막습니다. 나중에 실수로 뚫리기 어렵게 만든 장치들입니다.
- 경계 타입 — 워치로 가는 카드, 서버로 가는 등록 페이로드, 미리 알림 요청은 각각 별도 구조체이며 본문이 들어갈 필드가 없습니다. 단위 테스트가 "본문이 통과하면 실패"를 회귀 가드로 겁니다.
- 클라우드 추론 코드 미포함 — 실험용 클라우드 추론 인터페이스는 별도 패키지로 분리돼 있고, 출시 앱은 그 패키지를 링크하지 않습니다. 런타임 스위치가 아니라 컴파일조차 안 됩니다.
- 서버가 잉여 데이터를 거부 — 푸시 등록(
/v1/register)은 정확히 두 필드만 받도록 스키마 검증하고, 초과 키가 있으면 400을 반환합니다. 나머지 엔드포인트는 알지 못하는 키를 저장하지 않고 버립니다. - 키체인 기기 전용 — 자격증명은
AfterFirstUnlockThisDeviceOnly로 저장돼 iCloud 키체인으로 동기화되지 않습니다. - 메일마다 새 AI 세션 — 요약 세션은 메일 단위로 생성·폐기되어 다른 메일의 내용이 프롬프트에 섞이지 않습니다.
5. 정직하게 말하는 한계
- 메일 제공자(네이버·구글·마이크로소프트)는 당연히 당신의 메일을 갖고 있습니다. 메일메일은 그 사이에 아무것도 추가하지 않을 뿐입니다.
- AI 요약은 Apple Intelligence를 지원하는 iPhone·iPad에서만 동작합니다. 대체 클라우드를 두지 않은 대가입니다.
- iPhone 기기 백업(iCloud 또는 컴퓨터)을 켜 두면 앱의 로컬 데이터베이스가 그 백업에 포함됩니다. Apple의 백업 암호화가 적용되고 저희는 접근할 수 없지만, "기기를 떠나지 않는다"의 예외이므로 밝혀 둡니다.
- 위 표의 깨우기 신호기·iCloud 개인화 동기화는 현재 출시 빌드에서 꺼져 있습니다(서버·컨테이너 프로비저닝 전). 켜는 시점에 이 페이지를 먼저 갱신합니다.
- Apple 온디바이스 모델·번역 엔진은 Apple의 것입니다. 기기 안에서 도는 것은 확인했지만, 그 내부 동작은 Apple의 공개 문서를 따릅니다.
- Outlook은 Microsoft 로그인 화면을 거칩니다. 그 로그인 자체는 Microsoft의 정책을 따릅니다.
변경 이력
- 2026-09-11 — 최초 공개(빌드 24 기준).
- 2026-09-12 — 빌드 38 기준 갱신. 돌아보기(Pro) 회고를 "기기를 떠나지 않는 것"에 추가(입력이 본문이 아니라 기존 요약). Siri 항목에 음성 검색어를 명시.
- 2026-09-12 — 빌드 34 기준으로 갱신. 빠른 답장 발송(SMTP/Graph)·iCloud 키체인 개인화 키·Siri 브리핑·웹 출시 알림 신청을 "기기를 떠나는 것" 표에 추가. 깨우기 신호기와 iCloud 동기화가 현재 빌드에서 꺼져 있음을 명시. 기기 백업 한계 추가.