|   Engineering Technical Brief
Architecture & Integration Guide Confidential — Internal Engineering Only

port-mailroom : 전사 사내외 메일 수집/발송 통합 게이트웨이

개별 메일함 연동 강결합 해소, KMS 자격증명 커스터디 격리, 실시간 SNS 이벤트 전파 및 404 인가 정책

Author / Architect
@mkhwang (TOMS 플랫폼 셀)
Target Audience
TOMS-server 및 사내 전사 개발팀
Current Version
v1.0 (Production / Dev Active)
Dev Environment
Swagger API Docs
문의 & 관리자 권한 요청

01 왜 port-mailroom을 만들었는가? (Background & Value)

기존에는 사내 여러 서비스(TOMS-server, FMS 등)가 메일 기반의 수집 및 알림 기능을 구현하기 위해 각각 독립적으로 IMAP이나 Google OAuth와 결합되어 있었습니다. 이러한 개별 결합은 토큰 만료 관리 비용 증가, 중복 수집 부하 발생, 보안 유출 위협(평문 저장 등)을 가져왔습니다.

port-mailroom은 이러한 복잡한 메일 연동 체계를 전사 공용의 단일 수집/발송 게이트웨이로 격상하여, M2M 연동과 AWS SNS 이벤트 전파라는 단일화된 인터페이스로 메일 데이터를 수집하고 발송할 수 있도록 돕습니다.

AS-IS : 개별 서비스의 메일함 직결합 Legacy IMAP/OAuth
  • 자격증명 파편화: 각 서비스마다 Access/Refresh Token을 분산 관리 및 평문 보관
  • 수집 부하 중복: 동일 메일에 대해 여러 시스템이 개별 스케줄러를 돌려 API 쿼터 소진
  • 보안 정책 일관성 부족: 스팸 차단, 메일 열람 로깅 등 중앙 통제 불가
  • 연동 복잡도: 메일 서버 장애 시 각 서비스가 개별적으로 재시도 및 오류 복구(Fall-back) 구현
TO-BE : mailroom 게이트웨이 단일 진입 Gateway Hub
  • KMS 커스터디 격리: 토큰은 게이트웨이 외부 KMS에만 격리되어 E2E 보안 극대화
  • 단일 수집 & SNS Fan-out: 한 번만 수집하고 AWS SNS로 필요한 모든 서비스에 전파
  • 자동화된 프로비저닝 (JIT): 도메인 기반의 테넌트 자동 매칭으로 관리자 개입 불필요
  • 초고속 원문/첨부파일 SSOT: 서비스별 중복 적재 없이 Presigned URL로 즉각 단건 조회
🔐
1. Token Custody Isolation
자격증명 관리는 mailbox 모듈이 KMS와 결합하여 전담합니다. 수집기조차 단기 액세스 토큰만 받아 사용하므로 토큰 유출 원천 차단.
2. SNS Event-Driven
메일이 수신되면 내부 event_outbox를 거쳐 SNS 토픽으로 발행됩니다. 사내 시스템은 SQS로 이벤트를 받아 즉시 후속 비즈니스를 트리거합니다.
🛡️
3. Centralized Policy
게이트웨이에서 스팸 차단 규칙(Message Block Rules)을 중앙 집행하므로, 소비자들은 순도 높은 비즈니스 메일만 수신할 수 있습니다.

02 핵심 아키텍처 원칙 (Core Architecture)

◈ MAILROOM GATEWAY END-TO-END ARCHITECTURE ◈
1. 사내 연동 서비스 Consumers
📦 TOMS-server
선적 서류 접수, B/L 파싱, 파트너 커뮤니케이션
🎫 CS / Helpdesk
문의 메일 인입 감지 및 티켓팅 시스템 연계
🔔 Notification Svc
메일 발송 실패 및 재인증(Re-auth) 알림
2. port-mailroom 코어 CORE SSOT
⚡ API & M2M Auth Guard
단건 조회 • 첨부파일 Presigned URL 발급
⚙️ Sync & Outbox Worker
메일 동기화 • Block Rule 적용 • Outbox 릴레이
🗄️ Core Modules (Postgres)
identity • mailbox • message • admin
3. AWS 이벤트 전파 Event-Driven
📢 AWS SNS Topic
mailroom-events (신규 메일 인입 브로드캐스트)
📬 SQS Queues
소비자별 필터링 구독 (mail.message.received)
4. 외부 연동 주체 Providers
📧 Google Workspace
OAuth 2.0 및 Gmail API 기반 동기화
🔐 AWS KMS
Refresh Token 암호화 키 분리 격리 보관

