회원 탈퇴 시스템
문서 정보
- 작성일: 2026-04-08
- 최종 업데이트: 2026-04-08
- 버전: v1.1.0
회원 탈퇴는 즉시 삭제가 아닙니다. 탈퇴를 요청하면 14일간의 유예기간이 주어지고, 이 기간 내에 언제든 마음을 바꿔 철회할 수 있습니다. 14일이 지나면 데이터가 정리되며, 이후 30일간은 같은 계정으로 재가입할 수 없습니다.
목차
- 왜 이렇게 만들었나?
- 탈퇴 타임라인
- Phase 1: 탈퇴 요청
- Phase R: 탈퇴 철회
- Phase 2: 데이터 정리
- Phase 3: 재가입 차단 해제
- 사용자 경험 시나리오
- 데이터 처리 분류
- 스케줄러
- FAQ
왜 이렇게 만들었나?
탈퇴를 즉시 처리하면 다음과 같은 문제가 생깁니다:
| 문제 | 설명 |
|---|---|
| 실수로 탈퇴 | 버튼 한 번으로 모든 데이터가 사 라짐 |
| 악용 | 탈퇴 후 바로 재가입하여 프로모션 중복 수령 |
| CS 대응 불가 | 데이터가 사라져서 복구 요청에 대응 불가 |
이를 방지하기 위해 유예기간과 재가입 차단을 도입했습니다.
탈퇴 타임라인
| 구간 | 기간 | 설명 |
|---|---|---|
| 유예기간 | Day 0 ~ 14 | 서비스 이용 차단, 탈퇴 철회 가능 |
| 데이터 정리 | Day 14 | 개인정보 익명화, 불필요 데이터 삭제 |
| 재가입 차단 | Day 14 ~ 44 | 동일 계정으로 재가입 불가 |
| 재가입 가능 | Day 44 이후 | 새 계정으로 가입 가능 |
Phase 1: 탈퇴 요청
사용자가 탈퇴를 요청하는 순간 일어나는 일입니다.
무엇이 바뀌나요?
| 항목 | 변경 내용 | 이유 |
|---|---|---|
| 계정 상태 | PENDING_WITHDRAWAL | 유예기간임을 표시 |
| 로그인 | 전체 기기 로그아웃 | 서비스 접근 차단 |
| 구독 | 일시 정지 (SUSPENDED) | 유예기간 중 결제 방지 |
| 캐쉬 (톨) | 사용 차단 | 복구 시 원래대로 돌려야 하니까 |
| 공유 링크 | 비활성화 | 탈퇴 의사를 밝힌 사용자의 링크 노출 방지 |
| 댓글 | "삭제된 사용자" 표시 | 다른 사용자에게 노출 차단 |
이 단계에서는 데이터를 삭제하지 않습니다. 모든 데이터는 원본 그대로 보존됩니다. 사용자가 마음을 바꾸면 모든 것을 원래대로 되돌릴 수 있습니다.
Phase R: 탈퇴 철회
유예기간(14일) 내에 사용자가 마음을 바꿀 수 있습니다.
어떻게 철회하나요?
- SSO 로그인 시도 (카카오/애플)
- 서버가 "탈퇴 진행 중" 상태를 감지
- 서버가
provider + providerId를 확인한 뒤 Recovery Session 발급 - 앱이 Recovery Session으로 탈퇴 상태 조회
- 사용자가 "철회하기" 버튼 클릭
- 모든 것이 원래대로 복원
무엇이 복원되나요?
Phase 1에서 변경한 모든 항목이 원래대로 돌아갑니다.
| 항목 | 복원 내용 |
|---|---|
| 계정 상태 | ACTIVE |
| 구독 | ACTIVE (재결제 필요 없음) |
| 캐쉬 (톨) | 사용 가능 |
| 공유 링크 | 다시 활성화 |
| 댓글 | 다시 표시 |
철회 후에도 재로그인이 필요합니다. 토큰은 탈퇴 요청 시 삭제되었기 때문에 새로 발급받아야 합니다.
Recovery Session이 왜 필요한가요?
- 탈퇴 요청 시 기존 Access/Refresh Token과 서버 세션이 모두 삭제됩니다.
- 그래서 유예기간 중
GET /withdrawal/status,POST /withdrawal/cancel은 정상 Bearer 토큰이 아니라 Recovery Session으로만 접근합니다. - Recovery Session은 SSO 재시도 직후에만 발급되며,
provider + providerId로 식별된 동일 사용자에게만 연결됩니다. - Recovery Session은 탈퇴 상태 조회/철회 외의 API에는 사용할 수 없고, 철회 성공 시 즉시 폐기됩니다.
Phase 2: 데이터 정리
유예기간(14일)이 지나면 매일 새벽 2시에 자동으로 데이터가 정리됩니다.
개인정보 익명화
개인을 식별할 수 있는 정보는 DELETED-{timestamp}로 대체됩니다.
| 대상 | 처리 |
|---|---|
| 닉네임, 이메일 | DELETED-1712534400000 |
| 프로필 사진, 소개글 | 삭제 |
| SSO 연결 정보 | 익명화 |
| 본인인증 정보 (이름, 전화번호, 생년월일) | 익명화 |
| 결제 수단 | 카드 정보 삭제, PG사 빌링키 해지 |
| IP, User Agent (동의 이력, 변경 이력 등) | 익명화 |
영구 삭제되는 데이터
복구할 필요가 없는 데이터는 완전히 삭제됩니다.
| 대상 | 이유 |
|---|---|
| 사용자 설정 | 개인 설정, 보존 의미 없음 |
| 멤버십 권한 | 구독 취소로 무의미 |
| 잔액 (톨, 리워드) | 재화 소멸 |
| 알림 설정 및 수신 알림 | 개인 알림 |
| 디바이스 정보 | FCM 토큰 등 |
| 공유 접근 기록 | 접근/요청/활동 기록 |
| 운동 컨디션 프로필 | 개인 운동 기록 |
| 리워드 카운터 | 활동 카운터 |
보존되는 데이터
법적 의무 또는 비즈니스 추적이 필요한 기록은 보존됩니다.
| 대상 | 보존 이유 |
|---|---|
| 캐쉬/리워드 거래 이력 | 세무/회계 보존 의무 |
| 결제 이력 | 법적 보존 의무 |
| 본인인증 시도 이력 | 불변 감사 로그 |
| 활동/출석/카메라 해금 기록 | 불변 감사 로그 |
| CS 대화 이력 | 고객 지원 참조 |
| 마케팅 정책 적용 이력 | 재가입 시 중복 혜택 방지 |
재가입 차단 식별자 저장
개인정보를 익명화하기 전에 동일인을 식별할 수 있는 해시값을 저장합니다.
| 식별자 | 방식 | 용도 |
|---|---|---|
| SSO 계정 ID | SHA256 해시 | 같은 카카오/애플 계정으로 재가입 차단 |
| 전화번호 | SHA256 해시 | 다른 SSO로 우회 재가입 차단 |
원본 정보가 아닌 해시값만 저장합니다. 해시값으로는 원래 정보를 복원할 수 없습니다. 차단 기간이 끝나면 해시값도 삭제됩니다.
Phase 3: 재가입 차단 해제
데이터 정리 후 30일이 지나면 매일 새벽 3시에 만료된 차단 기록이 자동 삭제됩니다.
이후 해당 SSO 계정이나 전화번호로 다시 가입할 수 있습니다.
사용자 경험 시나리오
시나리오 1: 탈퇴 후 3일 만에 철회
시나리오 2: 탈퇴 후 복구 없이 완전 탈퇴
시나리오 3: 유예기간 만료 후 철회 시도
데이터 처리 분류
전체 43개 관련 테이블에 대한 처리 방식입니다.
Phase 1에서 변경 (철회 시 복원)
| 대상 | Phase 1 (요청) | Phase R (철회) |
|---|---|---|
| User | PENDING_WITHDRAWAL | ACTIVE |
| Token | 전체 삭제 | 재로그인 시 재발급 |
| WithdrawalRecoverySession | 없음 | SSO 재시도 시 생성 후 철회 성공 시 폐기 |
| Subscription | SUSPENDED | ACTIVE |
| GrainItem | INACTIVE | ACTIVE |
| ShareLink | 소프트 삭제 | 복원 |
| ScheduleComment | USER_DELETED | PUBLISHED |
| UserMarketingPolicyApplication | REVOKED | ACTIVE |
Phase 2에서 처리 (비가역)
| 분류 | 대상 수 | 설명 |
|---|---|---|
| 익명화 | 11개 | PII 제거, 구조 보존 (User, SSO, 결제 등) |
| 영구 삭제 | 12개 | 보존 불필요 (설정, 잔액, 알림 등) |
| 소프트 삭제 | 6개 | deletedAt 설정 (스케줄, 마이콕 등) |
| 보존 | 12개 | 법적/감사 목적 (거래 이력, CS 등) |
스케줄러
| 작업 | 실행 시간 | 주기 | 설명 |
|---|---|---|---|
| 만료 탈퇴 처리 | 매일 02:00 (KST) | 일 1회 | PENDING 상태이고 유예기간이 지난 요청 처리 |
| 재가입 차단 해제 | 매일 03:00 (KST) | 일 1회 | 30일이 지난 차단 기록 삭제 |