영업을 넘겨받으면 고객에게 개인정보가 이전된다는 사실을 알려야 한다. 대상은 약 130만 명이고, 처음 받은 전제는 「대량 메일 발송 시스템을 새로 만들어야 한다」였다. 설계를 시작하며 넘겨받은 저장소를 열어 보니 그 전제가 틀렸다. 대량 발송 인프라는 이미 있었고, 없는 것은 이메일 채널 하나였다.
Table of contents
Open Table of contents
배경 — 이미 있던 대량 발송 인프라
넘겨받은 시스템에는 문자·알림톡·앱 푸시를 대량으로 보내는 알림 서비스가 있었다. NestJS API 와 BullMQ 워커 20종, Redis 큐 두 계통, Prisma 로 관리하는 발송 이력·성공 여부·응답 원문, 재시도와 발송 리포트, 오래된 이력 정리까지 갖춰져 있었고, GKE 에 배포돼 있었다. 빠진 것은 이메일 채널뿐이었다.
판단 — 새로 지을지, 채널 하나를 붙일지
선택지는 두 가지 방법이었다.
- 이메일 전용 대량 발송 시스템을 새로 짓는다
- 기존 큐와 워커·이력 구조에 이메일 채널(수신 요청·발송 기록 테이블과 Amazon SES 로 가는 워커)을 하나 더 붙인다
2번을 고른 이유는 큐·워커·이력·재시도·리포트가 이미 운영에서 검증됐기 때문이다. 새로 지으면 같은 것을 처음부터 다시 검증해야 하고, 통지에는 기한이 있다. 반면 2번은 기존 서비스의 구조와 배포 방식에 맞춰야 하는 제약을 받는다. 그 대가를 감수하고 2번을 골랐다. 발송 쪽의 DNS·SES 준비, 즉 SPF 에 SES 를 더하는 병합·DKIM CNAME 3개·DMARC·발송 도메인 검증·Configuration Set·SNS 반송 이벤트 알림은 먼저 끝내 두었다.
원인 — 발송 대상의 원천과 법적 근거
다음 결정은 누구에게 보내느냐였다. 데이터레이크에 고객 테이블이 여럿 있었지만 모두 현행이 아니었다. 가장 그럴듯한 테이블은 테이블 수정 시각이 바로 그날이라 최신처럼 보였는데, 데이터 작업일 최대값은 3.7개월 전이었다. 테이블을 다시 만든 날일 뿐 데이터는 오래된 것이었다. 그래서 원천은 실시간인 Realtime Database 의 고객 노드로 정했다. 메타데이터만 보고 원천을 고르면 넉 달 가까이 지난 명단으로 법정 통지를 보낼 뻔했다.
법적 근거도 조문으로 확인했다. 개인정보 보호법 제27조 ①항은 영업양도에 따른 이전을 양도인이 미리 알리게 하고, ②항은 양수인이 받았을 때 알리되 양도인이 이미 알렸으면 면제한다. 그래서 통지 주체는 양도인이 앞에 서는 명의로 정했다. 이 통지는 광고성 정보가 아니므로 정보통신망법 제50조의 사전 수신 동의 대상이 아니다. 수신 동의 여부와 무관하게 보내야 하고, 보내지 않는 쪽이 오히려 의무 위반이다. 연락처를 모르는 회원은 시행령 제29조 ②항에 따라 홈페이지 30일 이상 게재로 갈음한다. 다만 이 해석의 최종 확정은 법무 검토로 남겼다.
측정 — 대상은 130만이 아니었다
전수 집계로 센 실제 발송 대상은 1,325,065통이었다. 여기서 반드시 빼야 할 것이 있었다. 간편 로그인 회원 가운데 실제 메일함이 아닌 합성 주소가 6,432건 있었다. 이 주소로 보내면 전부 반송되고, 반송은 곧 발송 계정의 평판이 된다. 탈퇴 회원은 처리방침과 코드가 일치해 애초에 목록에 없었으므로, 「걸러 낸다」가 아니라 「구조적으로 없다」고 SES 소명에도 그렇게 적기로 했다. 이메일 수신 동의 필드는 실측해 보니 판정에 쓰면 안 되는 죽은 필드였고, 어차피 법정 통지라 판정에 쓸 이유도 없었다.
결과 — 구축 범위와 법적 위험
- 구축 범위. 「발송 시스템 신규 구축」이 「이메일 채널 하나 추가」로 줄었다. 검증된 큐·이력·재시도를 그대로 써서 통지 기한에 맞출 수 있게 됐다
- 법적 위험. 통지 주체·수신 동의와의 관계·연락처 없는 회원 처리를 조문으로 먼저 정해, 「누구 이름으로, 누구에게까지」를 발송 전에 닫았다
- 평판 위험. 합성 주소 6,432건을 대상에서 빼 확정적인 반송을 미리 없앴다. 남은 반송 위험은 실제 발송에서 다시 잰다
정리
- 「새로 만든다」는 전제는 넘겨받은 저장소를 열어 본 뒤에 확정한다. 빠진 것이 시스템이 아니라 채널 하나일 수 있다
- 원천은 테이블 수정 시각이 아니라 데이터의 최신 시점으로 고른다
- 법정 통지는 광고가 아니다. 통지 주체와 수신 동의의 관계를 조문으로 먼저 정한다
- 확정적으로 반송될 주소는 보내기 전에 뺀다. 반송률이 곧 발송 계정의 평판이다