여러 계정 간 전환
한 기기에서 여러 계정을 번갈아 쓰려면 계정마다 인증 정보를 따로 보관했다가, 사용자가 고른 계정의 세션으로 바꿔야 합니다. Hive Axyl SDK의 ISessionManager는 메모리에 세션 하나만 유지하므로, 계정을 바꾸면 이전 세션은 새 세션으로 대체됩니다.
세션을 복원하는 절차는 자동 로그인과 같습니다. 다른 점은 인증 정보를 계정별로 나누어 저장하고, 사용자가 고른 계정을 복원 대상으로 지정한다는 것입니다.
Note
ISecureStorage는 키 하나에 값 하나를 저장하고 불러오며, 저장된 키를 모두 나열하는 기능은 제공하지 않습니다. 지금 어떤 계정을 보관 중인지 기록하는 목록은 앱 클라이언트에서 직접 관리하세요.
1. 현재 계정의 인증 정보 저장
계정을 바꾸기 전에 지금 로그인한 계정으로 다시 돌아올 수 있도록 인증 정보를 보관합니다. 사용자가 로그인을 마친 직후나 계정 전환 화면에 들어오는 시점에 저장하세요.
계정별로 키를 나누고, 보관 중인 Player ID 목록을 별도의 키에 함께 기록합니다.
using Hive.Axyl.Core;
using Hive.Axyl.Storage;
// 보안 저장소는 에디터처럼 지원하지 않는 환경에서는 등록되지 않으므로 TryResolve로 확인합니다.
if (!HiveCore.TryResolve<ISecureStorage>(out var storage))
{
return; // 저장소가 없으면 계정별 인증 정보를 보관하지 않습니다.
}
ISessionManager session = HiveCore.Resolve<ISessionManager>();
SessionSnapshot snapshot = session.GetSnapshot();
long playerId = snapshot.PlayerId;
// 계정별 키로 저장합니다. 키는 앱이 정한 값의 예시입니다(SDK가 정하지 않음).
await storage.SaveAsync(new SecureStorageSaveRequest {
Key = $"hive.axyl.auth.account.{playerId}.access_token",
Value = snapshot.AccessToken,
});
await storage.SaveAsync(new SecureStorageSaveRequest {
Key = $"hive.axyl.auth.account.{playerId}.refresh_token",
Value = snapshot.RefreshToken,
});
// 보관 중인 계정 목록에도 이 Player ID를 추가합니다.
await storage.SaveAsync(new SecureStorageSaveRequest {
Key = "hive.axyl.auth.account_index",
Value = string.Join(",", accountIds),
});
저장에 실패하면 목록에 Player ID를 추가하지 마세요. 목록에는 있는데 인증 정보가 없는 계정이 생기면 전환 화면에서 계속 실패합니다.
2. 보관 중인 계정 목록 구성
사용자가 계정 전환 화면에 들어오면 보관 중인 계정 목록을 읽어 화면에 표시합니다. Hive Axyl SDK에는 저장된 계정을 나열하는 메서드가 없으므로, 1단계에서 기록한 목록을 그대로 사용합니다.
var loaded = await storage.LoadAsync(new SecureStorageLoadRequest {
Key = "hive.axyl.auth.account_index",
});
if (loaded is SecureStorageLoadResult.Success ok && !string.IsNullOrEmpty(ok.Data.Value))
{
string[] accountIds = ok.Data.Value.Split(',');
// accountIds로 전환 가능한 계정 목록 화면을 구성합니다.
}
else
{
// 보관 중인 계정이 없으므로 새 계정으로 로그인하도록 안내합니다.
}
Hive Axyl SDK는 계정의 표시 이름 같은 부가 정보를 보관하지 않습니다. 목록 화면에 Player ID 외의 정보를 보여 주려면 앱 클라이언트에서 직접 저장해 두세요.
3. 선택한 계정으로 전환
사용자가 목록에서 계정을 고르면, 그 계정의 인증 정보를 불러와 세션을 교체합니다. 복원 절차는 자동 로그인의 세션 복원과 같으며, 불러올 키만 선택한 Player ID의 것으로 바꿉니다.
- 지금 로그인한 계정의 인증 정보를 1단계 방식으로 저장합니다.
- 선택한 Player ID의 키로 저장해 둔 토큰을
ISecureStorage에서 불러옵니다. - 불러온 액세스 토큰으로
LoginWithAccessTokenAsync()를 호출하고, 실패하면 리프레시 토큰으로IssueTokenAsync()를 호출합니다. - 새로 발급받은 토큰으로
SetSession()을 호출해 세션을 교체합니다. - 전환한 계정을 기준으로 앱 데이터를 다시 불러오고 화면을 갱신합니다.
복원에 실패하면 그 계정의 로그인 흐름을 처음부터 실행하도록 안내하세요. 외부 인증 제공자 계정은 외부 인증 제공자 로그인, 게스트 계정은 게스트 로그인을 참조하세요.
SetSession()을 호출하기 전에는 이전 세션이 그대로 남아 있습니다. 복원에 실패했다면 세션을 바꾸지 말고 원래 계정으로 앱을 계속 이용하게 두세요.
4. 보관한 계정 정보 삭제
사용자가 이 기기에서 더 이상 쓰지 않을 계정을 목록에서 지웁니다. 이 작업은 기기에 저장한 인증 정보만 지우며, Hive Axyl 인증 서버의 계정은 그대로 남습니다.
var deletedAccess = await storage.DeleteAsync(new SecureStorageDeleteRequest {
Key = $"hive.axyl.auth.account.{targetPlayerId}.access_token",
});
var deletedRefresh = await storage.DeleteAsync(new SecureStorageDeleteRequest {
Key = $"hive.axyl.auth.account.{targetPlayerId}.refresh_token",
});
if (deletedAccess is SecureStorageDeleteResult.Success
&& deletedRefresh is SecureStorageDeleteResult.Success)
{
// 보관 중인 계정 목록에서도 targetPlayerId를 제거하고 다시 저장합니다.
}
삭제에 실패하면 목록에서도 제거하지 마세요. 저장소와 목록이 어긋나면 다음 전환 시도에서 예상하지 못한 결과가 나옵니다.
계정을 완전히 없애려면 삭제가 아니라 탈퇴를 진행해야 합니다. 탈퇴하려면 먼저 3단계로 그 계정의 세션으로 전환한 뒤 계정 삭제를 참조하세요.
연관 문서
- 자동 로그인: 저장한 인증 정보로 세션을 복원하는 절차
- 계정 연동 시 충돌 처리: 연동 충돌 이후 다른 계정으로 옮겨 가는 흐름
- 계정 삭제: 계정을 영구히 없애는 방법