🔄 3대 핵심 데이터 파이프라인 (Data Flows)

FLOW 1 JIT 프로비저닝 및 연동 권한 획득 흐름
Identity & Mailbox
Step 1
ID/도메인 판별 (JIT)
사용자 로그인 시 @domain.com을 바탕으로 적절한 테넌트 자동 매칭 및 프로비저닝
Tenant Match
Step 2
Google OAuth 인가
mailbox 모듈을 통해 Google 연동 동의 및 토큰 교환
OAuth 2.0
Step 3
토큰 KMS 암호화 보관
Refresh Token은 AWS KMS로 암호화 후 격리 보관 (평문 노출 제로)
KMS Custody
Step 4
M2M Client 권한 위임
TOMS-server 등은 Admin을 통해 특정 Tenant 접근 권한(Grant) 획득
Admin Grant
FLOW 2 메일 수집 및 이벤트 Fan-Out 흐름
Sync & Event-Driven
Step 1
Sync Worker 동작
단기 Access Token만 수령하여 Gmail API 등 외부 Provider에서 메일 Fetch
Scheduler
Step 2
차단 정책(Block Rule)
운영자가 지정한 발신자, 키워드 차단 규칙에 매칭될 경우 수집 건너뜀
Block Policy
Step 3
Outbox & SNS 발행
메일 수집 완료 후 event_outbox를 거쳐 AWS SNS로 이벤트 발행
AWS SNS
Step 4
사내 SQS 비동기 소비
사내 연동 시스템들이 SQS 이벤트를 수신하여 비즈니스 트리거 가동
SQS Consumer
FLOW 3 메일 원문 및 첨부파일 직접 조회 (SSOT)
M2M SSOT Fetch
Step 1
M2M 권한 기반 데이터 조회
클라이언트가 이벤트 내 apiHref를 활용하여 게이트웨이에 메타 조회
M2M GET
Step 2
접근 통제 (MessageAccessPolicy)
해당 메일의 Tenant가 클라이언트 Grant 범위 내인지 엄격 검증
Auth Policy
Step 3
302 Presigned URL 발급
Egress 부하 방지를 위해 원문(Raw)이나 첨부파일 요청 시 S3 Presigned URL 응답
HTTP 302
Step 4
안전하고 빠른 다운로드
시스템 개입 없이 발급된 URL을 통해 S3에서 즉각 대용량 첨부파일 다운로드 완료
S3 Direct
💡
핵심 설계 포인트: 대용량 데이터는 큐(Queue)에 적재하지 않습니다
MailMessageReceivedEvent 페이로드에는 본문 내용이나 첨부파일 데이터가 포함되지 않습니다. 이는 SNS 256KB 크기 제한을 준수하고, 큐 브로드캐스트로 인한 민감 정보 평문 유출을 막기 위함입니다. 이벤트는 상태 전이만 알리며(포인터 역할), 실제 원문과 첨부파일은 Egress API(Presigned URL)를 통해 인증된 클라이언트가 Fetch합니다.

03 사내 개발자 연동 가이드 (Integration Steps)

STEP 1
PortLogics IdP M2M 인증 및 권한(Grant) 등록
Scope: mail:read

연동 서비스는 client_credentials 방식을 사용합니다. TOMS-server 등은 단일 Client ID로 자신이 담당하는 화주들의 Tenant ID들을 Admin API를 통해 Grant 받아야 합니다.

M2M Token Request BASH / cURL
# PortLogics IdP에서 Access Token 발급
curl -X POST https://id.portlogics.kr/oauth2/token \
  -u "CLIENT_ID:CLIENT_SECRET" \
  -d "grant_type=client_credentials"

# M2M 계정에 Tenant Grant 등록 (운영자 Admin API 요청 필요)
# mkhwang@portlogics.com 문의
STEP 2
AWS SNS/SQS 이벤트 구독 설정
Topic: mailroom-events

