계정 삭제
현재 로그인한 사용자의 계정을 삭제합니다.
계정 삭제 요청이 성공한 경우에만 메모리 세션과 저장된 토큰을 삭제합니다.
1. 계정 삭제 메서드 호출
WithdrawPlayerAsync
현재 로그인한 계정을 즉시 삭제하도록 요청합니다. 삭제한 계정은 복구할 수 없습니다. 계정에 연동한 모든 로그인 수단과 게스트 토큰이 함께 삭제되며, 유저네임 계정이 있으면 유저네임과 비밀번호도 삭제됩니다. 삭제한 뒤 같은 로그인 수단으로 다시 로그인해도 이전 계정은 복원되지 않고 새 Player ID가 발급됩니다.
사용자가 로그인한 상태에서 계정 관리 UI 등의 계정 삭제 버튼을 선택하면 이 메서드를 호출하세요.
Note
계정은 로그인 수단(게스트, 유저네임, Google 또는 Apple과 같은 외부 인증 제공자 등)과 무관하게 이 메서드로만 삭제합니다.
호출 파라미터
| 필드명 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| context | ApiCallContext | Optional | 호출 단위 설정 객체입니다. 멱등키·취소 토큰·요청 정책을 지정하며, 생략하면 기본값이 사용됩니다. |
호출 예시
요청 수행이 불가능한 공통 실패(Failure)의 결과 모델과 처리 원칙은 공통 오류 처리를 참조하세요.
using Hive.Axyl.Auth;
using Hive.Axyl.Core;
using UnityEngine;
IAuthService auth = HiveCore.Resolve<IAuthService>();
AuthWithdrawPlayerResult result = await auth.WithdrawPlayerAsync();
switch (result)
{
case AuthWithdrawPlayerResult.Success:
// 서버 계정 삭제 성공 → 로컬 정리(2~3단계)로 이어집니다.
break;
case AuthWithdrawPlayerResult.PlayerNotFound:
// 계정 정보를 찾을 수 없음 → 서버/제품 정책을 확인해 처리합니다.
break;
case AuthWithdrawPlayerResult.TokenRevokeFailed:
// 로그인 세션 폐기에 실패해 계정을 삭제하지 않음 → 저장한 인증 정보를 유지하고 다시 시도하도록 안내합니다.
// 세션이 이미 끝났다면 다시 로그인한 뒤 시도하도록 안내합니다.
break;
// 공통 실패 처리 (네트워크·서버 오류)
case AuthWithdrawPlayerResult.Failure failure:
HiveError err = failure.Problem;
Debug.LogError($"[{err.Code}] {err.Message} (trace: {err.TraceId})");
break;
// 안전망: 처리하지 않은 결과 및 알 수 없는 신규 결과(UnknownOutcome)
default:
Debug.LogWarning($"처리되지 않은 결과: {result.GetType().Name}");
break;
}
응답 데이터
성공 시 별도 반환 데이터가 없습니다.
응답 예시
응답 상태
AuthWithdrawPlayerResult의 응답 케이스는 switch 구문으로 처리하는 것을 권장합니다.
| 응답 케이스 | 설명 | 앱 클라이언트 대응 |
|---|---|---|
Success | 계정 삭제 요청이 정상 처리됨. 성공 응답에는 별도 데이터가 없습니다. | 아래 2단계와 3단계에서 메모리 세션과 저장 토큰을 삭제합니다. |
PlayerNotFound | 계정 정보를 찾을 수 없는 경우 | 서버와 제품 정책을 확인한 뒤 처리합니다. |
TokenRevokeFailed | 로그인 세션 폐기에 실패해 계정을 삭제하지 않은 경우 | 저장한 인증 정보를 유지하고 계정 삭제를 다시 시도하도록 안내합니다. 세션이 이미 끝났다면 다시 로그인한 뒤 시도하도록 안내합니다. |
AppIdMismatch | X-App-Id 헤더의 앱이 현재 토큰의 프로젝트에 속하지 않는 경우 | SDK 초기화 시 App ID 설정과 로그인한 계정의 프로젝트를 확인 |
InvalidGatewayContext | 인증 컨텍스트가 없거나 유효하지 않은 경우 | 세션 활성화로 세션을 등록했는지 확인 |
AppNotFound | 앱 정보를 찾을 수 없는 경우 | 콘솔의 앱 등록 상태 확인 |
TerminateService | 서비스가 종료된 앱인 경우 | 서비스 운영 상태 확인 |
UnknownOutcome | 이 SDK 버전이 알지 못하는 신규 결과 | 로깅 후 보수적으로 처리 |
Failure | 공통 Failure입니다. 필수 파라미터 누락·형식 오류(invalid_parameter), 필수 필드 누락(missing_field), X-App-Id 헤더 누락(missing_app_id)도 여기로 분기하며 원인은 Failure.Problem.ExternalCode에 담깁니다. 공통 오류 처리를 참조하세요. | 공통 오류 처리 기준에 따라 처리 |
2. 메모리 세션 삭제
ClearSession
WithdrawPlayerAsync() 호출이 성공하면 ISessionManager.ClearSession()을 호출해 앱 클라이언트의 메모리 세션을 초기화합니다. 모든 세션 필드를 기본값으로 되돌리고, 정리 후 OnSessionExpired 이벤트를 발생시킵니다. 활성 세션이 없으면 아무 동작도 하지 않습니다.
호출 파라미터
| 필드명 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| 없음 | - | - | 파라미터가 없습니다. HiveCore.Resolve<ISessionManager>()로 세션 매니저를 얻어 호출합니다. |
호출 예시
응답 데이터
성공 시 별도 반환 데이터가 없습니다.
응답 예시
응답 상태
ClearSession()은 결과 객체를 반환하지 않습니다. 활성 세션이 없으면 아무 동작도 하지 않습니다.
3. 저장된 토큰 삭제
DeleteAsync
ISecureStorage.DeleteAsync()를 호출해 보안 저장소에 저장한 항목을 키 단위로 삭제합니다. 저장소 인스턴스는 보안 저장소 모듈 등록에서 AddSecureStorage로 등록한 뒤 HiveCore.TryResolve<ISecureStorage>(out var storage)로 얻습니다. Unity 에디터처럼 보안 저장소가 등록되지 않는 환경에서는 false를 반환하므로, 이때는 지울 항목도 없어 삭제를 건너뜁니다. 자동 로그인 또는 재로그인을 위해 저장한 토큰은 계정 삭제 직후 이 메서드로 삭제합니다.
호출 파라미터
| 필드명 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| request | SecureStorageDeleteRequest | Required | 삭제할 항목 요청 |
| cancellationToken | CancellationToken | Optional | 취소 토큰입니다. 생략하면 기본값이 사용됩니다. |
SecureStorageDeleteRequest
| 필드명 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
Key | string | Required | 삭제할 저장 항목의 키. 앱이 토큰을 저장할 때 정한 값입니다(SDK가 정하지 않음). |
호출 예시
using Hive.Axyl.Core;
using Hive.Axyl.Storage;
using UnityEngine;
// 보안 저장소가 없는 환경(에디터 등)에서는 지울 것도 없으므로 건너뜁니다.
if (!HiveCore.TryResolve<ISecureStorage>(out var storage))
{
return;
}
SecureStorageDeleteResult result =
await storage.DeleteAsync(new SecureStorageDeleteRequest { Key = "hive.axyl.auth.access_token" });
switch (result)
{
case SecureStorageDeleteResult.Success:
// 삭제 완료(해당 키가 없던 경우에도 Success로 처리됩니다).
break;
case SecureStorageDeleteResult.AccessDenied:
// 저장소 접근이 거부됨 — 디바이스 보안 설정/권한을 확인합니다.
break;
case SecureStorageDeleteResult.DataCorrupted:
// 저장 데이터가 손상됨 — 전체 정리(ClearAsync)를 고려합니다.
break;
// 안전망: 처리하지 않은 결과 및 알 수 없는 신규 결과(UnknownOutcome)
default:
Debug.LogWarning($"처리되지 않은 결과: {result.GetType().Name}");
break;
}
응답 데이터
성공 시 별도 반환 데이터가 없습니다.
응답 예시
응답 상태
| 응답 케이스 | 설명 | 앱 클라이언트 대응 |
|---|---|---|
Success | 삭제 완료. 해당 키가 존재하지 않던 경우에도 Success입니다. | 다음 키 삭제로 진행합니다. |
AccessDenied | 저장소 접근이 거부됨 | 디바이스 보안 설정/권한을 확인합니다. |
DataCorrupted | 저장 데이터가 손상됨 | 전체 정리(ClearAsync)를 고려합니다. |
Failure | 공통 Failure입니다. 공통 오류 처리를 참조하세요. | 공통 오류 처리 기준에 따라 처리 |
UnknownOutcome | 알 수 없는 신규 결과 | 안전망으로 로깅 후 보수적으로 처리합니다. |
전체 흐름 예시
계정 삭제, 메모리 세션 삭제, 저장된 토큰 삭제를 순서대로 처리하는 예시 코드입니다. 계정 삭제가 성공한 경우에만 메모리 세션과 저장 토큰을 함께 정리합니다.
Note
이 예시는 HiveCore.TryResolve<ISecureStorage>(out var storage)로 보안 저장소를 가져옵니다. Unity 에디터에서는 보안 저장소가 등록되지 않아 HiveCore.Resolve<ISecureStorage>()가 RegistrationNotFoundException을 발생시키기 때문입니다. 지원 범위는 보안 저장소 모듈 등록을 참조하세요.
using Hive.Axyl.Auth;
using Hive.Axyl.Core;
using Hive.Axyl.Storage;
using System.Threading;
using System.Threading.Tasks;
using UnityEngine;
public class DeleteAccountFlow
{
private readonly IAuthService _auth = HiveCore.Resolve<IAuthService>();
private readonly ISessionManager _session = HiveCore.Resolve<ISessionManager>();
public async Task<bool> DeleteAccountAsync(CancellationToken ct = default)
{
var result = await _auth.WithdrawPlayerAsync();
switch (result)
{
case AuthWithdrawPlayerResult.Success:
_session.ClearSession(); // 메모리 세션 제거 → OnSessionExpired 발생
await DeleteStoredTokensAsync(ct);
return true;
case AuthWithdrawPlayerResult.PlayerNotFound:
Debug.LogWarning("계정 정보를 찾을 수 없습니다. 서버/제품 정책을 확인하세요.");
return false;
case AuthWithdrawPlayerResult.TokenRevokeFailed:
// 로그인 세션 폐기에 실패해 계정을 삭제하지 않음 → 저장한 인증 정보를 유지하고 다시 시도하도록 안내합니다.
return false;
case AuthWithdrawPlayerResult.Failure failure:
HiveError err = failure.Problem;
Debug.LogError($"[{err.Code}] {err.Message} (trace: {err.TraceId})");
return false;
default:
Debug.LogWarning($"처리되지 않은 결과: {result.GetType().Name}");
return false;
}
}
private async Task DeleteStoredTokensAsync(CancellationToken ct)
{
// 보안 저장소가 없는 환경(에디터 등)에서는 지울 것도 없으므로 건너뜁니다.
if (!HiveCore.TryResolve<ISecureStorage>(out var storage))
{
return;
}
// 아래 키는 앱이 토큰을 저장할 때 정한 값의 예시입니다(SDK가 정하지 않음).
await storage.DeleteAsync(new SecureStorageDeleteRequest { Key = "hive.axyl.auth.access_token" }, ct);
await storage.DeleteAsync(new SecureStorageDeleteRequest { Key = "hive.axyl.auth.refresh_token" }, ct);
await storage.DeleteAsync(new SecureStorageDeleteRequest { Key = "hive.axyl.auth.player_id" }, ct);
await storage.DeleteAsync(new SecureStorageDeleteRequest { Key = "hive.axyl.auth.expires_at" }, ct);
await storage.DeleteAsync(new SecureStorageDeleteRequest { Key = "hive.axyl.auth.guest_token" }, ct);
await storage.DeleteAsync(new SecureStorageDeleteRequest { Key = "hive.axyl.auth.guest_player_id" }, ct);
}
}
이 예제는 HiveCore.TryResolve<ISecureStorage>(out var storage)로 가져온 저장소를 사용합니다. 계정 삭제가 완료되면 ClearSession()을 호출한 직후 저장한 토큰 키를 명시적으로 삭제합니다.
저장 항목과 계정 삭제 시 처리 기준
ISessionManager는 메모리 세션만 관리합니다. 계정 삭제가 완료되면 계정으로 다시 세션을 복구할 수 없으므로, 계정 삭제 시에는 메모리 세션 정리와 저장소 정리를 분리하지 않고 함께 처리해야 합니다.
| 저장 항목 | 목적 | 계정 삭제 시 권장 처리 |
|---|---|---|
accessToken, refreshToken, playerId, expiresAtSec | 자동 로그인 세션 복구 | 계정 삭제 직후 삭제합니다. |
deviceKey | 기기 식별 | 유지합니다. |
guestToken, guestPlayerId | 게스트 세션 식별 | 계정 삭제 직후 삭제합니다. |
구현 체크리스트
- 계정 삭제 호출 전 사용자에게 되돌릴 수 없는 작업인지 안내
- 계정 삭제 성공 여부를 확인한 뒤 메모리 세션과 저장 토큰을 정리
PlayerNotFound응답의 후속 처리는 서버와 제품 정책을 확인한 뒤 결정- 자동 로그인 기능을 사용하는 경우, 계정 삭제 직후 저장 토큰이 남지 않도록 검증
guestToken,guestPlayerId가 계정 삭제 직후 삭제되는지 검증