v1 API 상세: 회원
회원의 탈퇴 가능 여부를 확인하고 탈퇴를 실행해요. 관리자가 고객을 삭제하는 DELETE /v1/users/:user_id와 다른 API예요. JWT 없이 가맹점 서버가 user_id로 회원을 지정할 수도 있으므로, 그 경우 쇼핑몰 서버가 먼저 본인임을 확인해야 해요.
탈퇴는 문서를 지우지 않는 soft 처리예요. 주문·적립 이력이 회원 ID를 참조하므로 개인정보만 마스킹하고 뼈대는 남겨요.
1탈퇴 안내 조회
https://api.bootapi.com/v1/users/me/withdrawal[Basic Auth](/server/authentication) + `Bootpay-User-JWT` 또는 가맹점 서버의 `user_id`필요 권한: user:user_me_withdrawal_detail
JWT가 없으면 조회 쿼리에 user_id(회원 ID 또는 external_uid)를 보내요. JWT와 다른 회원을 지정하면 403 USER_NOT_MATCH예요.
{
"withdrawable": false,
"blockers": [
{ "type": "order", "count": 2 }
],
"confirm_method": "password",
"retention_options": [
{ "retention_type": "immediate", "label": "바로 폐기", "description": "탈퇴 즉시 모든 개인정보가 삭제돼요" },
{ "retention_type": "year_1", "label": "1년 보관 후 삭제", "description": "문의·분쟁 대응을 위해 1년 보관 후 자동으로 삭제돼요" },
{ "retention_type": "year_3", "label": "3년 보관 후 삭제", "description": "3년 보관 후 자동으로 삭제돼요" }
],
"rejoin_restriction": { "days": 7 },
"guide_message": "탈퇴 안내 문구",
"guide_message_after": "탈퇴 후 안내 문구"
}jsonblockers— 진행 중인 일반 주문(order)과 구독(subscription)이 있으면 탈퇴할 수 없어요. 구매확정된 주문은 차단하지 않아요.confirm_method—password면 현재 비밀번호를,phrase면 확인 문구를 받아요. 비밀번호가 없는 소셜 전용 계정이phrase예요.confirm_phrase—phrase방식일 때 서버가 요구하는 문구가 함께 내려와요. 이 값을 화면에 그대로 보여주고 같은 값을 입력받아요.retention_options— 회원이 명시적으로 골라야 해요. 화면에 하드코딩하지 말고 이 응답을 쓰세요.rejoin_restriction— 탈퇴 후 재가입 제한 기간이에요. 몰 설정과 무관하게 최소 기간이 항상 적용돼요.
2탈퇴 실행
https://api.bootapi.com/v1/users/me/withdrawal[Basic Auth](/server/authentication) + `Bootpay-User-JWT` 또는 가맹점 서버의 `user_id`필요 권한: user:user_me_withdrawal
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
user_id |
String | 선택 | 회원 ID 또는 external_uid. secretKey 인증에서만 허용해요 |
reason |
String | 필수 | 탈퇴 사유. 서버가 허용하는 값만 받아요 |
retention_type |
String | 필수 | 조회 응답의 retention_options 중 하나 |
password |
String | 선택 | confirm_method가 password일 때 필수 |
confirm_phrase |
String | 선택 | confirm_method가 phrase일 때 필수 |
reason_text |
String | 선택 | 직접 입력 사유 |
JWT가 있으면 그 세션의 회원을 대상으로 해요. JWT 없이 user_id로 지정할 때는 쇼핑몰 서버에서 본인 확인을 마친 값을 사용해요.
{
"withdrawn": true,
"requires_login": true,
"purge_scheduled_at": "2027-09-21T00:00:00+09:00"
}jsonpurge_scheduled_at은 보관 기간이 끝나 완전 파기되는 시점이고, 바로 폐기를 고르면 null이에요.
탈퇴하면 모든 기기에서 로그아웃돼요
requires_login: true를 받으면 BFF는 세션 쿠키를 지워요. 다른 기기에 남아 있던 고객 JWT도 함께 무효가 돼요. 같은 JWT로 다시 요청하면 세션이 끊겨 401로 떨어져요.
확정 직전에 다시 확인해요
조회에서 withdrawable: true였더라도, 확정하는 트랜잭션 안에서 진행 중 주문·구독을 한 번 더 확인해요. 조회와 확정 사이에 새 주문이 생겼다면 탈퇴가 막혀요.
오류
| error_code | HTTP | 상황 |
|---|---|---|
USER_SESSION_INVALID (420) |
401 | JWT 누락·만료·탈퇴·다른 프로젝트 세션, 비회원(게스트) 세션 |
WITHDRAWAL_NOT_ENABLED |
442 | 몰이 탈퇴 기능을 쓰지 않음 |
WITHDRAWAL_BLOCKED_ACTIVE_ORDER |
442 | 진행 중 주문 |
WITHDRAWAL_BLOCKED_ACTIVE_SUBSCRIPTION |
442 | 진행 중 구독 |
WITHDRAWAL_CONFIRM_INVALID |
400 | 비밀번호·확인 문구 불일치 |
WITHDRAWAL_RETENTION_INVALID |
400 | 보관 옵션 누락·이상값 |
REQUIRED_PARAMETER_IS_MISSING (131) |
400 | 사유 누락·허용하지 않는 사유 |
Commerce v1의 unprocessable_entity는 표준 422가 아니라 442로 나가요. 기존 계약이라 이 API도 그대로 따릅니다.
본인 확인에 실패한 요청은 회원 데이터를 전혀 바꾸지 않아요.