메일이 게이트웨이에 수집되면 즉시 SNS 토픽 mailroom-events로 발송됩니다. 연동 서비스의 SQS Queue에 다음 Filter Policy를 적용하여 구독하세요.

SQS Filter Policy JSON
{
  "eventType": ["mail.message.received"],
  "direction": ["INBOUND", "OUTBOUND"] // 선택적 필터링
}

SNS Payload 규격 (snake_case 컨버전 적용)

mail.message.received Payload JSON
{
  "tenant_id": "tnt_a1b2c3d4",
  "event_type": "mail.message.received",
  "message_id": "msg_f9e8d7c6",
  "thread_id": "thr_11223344",
  "mailbox": "forwarding@portlogics.com",
  "from": "partner@vendor.com",
  "subject": "[긴급] 선적 서류 송부의 건",
  "has_attachment": true,
  "direction": "INBOUND",
  "internal_date": "2026-08-24T03:00:00.000Z",
  "api_href": "/messages/msg_f9e8d7c6"
}
STEP 3
Egress API를 활용한 메일 원문/첨부파일 다운로드
GET /messages/{id}

이벤트 수신 후 상세 내용이 필요할 때 호출합니다. (게이트웨이 Base URL https://dev-mailroom.portlogics-server.com/api/v1 사용)

GET /messages/{id} HTTP REQUEST
curl -X GET https://dev-mailroom.portlogics-server.com/api/v1/messages/msg_f9e8d7c6 \
  -H "Authorization: Bearer M2M_TOKEN"

대용량 다운로드 처리 (302 Redirect)
본문 EML(원문)과 첨부파일은 호출 즉시 S3 Presigned URL로 HTTP 302 리다이렉트됩니다. 클라이언트 HTTP 모듈에서 Redirect를 허용(Follow)하도록 설정해야 합니다.

S3 Presigned URL Egress Paths PATHS
GET /messages/{id}/raw
// 반환: HTTP 302 Location: https://s3.amazonaws.com/...

GET /attachments/{attachment_id}
// 반환: HTTP 302 Location: https://s3.amazonaws.com/...

04 주요 이벤트 표준 규격 (Published Language)

Event Type 설명 및 트리거 시점 주요 처리 로직
mail.message.received 신규 메일(INBOUND) 또는 발송 사본(OUTBOUND) 게이트웨이 수집 완료 TOMS 서류 자동 분류, CRM 티켓 생성 트리거
mailbox.needs_reauth 특정 메일함의 Google Refresh Token 만료 또는 연동 해제 발생 감지 담당자에게 연동 갱신 안내 알림 발송
mailbox.connected 메일함 최초 연동 및 JIT 프로비저닝 완료 수집 스케줄러 등록 및 초기 상태 세팅

05 운영 정책 및 FAQ

Q. 권한이 없는 메일을 조회하면 403이 아닌 왜 404가 응답되나요?
MessageAccessPolicy에 의해 클라이언트가 가진 Tenant Grant 범위를 벗어나는 데이터 접근은 존재 노출 금지 원칙에 따라 엄격히 404 Not Found 처리됩니다. 이는 타 화주의 메일 존재 여부를 악의적으로 유추하는 행위를 원천 차단하기 위한 보안 스펙입니다.
Q. 스팸 메일을 연동 서비스 단에서 별도로 필터링해야 하나요?
아닙니다. port-mailroom 게이트웨이 코어의 Message Block Rules(운영자 단독 차단 규칙)에 의해 스팸, 악성 도메인, 차단 키워드가 포함된 메일은 수집 파이프라인에서 자동 차단되며 SNS 이벤트 자체가 발행되지 않습니다. 연동 서비스는 순도 높은 비즈니스 메일만 수신하게 됩니다.
Q. 게이트웨이를 통해 메일을 보낼 수도 있나요 (Outbound)?
현재 v1 규격은 "수집(Ingestion)" 파이프라인에 집중되어 있습니다. 게이트웨이를 통한 단일 SMTP 메일 발송 Egress 기능(Outbound 처리 모듈)은 Phase 6b/8a 로드맵에 계획되어 있으며, 추후 API가 오픈될 예정입니다.