임시 메일 서비스의 내부: 이메일이 SMTP에서 화면까지 도달하는 여정

P

PureTempMail 팀

PureTempMail을 만들고 운영하는 엔지니어들

파이프라인을 공개하는 이유

일회용 이메일 서비스 대부분은 블랙박스입니다. 주소를 입력하면 이메일이 나타나지만, 그 사이에 무슨 일이 일어나는지는 알 수 없습니다. 누가 메시지를 보는지, 어디에 저장되는지, 정말 삭제되기는 하는지. '임시 메일 서비스를 믿어도 될까?'라는 질문에 대한 정직한 답은 전적으로 이런 세부 사항에 달려 있기에, 우리는 PureTempMail이 정확히 어떻게 작동하는지 구성 요소별로 문서화하기로 했습니다.

아래 내용은 모두 지금 이 순간 이 웹사이트를 운영하는 프로덕션 시스템에 대한 설명입니다. 이를 만들고 운영하는 팀이 직접 썼으며, 단순화된 마케팅 도식이 아닙니다. 트레이드오프를 택한 부분에서는 무엇을 왜 택했는지 밝힙니다.

발신 측 메일 서버가 SMTP 연결을 엽니다
핸드셰이크 검사 — 알 수 없거나 만료된 주소는 거부
수락된 메일은 메시지 큐에 적재
파싱과 엄격한 HTML 정화 처리
실시간으로 받은편지함에 푸시
수신 이메일 한 통의 여정 — 각 단계는 이 글에서 설명합니다.

1단계: SMTP 핸드셰이크 — 대부분의 쓰레기가 여기서 죽는다

인터넷의 모든 이메일은 SMTP 대화로 시작합니다. 우리의 경계에서는 강화된 SMTP 서버가 25번 포트에서 대기하며, 지원하는 발신자에게는 TLS가 활성화됩니다. 메일 서버가 접속해 수신자를 알려도 우리는 메시지를 무턱대고 받아들이지 않습니다.

RCPT TO 단계에서 — 메시지 내용이 단 1바이트도 전송되기 전에 — 수신자 주소를 활성 메일박스 목록과 대조합니다. 아무도 그 주소를 생성하지 않았거나 메일박스가 이미 만료되었다면, 연결은 그 자리에서 영구 SMTP 오류로 거부됩니다. 받아 놓고 조용히 버리는 일은 결코 없습니다. 이 조기 거부는 의도적인 설계 제약이기도 합니다. PureTempMail은 수신 전용이며, PureTempMail 주소로 이메일을 보낼 방법은 없습니다. 따라서 이 서비스는 스팸, 피싱, 괴롭힘에 악용될 수 없습니다.

2단계: 수신과 처리 사이의 큐

수락된 메시지는 SMTP 서버 안에서 파싱되지 않습니다. 대신 원본 이메일이 메시지 큐로 전달되고 SMTP 대화는 즉시 종료됩니다. 이유는 시간입니다. 발신 서버는 몇 초 안에 응답을 기대하지만, 첨부파일이 있는 큰 이메일의 파싱은 훨씬 오래 걸릴 수 있습니다. 두 단계를 분리하면 수신 메일이 폭증해도 타임아웃이나 메시지 유실이 발생하지 않습니다. 큐가 급증을 흡수하고 컨슈머가 차례로 처리합니다.

그 컨슈머는 원본 MIME 구조를 파싱해 제목, 발신자, HTML 및 일반 텍스트 본문, 첨부파일을 추출합니다. 첨부파일은 무작위로 생성된 이름으로 격리된 스토리지에 기록됩니다. 발신자가 정한 파일명을 그대로 쓰는 일은 결코 없으며, 이로써 경로 조작 공격이라는 공격 유형 전체가 차단됩니다. 메시지 메타데이터와 본문은 메일박스 만료 시간에 연결되어 데이터베이스에 저장됩니다.

3단계: 마케팅 메일이 당신을 추적하지 못하도록 HTML 새니타이징

