일회용 받은편지함
계정도 키도 없는 사람을 위한, 실제로 동작하는 주소. 그날 안에 사라집니다.
일회용 받은편지함이란
호출자는 이 설치본이 소유한 도메인의 주소를 요청해 몇 분간 지켜보고, 도착한 것을 읽고, 버립니다. 확인 코드, "이 폼이 실제로 무엇을 보내는가"라는 질문, 그리고 5년 뒤에도 쓸 주소에 엮고 싶지 않은 가입을 위해 존재합니다.
- 받기만 하고 그 외에는 아무것도 하지 않습니다. 발송은 없습니다. 받은편지함에는 보낼 신원이 없고, 이 아홉 개 호출 중 어느 것도 메시지를 내보내지 않습니다.
- 기본 임대 시간은 60분이며, 한 시간씩 24시간까지 늘릴 수 있습니다.
- 메시지 50개를 담으며 도착할 때마다 셉니다. 가득 찬 받은편지함에 도착한 메일은 큐에 쌓이지 않고 버려지며, 하나를 삭제해도 자리가 생기지 않습니다.
- 임대가 끝나면 메일은 삭제됩니다. 숨기는 것도 보관하는 것도 아닙니다. 행은 일주일 더 남는데, 느린 발신자가 아직 재시도하는 동안 주소가 다시 발급되지 않게 하기 위해서입니다.
- 이 중 어느 것도 메일함에 닿지 않습니다. 일회용 메시지는 자체 테이블에 있고, 이 경로의 어떤 쿼리도 실제 메일함에 닿을 수 없습니다.
이것들은 이 사이트의 무료 도구가 쓰는 것과 같은 호출이므로, 그 페이지가 할 수 있는 일은 당신의 코드도 할 수 있습니다. API는 그 페이지로는 안 되는 경우, 예를 들어 실행마다 새 주소를 원하는 테스트 스위트를 위해 있습니다.
주소는 자격 증명이 아니다
일회용 주소는 발급되는 순간 가입 폼에 입력됩니다. 거기서부터 To: 헤더를 타고, 발신자의 로그를 거쳐, 반대편에 있는 CRM으로 들어갑니다. 주소를 아는 것만으로 메일을 읽을 수 있다면 이 도구는 설계상 발급한 모든 받은편지함을 유출하게 되고, 그것도 호출자가 거리를 두려던 바로 그 상대에게 유출하게 됩니다.
그래서 받은편지함을 만들면 두 번째 값이 함께 돌아옵니다. token이며, 32바이트 난수를 oe_inbox_에 base64url 43자를 붙인 형태로 표현한 것입니다. 그 한 번의 응답에만 나타나고 다른 어디에도 나타나지 않습니다. 행에는 키가 적용된 해시만 남으므로, 지원 요청으로도 데이터베이스 덤프로도 복구할 수 없습니다. 토큰을 잃으면 받은편지함을 잃은 것이며, 남의 메일을 읽는 자격 증명에는 그것이 올바른 결과입니다.
# 1. Mint one. This is the only response that carries a token.curl -s -X POST "$OE/temp-mail/inboxes" -H "Content-Type: application/json" -d '{}' # 2. Keep it, and read with it.export INBOX="Authorization: Bearer oe_inbox_kQ8v…"curl -s "$OE/temp-mail/inboxes/tinb_9c2f…/messages" -H "$INBOX"oe_live_나 oe_test_ API 키를 이 경로들에 보내면 밋밋한 401이 아니라 invalid_credential_type으로 거부됩니다. 여기서는 두 종류의 자격 증명이 하나의 호스트와 하나의 헤더를 공유하므로, "인증되지 않음"이라고만 하면 어느 쪽이 잘못됐는지 추측하게 만들 것입니다.
임대와 연장
이 장르의 이름이 된 10분이 아니라 한 시간입니다. 10분은 확인 코드에는 충분하지만, 이것들이 쓰이는 나머지 절반에는 모자랍니다. 다음 날 아침에 다시 메일을 보내는 체험판이나, 첫 시도가 타임아웃돼 두 번 작성한 폼 같은 경우입니다. 생성 시 ttlMinutes로 1부터 1440까지 다른 값을 요청할 수 있습니다. 범위를 벗어난 숫자는 조용히 조정되지 않고 422로 거부됩니다. 요청하지 않은 만료 시각은 이미 계획에 반영해 버린 시각이기 때문입니다.
POST /temp-mail/inboxes/{id}/extend는 지금이 아니라 만료 시각에 한 시간을 더하므로, 일찍 연장해도 남은 시간을 낭비하지 않습니다. 23번까지 동작하며, 두 상한 중에서는 받은편지함이 생성된 순간부터의 하루가 더 빡빡합니다. 이미 거기까지 도달한 임대는 연장을 아무리 적게 썼더라도 더 살 시간이 없습니다. 모든 받은편지함 응답의 extensionsLeft가 둘 다 반영해 세므로 클라이언트가 버튼을 비활성화할 수 있고, 0이면 호출은 409 extension_limit으로 답합니다.
만료된 받은편지함은 만료되는 즉시 인증을 멈춥니다. 청소 작업을 기다리지 않고 토큰이 404로 답합니다. 메일을 삭제하는 것은 청소 작업이며 매시 크론으로 돕니다. DELETE /temp-mail/inboxes/{id}는 같은 삭제를 요청 즉시 수행합니다.
상한들
이 모두는 레이트 리미터가 아니라 카운트된 행입니다. 이 코드베이스에는 쓸 수 있는 리미터가 없고, 있지도 않은 방어를 암시하는 것보다 그렇게 말하는 편이 쓸모 있습니다. 상한은 피해가 생길 자리, 즉 발급과 저장에 놓여 있습니다.
| 상한 | 값 | 도달하면 일어나는 일 |
|---|---|---|
| 임대 | 60분, 24시간까지 연장 가능 | 409 conflict_error / extension_limit |
| 받은편지함당 메시지 | 50 | 이후 메일은 문 앞에서 버려집니다. 반송은 쓰이지 않고, 큐에도 쌓이지 않으며, 메시지를 삭제해도 자리가 돌아오지 않습니다. |
| 발급된 받은편지함 | 호출자당 시간당 6개, 하루 30개 | 429 rate_limit_error / too_many_inboxes |
| 저장되는 본문 | 2 MB | 메시지에 truncated: true가 붙고, 나머지는 사라집니다. |
| 첨부 바이트 | 각 8 MB | content가 null이 되고 메타데이터는 유지되는데, 이는 빈 파일과 같지 않습니다. |
발급 상한은 클라이언트 IP의 키 적용 해시를 기준으로 세며, 파기된 받은편지함도 계속 세므로 하나를 버려서 다른 하나를 얻을 수는 없습니다. 남의 프록시 뒤에서는 전달 헤더가 위조될 수 있는데, 이는 자격 증명의 구멍이 아니라 이 상한의 알려진 약점입니다. 여기서 그 값으로 무언가를 인가하지는 않습니다.
여기에 없는 것
아직 출시되지 않음해 보고 알게 되는 것보다 미리 듣는 편이 낫습니다:
- 어떤 형태로도 발송은 없습니다. 일회용 받은편지함에는 보낼 연결이 없고, 하나를 붙이면 익명의 인증되지 않은 엔드포인트가 오픈 릴레이가 됩니다.
- 이름 변경은 없습니다. 주소를 바꾸려면 두 번째 받은편지함을 만들어야 합니다. 제자리에서 이름을 바꾸면 누른 즉시 예전 로컬 파트가 풀리고, 이미 전송 중이던 확인 메일이 다음에 그것을 발급받은 사람에게 전달될 것입니다.
- 규칙, 필터, 전달, 웹훅, AI는 없습니다.
spam은 메시지에 붙은 플래그일 뿐 아무것도 그에 따라 행동하지 않았습니다. 아무것도 정리해 넣지 않았고, 여기서 요약되거나 임베딩되는 것도 없습니다. - 반송은 없습니다. 풀 도메인으로 온 메일 중 살아 있는 일회용 받은편지함도, 운영자가 만든 주소도 가리키지 않는 것은 일부러 조용히 버립니다. 공개된 주소 생성기는 사전 공격을 끌어들이는데, 공격이 주장하는 반환 경로로 전달 보고서를 쓰면 이 설치본이 백스캐터 발신원이 됩니다.
- 도메인이 설정되어 있지 않으면 서비스도 없습니다.
TEMP_MAIL_DOMAINS가 비어 있으면GET /temp-mail/domains는 빈 목록으로 답하고 받은편지함 생성은 503temp_mail_unavailable로 답합니다. 풀 도메인으로의 수신 전달은 실제 도메인에서 처음부터 끝까지 확인된 적이 없습니다.
설치본을 운영한다면, 도메인 설정하기
목록은 설정입니다. TEMP_MAIL_DOMAINS가 지정한 것이 곧 나눠주는 것입니다. DNS를 자동화하는 것은 없으므로, 다섯 단계 중 넷은 사람이 등록기관에서 해야 합니다.
- 이 용도의 도메인을 등록하십시오. 낯선 사람들에게 나눠줘도 되는 도메인을 쓰십시오. 그 도메인의 모든 주소가 평판을 공유하며, 그래서 선택기는 첫 도메인을 채우는 대신 새 받은편지함을 풀 전체에 무작위로 퍼뜨립니다.
- 앱의 설정 → 도메인에서 추가하십시오. 그러면 발송 신원이 생성되고 게시할 DNS 레코드가 표시됩니다.
- MX, SPF, DKIM,
_openemail-challengeTXT 레코드를 등록기관에 게시하십시오. 검증은 실시간 DNS를 읽고 크론에서 다시 확인하며, 검증된 도메인만 제공됩니다. - 검증된 도메인을 서버의
TEMP_MAIL_DOMAINS에 쉼표로 구분해 추가하십시오. 목록에 오르기 전까지는 워크스페이스의 평범한 도메인일 뿐입니다. - catch-all을 켜 두십시오. 일회용 주소를 만들지 않고도 존재하게 하는 것이 바로 이것입니다. 어떤 로컬 파트로 온 메일이든 일반적인 수신자 조회보다 먼저 받아들여 되읽기 때문에, 풀 도메인에는 주소 행이 전혀 쓰이지 않습니다. catch-all을 켜 두면 일회용 메일이 실제 메일함에 분류되기 시작합니다.
예약된 로컬 파트(postmaster, abuse, security를 비롯한 RFC 2142의 나머지)는 절대 일회용이 될 수 없고 대신 일반 메일함으로 떨어집니다. 자기 앞으로 온 악용 신고를 블랙홀에 넣는 풀 도메인은 어디에도 전달할 수 없게 되는 도메인입니다. 풀 도메인에 직접 만든 주소, 예를 들어 legal@이나 privacy@도 똑같이 동작합니다. 그 주소로 온 메일은 당신의 메일함에 도착하고, 누구도 그것을 일회용 주소로 발급받을 수 없습니다.