고객

회원 탈퇴

진행 중 거래를 먼저 확인하고 탈퇴를 확정해요.

v1 API 상세: 회원

회원의 탈퇴 가능 여부를 확인하고 탈퇴를 실행해요. 관리자가 고객을 삭제하는 DELETE /v1/users/:user_id와 다른 API예요. JWT 없이 가맹점 서버가 user_id로 회원을 지정할 수도 있으므로, 그 경우 쇼핑몰 서버가 먼저 본인임을 확인해야 해요.

탈퇴는 문서를 지우지 않는 soft 처리예요. 주문·적립 이력이 회원 ID를 참조하므로 개인정보만 마스킹하고 뼈대는 남겨요.

1탈퇴 안내 조회

GEThttps://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": "탈퇴 후 안내 문구"
}json
  • blockers — 진행 중인 일반 주문(order)과 구독(subscription)이 있으면 탈퇴할 수 없어요. 구매확정된 주문은 차단하지 않아요.
  • confirm_method — password면 현재 비밀번호를, phrase면 확인 문구를 받아요. 비밀번호가 없는 소셜 전용 계정이 phrase예요.
  • confirm_phrase — phrase 방식일 때 서버가 요구하는 문구가 함께 내려와요. 이 값을 화면에 그대로 보여주고 같은 값을 입력받아요.
  • retention_options — 회원이 명시적으로 골라야 해요. 화면에 하드코딩하지 말고 이 응답을 쓰세요.
  • rejoin_restriction — 탈퇴 후 재가입 제한 기간이에요. 몰 설정과 무관하게 최소 기간이 항상 적용돼요.

2탈퇴 실행

POSThttps://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"
}json

purge_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 사유 누락·허용하지 않는 사유
HTTP 442

Commerce v1의 unprocessable_entity는 표준 422가 아니라 442​​로 나가요. 기존 계약이라 이 API도 그대로 따릅니다.

본인 확인에 실패한 요청은 회원 데이터를 전혀 바꾸지 않아요.