알림 옵트인 증거: 채널별 동의 모델링
채널별 알림 옵트인 증거를 설정하고 명확한 증거를 저장하며, 변경과 감사를 사용자와 팀이 혼란스럽지 않게 처리하세요.

동의와 옵트인 증거가 실제로 의미하는 것
동의는 사용자가 특정 채널에서 특정 유형의 메시지를 받는 데 명확히 동의했다는 뜻입니다. 이 구분은 중요합니다. 이메일, SMS, 푸시 알림은 사용자, 통신사, 앱 플랫폼, 개인정보법 등에서 동일하게 취급되지 않습니다. 예를 들어 누군가는 배송 알림을 이메일로 환영할 수 있지만 마케팅 문자에 당황할 수 있습니다.
증거는 누군가 나중에 “왜 저에게 메시지를 보냈나요?”라고 물었을 때 보여줄 수 있는 것입니다. 옵트인 증거는 폼의 스크린샷이나 "사용자가 구독함"과 같은 모호한 메모가 아닙니다. 누가 동의했는지, 무엇에 동의했는지, 언제 발생했는지, 어떻게 발생했는지를 추적할 수 있는 기록입니다.
기록이 약하면 문제는 빠르게 드러납니다. 고객 지원은 예상치 못한 메시지를 설명하지 못하고, 환불이 늘며, 고객 신뢰가 떨어집니다. 불만이 확대되면 전송 시점에 동의가 존재했다는 것을 증명하기 어려워질 수 있는데, 그게 종종 가장 중요한 부분입니다.
동의는 팝업 이상의 의미입니다
많은 팀이 UI 프롬프트(체크박스, 토글, OS 권한 대화상자)에만 집중하고 그 뒤의 감사 로그를 잊습니다. 실제 목표는 신뢰와 추적 가능성입니다. 명확한 동의 모델은 인력이 바뀌거나 시스템이 이전되거나 사용자가 마음을 바꿔도 매번 올바르게 대응하기 쉽게 만듭니다.
실용적인 동의 기록은 다음 기본 질문들에 답할 수 있어야 합니다:
- 누가 동의했나(사용자 식별자와, 관련 있다면 이메일 주소나 전화번호 같은 목적지)
- 무엇을 동의했나(채널과 메시지 유형 또는 목적)
- 언제 발생했나(UTC 타임스탬프 또는 타임스탬프+시간대)
- 어떻게 발생했나(요청이 어디에 표시되었고 사용자가 무엇을 보았는지, 버전과 언어 포함)
- 분쟁 해결에 도움이 되는 컨텍스트(예: 앱/장치 정보 또는 IP 주소)
왜 이것이 신뢰를 쌓는가
사용자는 침해로 느껴지는 순간으로 기업을 판단합니다: 심야의 푸시, 놀라운 SMS 요금, 가입한 기억이 없는 이메일 등. 정확한 동의 이벤트를 불러와 평이한 언어로 설명할 수 있다면 티켓을 차분하고 일관되게 해결할 수 있습니다.
AppMaster 같은 플랫폼으로 구축할 경우, 동의를 처음부터 일급 데이터로 취급하는 것이 좋습니다: 구조화되어 검색 가능하고 실수로 덮어쓰기 어렵게 만드세요.
알림의 종류와 규칙이 다른 이유
모든 알림이 동일하게 취급되는 것은 아닙니다. 목적이 다르고 사람들에게 전달되는 방식이 다르기 때문입니다. 신뢰할 수 있는 옵트인 증거를 원한다면 메시지에 의도(intent) 와 채널 별로 라벨을 붙여 시작하세요.
트랜잭션(Transactional) vs 마케팅(plain meaning)
트랜잭션 메시지는 사용자가 한 행동에 의해 트리거되거나 서비스를 이용하기 위해 알아야 하는 내용입니다. 비밀번호 재설정, 영수증, 보안 알림, 계정 상태 변경 등이 이에 해당합니다. 사용자는 이를 기대하며, 차단하면 제품 경험이 깨질 수 있습니다.
마케팅 메시지는 홍보 목적입니다. 뉴스레터, 제품 제안, 복귀 캠페인, 최신 소식 안내 등이 해당합니다. 이러한 메시지는 선택적이어야 하며, 사용자는 핵심 기능에 대한 접근을 잃지 않고 ‘아니요’를 선택할 수 있어야 합니다.
실용적인 규칙: 메시지가 사용자가 요청한 것을 제공하는 데 필수적이면 트랜잭션일 가능성이 높고, 참여나 판매를 늘리기 위한 것이라면 마케팅입니다.
채널: 이메일, SMS, 푸시, 인앱
채널마다 동작이 다르므로 동의와 증거는 보통 채널별로 추적합니다. 글로벌 체크박스 하나로는 부족합니다.
이메일은 트랜잭션과 마케팅 둘 다에 자주 사용됩니다. 많은 제품은 트랜잭션 이메일을 기본 서비스 제공의 일부로 취급하지만, 마케팅 이메일은 일반적으로 명확한 "예"와 중단 방법이 필요합니다.
SMS는 더 침해적으로 느껴지고 일부 환경에서는 비용이 발생하며 엄격한 통신사 및 제공자 규칙이 적용됩니다. SMS 동의는 별도의 결정으로 다루세요.
푸시 알림은 기기 OS 권한과 사용자 설정에 의해 통제됩니다. 앱은 기기 토큰을 가질 수 있지만 사용자가 푸시를 비활성화할 수 있어 전송 가능한 내용이 달라집니다.
인앱 메시지는 제품 내부에 표시됩니다. 통신 규정보다 제품 UX 규칙을 더 따르는 경우가 많지만, 프로모션 배너 등에서는 사용자가 통제권을 기대합니다.
국가별 요구사항과 제공자 정책이 다르기 때문에 많은 팀은 간단한 기준을 선택합니다: 채널별로 마케팅에 대한 명확한 옵트인을 요구하고, 논쟁의 여지가 있는 항목은 신중히 문서화하세요.
"소프트 옵트인(Soft opt-in)"은 흔한 회색 지대입니다. 실무에서는 기존 관계(예: 이미 고객인 경우)에 의해 메시지를 보낼 수 있지만, 전용 마케팅 박스를 체크하지 않았을 수 있습니다. 이 경우에도 문서화가 중요합니다: 어떤 관계였는지, 무엇을 보냈는지, 사용자가 어떻게 옵트아웃할 수 있는지 기록하세요.
AppMaster로 구축한다면 모델을 단순하게 유지하세요: 사용자는 마케팅 이메일에는 옵트인하지만 SMS는 옵트아웃할 수 있고, 여전히 필수 트랜잭션 알림은 받을 수 있습니다. 이러한 분리는 규정 준수와 신뢰를 쉽게 만듭니다.
채널별 옵트인을 모델링하는 방법(저장해야 할 데이터)
신뢰할 수 있는 옵트인 증거를 원한다면 데이터 모델은 구체적이어야 합니다. "사용자가 동의함"만으로는 충분하지 않습니다. 동의는 채널(email, SMS, push)과 목적(marketing, product_updates, account_security)에 따라 달라집니다.
실용적인 접근법은 동의를 단일 레코드로 취급하지 않고 별도의 Consent 레코드로 만드는 것입니다. 한 사용자는 여러 동의 레코드를 가질 수 있고, 각 레코드는 단일 채널과 단일 목적에 매핑되어야 합니다.
문제를 피하는 최소 필드
다음과 같이 Consent 레코드를 시작하세요: user + channel + purpose + status. 그런 다음 나중에 이해하기 쉬운 세부 정보를 추가합니다.
대부분 제품에서 최소한 필요한 항목은:
- user_id
- channel (email, sms, push - 고정 목록으로 유지)
- purpose (marketing, product_updates, account_security - 고정 목록으로 유지)
- status (opted_in, opted_out, pending, unknown)
- opted_in_at / opted_out_at
나중에 추측을 피하려면 발생한 위치와 마지막 확인 시점도 캡처하세요:
- source (signup_form, settings_page, checkout, support_action)
- last_confirmed_at (정책 변경 후 유용)
동의 텍스트 스냅샷(사용자가 본 문구 증거)
동의는 단순한 클릭이 아닙니다. 특정 문구에 대한 동의입니다. 당시 보여준 정확한 문구를 가리키는 consent_text_version(또는 짧은 snapshot_id)를 저장하세요.
스냅샷은 메시지, 언어/로케일, 활성화된 기간 정도로 간단하게 유지하세요. 문구가 바뀌면 옛것을 편집하지 말고 새 버전을 만드세요.
간단한 예는 다음과 같습니다:
{
"user_id": "u_123",
"channel": "sms",
"purpose": "marketing",
"status": "opted_in",
"opted_in_at": "2026-01-25T10:15:00Z",
"source": "checkout",
"consent_text_version": "sms_mkt_v3",
"last_confirmed_at": "2026-01-25T10:15:00Z"
}
AppMaster로 구축하면 Consent와 ConsentTextSnapshot 모델에 자연스럽게 매핑되고 Business Process Editor의 간단한 로직으로 처리할 수 있습니다. 핵심 목표는 일관성입니다: 모든 채널과 목적이 동일한 구조를 따르도록 하여 리포팅과 감사가 뒤죽박죽되지 않게 하세요.
무엇이 증거로 인정되며 무엇을 캡처해야 하는가
"증거"는 나중에 두 가지 질문에 답할 수 있게 하는 모든 것입니다: 사용자가 무엇에 동의했나, 어떻게 동의했나. 옵트인 증거를 위해서는 구체적이고 타임스탬프가 있으며 실제 사용자 행동에 연결된 기록이 필요합니다(단순히 "consent = true"가 아님).
먼저 동작 자체를 저장하세요. 동의가 체크박스, 토글, 또는 더블 옵트인 링크로 주어졌다면 상호작용과 사용자가 본 정확한 문구(또는 버전 ID)를 저장합니다. 스크린샷은 확장성이 떨어지므로 동의 복사/버전 라벨이 더 실용적입니다.
나중에 그 순간을 재현할 수 있도록 충분한 세부를 캡처하세요:
- 동작 타입(체크박스 체크, 토글 온, 확인 링크 클릭 등)
- UTC 타임스탬프
- 채널과 목적
- 동의 텍스트 버전 또는 정책/버전 식별자
- 페이지나 화면 이름 및 언어
기술적 컨텍스트는 신중히 추가하세요. 분쟁 해결에 도움이 되지만 개인정보 위험을 높입니다. 웹에서는 IP와 유저 에이전트가 적절할 때 유용할 수 있습니다. 모바일에서는 이미 식별 모델의 일부인 장치 ID를 고려하되 "혹시 몰라서" 추가 식별자를 수집하지 마세요.
제공자를 통해 전송한다면 그들의 식별자도 보관하세요. 제공자 메시지 ID(이메일, SMS, 푸시)는 불만이나 전송 성공성 조사 시 특정 동의 레코드가 특정 전송에 사용되었음을 보여주는 데 도움이 됩니다.
마지막으로, 무엇을 저장하지 않을지 결정하세요. 좋은 증거가 된다고 해서 모든 것을 수집해야 하는 것은 아닙니다. 템플릿으로 충분한 경우 전체 메시지 내용을 보관하지 말고 관련 없는 장치 데이터는 피하세요. AppMaster로 흐름을 구축할 경우 증거 필드를 민감하게 취급하고 접근을 제한해 적절한 역할만 감사 세부를 볼 수 있게 하세요.
단계별: 동의 및 증거 흐름 설정하기
무엇에 대해 허락을 구할지 먼저 결정하세요. 동의는 단순한 "알림 예/아니요"가 아닙니다. 사람들은 영수증은 원하지만 프로모션은 원하지 않을 수 있습니다. 알림 목적을 평이한 언어로 적고 각 목적을 사용할 채널에 매핑하세요.
동의 화면은 혼합된 하나의 프롬프트가 아니라 채널별로 설계하세요. 각 화면은 무엇이 전송되는지, 나중에 어떻게 변경할 수 있는지 알려줘야 합니다. 문구는 구체적으로 하세요: "주문 영수증을 이메일로 받기"는 "트랜잭션 메시지"보다 명확합니다.
실용적인 흐름 예시는 다음과 같습니다:
- 목적을 정의하고 어느 것이 옵트인이 필요한지 결정(예: 마케팅 vs 영수증)
- 적절한 순간에 요청(예: 체크아웃 시 영수증, 온보딩 후 팁)
- 안전한 기본값 선택(마케팅은 꺼짐; 서비스 제공에 필요한 것만 켜기)
- 사용자가 토글을 바꾸면 즉시 이벤트 레코드 쓰기(누가, 무엇이 변경되었는지, 언제, 어디서)
- 발송 경로에 동의 확인을 넣어 관리자 도구와 자동 작업도 우회하지 못하도록 하기
그 이벤트 레코드가 나중에 동의를 증명해주는 근거입니다. 은행 영수증처럼 다루세요: 추가만 허용하고, 이후 수정하기 어렵게 만드세요. AppMaster에서는 빠른 확인을 위한 현재 상태 테이블과 모든 업데이트마다 감사를 생성하는 Business Process 패턴을 많이 사용합니다.
출시 전에 옵트아웃과 엣지 케이스를 테스트하세요. 웹, 모바일, 계정 삭제 흐름에서 설정 변경 결과가 동일해야 합니다. 특히 주의할 항목:
- 한 기기에서 옵트아웃했는데 다른 기기에서는 로그인된 상태
- 전화번호나 이메일 변경
- 앱 재설치(푸시 토큰 변경)
- 게스트 체크아웃과 로그인된 사용자
- 삭제되거나 비활성화된 계정(전송 중단, 하지만 필요한 증거 보관)
옵트아웃, 변경, 계정 수명주기 처리
옵트인은 업무의 절반에 불과합니다. 사람들은 마음을 바꾸고, 기기를 바꾸고, 이메일 접근을 잃거나 지원에 설정 수정을 요청합니다. 옵트아웃이 어렵다면 사용자는 빠르게 알아차리고, 당신의 “증거”는 의심받게 됩니다.
옵트아웃을 옵트인만큼 쉽게 만드세요. 사람들이 기대하는 곳에 두세요: 알림 설정, 마케팅 이메일 푸터, SMS의 경우 필요한 경우 명확한 STOP 지침. "지원에 문의" 같은 추가 단계 뒤에 숨기지 마세요.
확인 메시지를 보낼 때는 최소한으로 하고 법적 요구가 있는 경우에만 사용하세요. "구독 해지되었습니다" 한 통의 이메일이면 충분합니다. 반복적인 "정말 확실합니까?"는 스팸처럼 느껴질 수 있습니다. SMS의 경우 STOP 회신 후 단일 확인이 흔히 기대됩니다. 푸시에서는 조용한 인앱 상태 변경으로 충분한 경우가 많습니다.
계정 수명주기는 많은 동의 시스템이 깨지는 지점입니다. 미리 계획하세요:
- 로그아웃된 사용자: 로그인하지 않은 상태에서 이메일로 구독 해지를 하면 그 이메일 주소에 대해 기록하세요, 세션에만 기록하지 마세요.
- 삭제된 계정: 삭제 요청은 존중하되, 이후 실수로 다시 추가되지 않도록 허용되는 최소한의 차단(Do-not-contact) 기록을 남기세요.
- 병합된 계정: 동의가 자동으로 이전된다고 가정하지 마세요; 프라이버시 친화적인 선택으로 충돌을 해결하세요.
- 기기 변경: 새 폰은 새 푸시 토큰을 만듭니다; 토큰은 기술적 데이터로 취급하고 사용자의 푸시 동의가 우선 규칙입니다.
보관 규칙을 문서화하고 일관되게 적용하세요. 불만, 감사, 환불 요구를 처리할 만큼 충분히 오래 유지하되 필요 이상으로 개인 데이터를 보관하지 마세요. 사용자 데이터를 삭제해야 한다면 어떤 데이터를 익명화(예: 이메일 해시)하면서 이벤트 기록을 유용하게 유지할지 결정하세요.
지원 주도 변경에는 명확한 내부 프로세스가 필요합니다. 누가 동의를 편집할 수 있는지 제한하고, 이유 코드(예: "사용자 채팅 요청")를 요구하며 누가 언제 변경했는지 기록하세요. AppMaster에서는 작은 PostgreSQL 테이블로 consent events와 support actions를 모델링하고 Business Process로 변경을 적용하며 매번 감사 항목을 쓰는 패턴을 자주 사용합니다.
신뢰와 감사 흔적을 망치는 일반적인 실수
많은 팀이 동의 토글을 추가하고 나중에 편법으로 이를 깨뜨립니다. 결과는 예측 가능합니다: 사용자는 속았다고 느끼고, 옵트인 증거는 유지되지 않습니다.
한 가지 흔한 함정은 동의를 단일 글로벌 예/아니오로 취급하는 것입니다. 이메일, SMS, 푸시는 기대치와 법적 규칙이 다릅니다. marketing_ok=true 같은 단일 플래그는 사용자가 동의하지 않은 채널로 메시지를 보내기 쉽게 만듭니다.
또 다른 신뢰 파괴 요인은 불분명한 선택 설계입니다. 미리 체크된 박스, 작은 고지문, 여러 목적을 묶는 컨트롤("제품 업데이트 및 오퍼")은 사용자를 혼란스럽게 합니다. 데이터베이스는 "동의함"으로 표시할지 몰라도 지원 받은 메시지는 전혀 다른 이야기를 할 수 있습니다.
신뢰와 증거를 모두 망치는 실수는 주로 다음과 같습니다:
- 최신 상태만 저장하고 역사를 삭제함
- 사용자가 승인한 정확한 동의 문구(버전)를 저장하지 않음
- 채널, 타임스탬프, 출처 없이 "사용자가 옵트인함"만 로깅함
- 동의 확인을 건너뛰는 수동 캠페인 허용
- 데이터베이스를 편집해서 잘못된 설정을 "수정함"으로써 발생 기록을 지움
전형적인 실패 사례: 사용자가 온보딩 중에 푸시를 활성화했는데 나중에 설정에서 마케팅 SMS를 끄고 원치 않는 문자를 받았다고 불평합니다. 시스템이 옛 기록을 덮어썼다면 사용자가 무엇을 보았고 언제 옵트아웃했는지를 보여줄 수 없습니다. 더 나쁘게는 SMS 동의가 존재했다는 것을 증명할 수도 없습니다.
동의를 재무 기록처럼 취급하세요: 빠른 확인을 위한 현재 상태는 따로 두되 과거는 잃지 마세요. 도움이 되는 가드레일은 간단합니다: 채널·목적별로 분리, 동의 텍스트 ID와 로케일 저장, 모든 전송 경로가 동일한 동의 검사 단계를 통과하도록 강제, 기존 레코드를 편집하지 말고 새 이벤트를 기록하세요.
AppMaster로 구축한다면 동의 이벤트를 별도 테이블로 모델링하고 공유 Business Process에서 검사를 강제해 자동 알림과 운영자 행동이 동일한 규칙을 따르도록 하세요.
출시 전에 빠르게 확인할 항목
실제 알림을 보내기 전에 동의 흔적을 결제 테스트하듯 확인하세요. 누가 어떤 채널에 어떤 문구로 언제 옵트인했는지 설명할 수 없다면 신뢰를 추측에 맡기는 것입니다.
각 채널(email, SMS, push)에 대해 사용자가 옵트인한 순간과 위치를 보여줄 수 있어야 합니다. "위치"는 특정 화면이나 폼 이름과 그것이 signup, settings, checkout, support 중 어디인지 의미해야 합니다.
또한 동의 문구를 재현할 수 있어야 합니다. "marketing=true"만 저장하는 것으로는 부족합니다. 당시 표시된 텍스트 버전(또는 템플릿 ID)과 언어를 저장하세요. 문구가 바뀌더라도 이전에 동의한 사용자에 대해 옛 문구를 보여줄 수 있어야 합니다.
대부분 문제를 잡아내는 간단한 사전 출시 체크리스트:
- 각 옵트인에 대해 타임스탬프, 소스(웹, iOS, Android), UI 위치를 보여줄 수 있다.
- 당시 표시된 정확한 동의 문구와 언어를 검색할 수 있다.
- 최신 옵트아웃이 모든 곳에 반영되며(큐에 쌓인 작업 포함) 우선한다.
- 지원팀이 단일 사용자 뷰에서 2분 이내에 "왜 이걸 받았나요?"에 답할 수 있다.
- 동의 로그는 편집 불가능하며 접근은 권한된 역할로 제한된다.
드릴을 해보세요: 동료에게 웹에서 옵트인하게 하고 모바일에서 옵트아웃하게 한 뒤 지원팀에게 설명을 요청하세요. 답이 원시 테이블이나 여러 도구를 뒤져야 한다면 사용자도 같은 마찰을 느낄 것입니다.
AppMaster로 구축한다면 동의 증거를 별도 데이터 모델과 프로세스로 취급하세요. 전용 동의 로그 엔터티와 지원/감사용 내부 뷰를 제공하면 특히 접근 권한을 잠그는 경우 큰 도움이 됩니다.
예시 시나리오: 한 사용자, 세 채널, 변경되는 선택들
Mina가 웹사이트에서 주문 추적을 위해 계정을 만듭니다. 회원가입 중 이메일, SMS, 푸시에 대해 별도 선택을 봅니다. 앱을 설치하면 주문 업데이트용 푸시에 동의하고, 마케팅 이메일은 끄고, SMS는 선택하지 않습니다.
일주일 뒤 모바일 앱을 설치하고 로그인합니다. 앱은 OS 레벨의 푸시 권한을 요청하고 그녀는 허용합니다. 많은 팀이 여기서 혼동합니다: OS 권한은 비즈니스 동의와 같지 않습니다. 두 가지를 모두 기록해야 감사 시점에 명확합니다.
Mina의 이야기가 시간이 흐르며 어떻게 변하는지와 지원팀이 깨끗한 타임라인으로 무엇을 봐야 하는지 예시로 정리합니다.
타임라인과 증거 스냅샷
- 웹 회원가입(1일차)
웹에서 그녀가 선택한 것(또는 선택하지 않은 것)과 요청 컨텍스트를 저장합니다.
- 모바일 설치와 푸시 권한(8일차)
기기 토큰과 OS 권한 결과를 Mina의 계정에 연결해 저장하고, 인앱에서 보여준 정확한 프롬프트 버전을 기록합니다.
- 전화번호 변경(20일차)
배송 조정용으로 새 전화번호를 추가합니다. 이는 새로운 SMS 목적지로 처리하고 새 SMS 옵트인을 요구하세요. 이전 번호에서 동의를 자동 이월하지 마세요.
- SMS 해지(35일차)
그녀가 STOP 회신을 하거나 설정에서 SMS를 끕니다. 옵트아웃 이벤트를 저장하고 즉시 발송을 중지합니다.
증거 레코드의 예시
아래는 Mina가 “나는 SMS에 동의한 적이 없다”고 말할 때 지원팀이 읽을 수 있는 단순화된 감사 로그 예시입니다.
[
{
"ts": "2026-01-02T10:14:22Z",
"user_id": "u_123",
"channel": "email",
"purpose": "marketing",
"action": "no_opt_in",
"capture": {"surface": "web_signup", "form_version": "signup_v3"},
"evidence": {"ip": "203.0.113.10", "user_agent": "Chrome"}
},
{
"ts": "2026-01-09T08:03:11Z",
"user_id": "u_123",
"channel": "push",
"purpose": "order_updates",
"action": "opt_in",
"capture": {"surface": "ios_app", "prompt_version": "push_prompt_v2"},
"evidence": {"device_id": "d_77", "os_permission": "granted", "push_token": "..."}
},
{
"ts": "2026-01-21T16:40:05Z",
"user_id": "u_123",
"channel": "sms",
"purpose": "delivery_updates",
"action": "opt_in",
"capture": {"surface": "account_settings", "form_version": "sms_optin_v1"},
"evidence": {"phone": "+15551234567", "verification": "code_confirmed"}
},
{
"ts": "2026-02-05T09:12:44Z",
"user_id": "u_123",
"channel": "sms",
"purpose": "delivery_updates",
"action": "opt_out",
"capture": {"surface": "sms_reply", "keyword": "STOP"},
"evidence": {"phone": "+15551234567"}
}
]
AppMaster에서는 Consent 이벤트를 Data Designer에 모델링하고 사용자가 토글을 탭하거나 코드 확인을 하거나 앱이 권한 결과를 받을 때마다 Business Process를 통해 이를 추가하는 패턴을 자주 사용합니다. 중요한 것은 지원팀이 날짜, 표면, 정확한 선택을 보고 추측이 아닌 사실을 말할 수 있어야 한다는 점입니다.
다음 단계: 제품 워크플로에 통합하기
동의를 체크박스로 취급하지 말고 제품 기능으로 다루세요. 알림 옵트인 증거를 유지하는 가장 쉬운 방법은 메시지 전송, 지원 티켓 처리, 감사 실행에 사용하는 동일한 워크플로에 동의를 포함하는 것입니다.
먼저 현재 선호도와 역사적 증거를 분리하는 최소 모델을 만드세요. 대부분 제품에서 잘 작동하는 단순 스키마:
- Users (신원 및 계정 상태)
- ConsentPreferences (채널·목적별 현재 온/오프)
- ConsentEvents (모든 변경: 타임스탬프와 컨텍스트 포함)
- MessageSends (각 전송 시도, 당시의 동의 결정 포함)
누가 무엇을 볼 수 있는지 결정하세요. 동의 증거는 IP, 유저 에이전트, 전화번호 등 민감한 정보를 포함할 수 있으니 역할 기반 접근으로 잠그세요. 지원팀은 동의 타임라인 뷰가 필요하지만 내보내기를 할 수 있는 권한은 더 적은 그룹만 가져야 합니다.
지원팀이 빠르게 답할 수 있게 "왜 이 사용자에게 연락했나?"를 빠르게 답해주는 내부 뷰를 만드세요. 사용자별 검색, 채널 필터링, 타임라인 내보내기가 쉬워야 합니다.
그다음 동의 확인을 자동화하세요. 모든 전송은 동일한 로직을 호출해야 합니다: 최신 ConsentPreferences를 확인하고 유효한 ConsentEvent가 있는지 확인한 뒤, 전송이 차단되었을 때도 MessageSends에 결정을 기록하세요.
이미 AppMaster를 사용 중이라면 실용적인 패턴은 Data Designer에 동의 테이블을 두고 모든 전송 전에 공유 Business Process에서 동의 게이트를 실행하는 것입니다. 이렇게 하면 웹 앱, 백엔드 작업, 네이티브 모바일 앱에서 규칙이 일관되게 유지됩니다.
간단한 규칙은 시간이 지나도 유효합니다: 동의 검사 없이 알림을 보낼 수 있다면 언젠가 버그가 나옵니다.
자주 묻는 질문
동의는 사용자가 특정 채널에서 특정 유형의 메시지를 받는 데 명확히 동의했다는 의미입니다. 옵트인 증거는 누가, 무엇에 동의했는지, 언제 발생했는지, 어떻게 캡처되었는지 보여줄 수 있는 증거입니다.
채널과 목적별로 동의를 별도로 추적하세요. 기대치와 규정이 다르기 때문에 한 사용자의 한 레코드당 채널·목적별로 구분하는 간단한 모델(사용자 × 채널 × 목적)이 안전합니다.
기본 동의 레코드는 사용자 식별자, 관련 목적지(이메일 또는 전화번호), 채널, 목적, 현재 상태, 상태 변경 시점 등을 포함해야 합니다. 캡처 소스와 동의 텍스트 버전을 추가하면 나중에 결정 이유를 설명할 수 있습니다.
동의 시 사용자에게 보여준 정확한 문구와 언어를 가리키는 동의 텍스트 버전이나 스냅샷 식별자를 저장하세요. 문구가 바뀌면 이전 것을 덮어쓰지 말고 새 버전을 만드십시오.
OS 권한은 기기가 알림을 허용했는지를 보여줄 뿐, 사용자가 특정 목적(예: 마케팅 vs 주문 업데이트)에 동의했다는 비즈니스적 동의는 아닙니다. OS 권한은 기술 상태로 기록하고, 비즈니스 목적에 대한 자체 동의도 별도로 보관하세요.
마케팅은 기본값을 꺼짐으로 설정하고, 온보딩 후나 설정 화면처럼 적절한 순간에 명확히 물어보세요. 설명은 구체적이고 단순해야 합니다(예: “주문 영수증을 이메일로 받기”처럼).
옵트아웃 이벤트를 즉시 기록하고 발송 경로가 어떤 경우에도 최신 옵트아웃을 확인하도록 만드세요(대기 중인 작업 포함). 사용자가 지원팀에 연락하지 않아도 쉽게 옵트아웃할 수 있게 하고, 지원팀이 명확한 타임라인을 볼 수 있어야 합니다.
새 이메일이나 전화번호는 새로운 목적지로 취급하고 SMS 같은 채널에는 새 옵트인을 요구하세요. 오래된 값에서 동의를 자동으로 옮기지 마세요—증거는 전송한 정확한 목적지와 일치해야 합니다.
빠른 확인을 위해 현재 상태 테이블을 유지하되 모든 변경을 타임스탬프·컨텍스트와 함께 기록하는 첨부형 이벤트 로그도 보관하세요. 과거 이벤트를 편집하거나 삭제하면 “왜 이 메시지를 받았나?”에 답할 수 없게 됩니다.
동의는 구조화된 데이터로 모델링하고 모든 토글 변경을 항상 하나의 백엔드 흐름을 통해 기록하여 감사 이벤트를 생성하세요. AppMaster에서는 Consent, ConsentTextSnapshot, ConsentEvents를 Data Designer에 구성하고, 전송 전 공유 Business Process에서 동의 게이트를 강제하는 패턴을 사용합니다.


