감사 결과#
| 기능 | 1차 개선 상태 | 기준·후속 |
|---|---|---|
| 가입·이메일 확인·최근 로그인 | Auth 원본을 사용자·관리자 화면에 표시 | profile에 복제하지 않음 |
| 표시 이름·온보딩 | 기존 공개 profile 유지 | 공개 최소 정보 |
| 이용정지 | 기존 비공개 상태 유지 | 탈퇴와 분리 |
| 탈퇴 생명주기 | active → withdrawal_requested → withdrawn 추가 |
요청과 완료 분리 |
| 탈퇴 요청·취소 | 마이페이지 제공 | 완료 계정은 RLS 차단 |
| 마케팅 이메일 | 기본 미동의, 현재값·버전·이벤트 추가 | 선택 동의 |
| 탈퇴와 마케팅 | 요청 transaction에서 철회, 취소 전 재동의 차단 | 광고 억제 |
| 관리자 조회 | 확인·탈퇴·마케팅 상태 추가 | 운영 필드만 노출 |
| 약관·개인정보 처리 근거 | 유형만 준비 | 실제 문구·근거 뒤 수집 |
| 삭제·익명화 | 미구현 | 보존표·백업·외부 처리자 필요 |
| 광고 메일 발송 | 미구현 | 수신거부·표시·통지·2년 확인 필요 |
| 마지막 제품 활동 | 미구현 | 로그인과 별도 이벤트 필요 |
| 알림 설정·데이터 export | 미구현 | 채널 정의·데이터 인벤토리 필요 |
| 기기·IP 로그인 이력 | 보류 | 보안 가치와 추가 수집 비교 |
확인된 법적 경계#
- 불필요한 개인정보는 파기하고 다른 법령상 보존 대상만 분리 관리한다. [2]
- 홍보 목적 동의는 다른 동의와 구분하며 거부를 이유로 서비스를 막지 않는다. [2]
- 광고성 이메일은 사전 동의가 원칙이며 철회 뒤 전송하지 않는다. 처리 결과 통지·2년 확인·광고 표시·수신거부도 필요하다. [3]
- 전자상거래 기록 보존기간은 적용 대상 거래가 생길 때 해당 기록에만 조건부 적용한다. [4]
이 문서는 제품·데이터 설계 기준이며 법률 자문이 아니다. 안전·개인정보 전체 경계는 안전·운영에서 관리한다.
1차 구현#
- Auth:
created_at,email_confirmed_at,last_sign_in_at을 파생해 표시한다. - 생명주기:
private.account_lifecycle에 상태별 시각 제약을 두고 요청·취소·완료 차단을 관리한다. - 동의:
private.user_consents현재값과private.user_consent_events변경 이력을 분리한다. - 무결성: 서버 고정 안내 버전, 사용자별 advisory lock과 event identity 순서를 사용한다.
- 탈퇴 연동: 요청 시 마케팅을 철회하고 요청 중 재동의와 무효 반복 전환을 차단한다.
- 화면: 마이페이지와 관리자 목록·상세에 필요한 상태만 표시한다.
- DB 권한: trigger-only
SECURITY DEFINER함수의 직접 클라이언트 실행을 제거한다.
관리자 경계는 관리자 사용자 관리, 인증 원본은 사용자 인증 기획을 따른다.
개선 로드맵#
- 공개 전 P0: 개인정보 처리방침·마케팅 문구 버전, 탈퇴 재인증과 진행 중 만남·분쟁 규칙을 확정한다. 삭제·익명화·분리보존 데이터 맵, 만료일, 백업·로그·외부 처리자 runbook을 만든다.
- 광고 발송 전: 원클릭 수신거부, 법정 표시, 처리 결과 통지와 2년 재확인을 구현한다.
- MVP P1: 실제 행동 기반
last_active_at, 운영 알림과 마케팅 분리, 필수 처리 근거 버전, 탈퇴 SLA·감사 로그와 데이터 내보내기를 추가한다. - 증거 뒤 P2: 로그인·기기 이력, 계정 연결·이메일 변경, MFA와 장기 미사용 정책을 검토한다.
추가 개인정보는 실제 보안·운영 문제를 해결할 때만 수집한다.
완료와 보류#
- 완료: 가입·확인·최근 로그인 표시, 탈퇴 요청·취소·완료 차단, 마케팅 동의·철회 이력, 관리자 조회
- 보류: hard delete, 법정 분리보존 자동화, 광고 메일 전송, 약관 버전 동의, 데이터 export
- 열지 않음: 삭제·보존 경계 없이 Auth 사용자를 즉시 삭제하는 버튼
삭제 전 스키마 맵: 탈퇴 삭제·보존 데이터 맵
관련 결정: 계정 데이터 기준 · 탈퇴 생명주기 상세 계획