HTML 이메일은 모든 받은편지함에서 가장 위험한 부분입니다. 전형적인 마케팅 메시지에는 원격 이미지(언제 어디서 열었는지 보고하는 추적 픽셀), 외부 스타일시트, 때로는 스크립트까지 들어 있습니다. 이메일이 표시되기 전에 우리는 엄격한 화이트리스트를 가진 HTML 새니타이저에 통과시킵니다. 스크립트는 제거되고 외부 리소스는 완전히 삭제되며 안전한 인라인 스타일만 살아남습니다. 추적 픽셀은 아예 로드되지 않으므로 발신자는 메시지가 열렸는지 알 수 없습니다.

이 글을 위해 제작한 모의 마케팅 이메일로, 원격 대표 이미지, 홍보용 행동 유도 버튼, 주석이 달린 숨겨진 1x1 추적 픽셀을 보여 줌
받은편지함에 흔히 도착하는 이메일을 보여 주기 위해 제작한 모의 마케팅 이메일: 원격 이미지, 행동 유도 버튼, 그리고 숨겨진 1×1 추적 픽셀(여기에 주석으로 표시). PureTempMail은 렌더링 전에 모든 원격 콘텐츠를 제거하므로 이 픽셀은 절대 로드되지 않습니다.

새니타이징된 결과는 브라우저의 완전히 샌드박스 처리된 iframe 안에서 렌더링됩니다. 악성 요소가 새니타이징을 통과하더라도 샌드박스가 주변 페이지, 메일박스 세션, 브라우저의 다른 어떤 것에도 접근하지 못하게 막습니다.

4단계: Server-Sent Events를 통한 실시간 전달

임시 메일 사이트 대부분은 페이지를 새로고침하게 하거나 몇 초마다 서버를 폴링합니다. PureTempMail은 브라우저에서 Server-Sent Events(SSE)로 수명이 긴 HTTP 연결 하나를 유지합니다. 컨슈머가 메시지 저장을 마치는 순간 그 연결로 이벤트가 푸시되고 이메일이 받은편지함에 나타납니다. 발신자가 보낸 뒤 보통 1~3초입니다. 2단계 인증 코드나 유효 기간이 짧은 활성화 링크처럼 시간에 민감한 흐름에서는 이 몇 초가 중요합니다.

연결은 주기적인 하트비트를 보내 끊어진 연결을 감지하고, 네트워크가 끊기면 클라이언트가 지수 백오프로 자동 재접속합니다. 같은 이벤트 스트림이 Android와 iOS 앱에도 동력을 공급하므로 모든 플랫폼이 새 메시지를 같은 순간에 봅니다.

5단계: 만료는 진짜 삭제를 의미한다

모든 메일박스는 화면에 보이는 카운트다운과 함께 생성되며 살아 있는 동안에는 연장할 수 있습니다. 만료되면 몇 분마다 실행되는 정리 작업이 이어받습니다. 먼저 첨부파일이 디스크에서 삭제되고, 그다음 메일박스와 모든 메시지의 데이터베이스 행이 연쇄적으로 제거됩니다.

보관소도, 만료된 메일의 백업도, 데이터를 보이지 않게 남겨 두는 '소프트 삭제' 플래그도 없습니다. 이는 정책이 아니라 아키텍처로 강제되는 데이터 최소화입니다. 더 이상 존재하지 않는 것은 넘겨줄 수도, 유출할 수도, 잃어버릴 수도 없습니다.

이것이 여정의 전부입니다. SMTP 핸드셰이크, 큐, 파서, 새니타이저, 푸시 이벤트, 그리고 삭제 작업. 각 단계는 10분만 쓸 주소가 그 후 당신에게 아무런 대가도 요구하지 않도록 존재합니다. 일회용 이메일 서비스가 당신의 메시지로 수상한 일을 하는 건 아닌지 궁금해진다면, 그 서비스에 파이프라인을 공개해 달라고 요청하세요. 우리는 방금 공개했습니다.

이 파이프라인의 짧고 비기술적인 버전을 원하시나요? PureTempMail의 작동 방식을 단계별로 확인하기