자격 증명 보관

이 문서는 Universal Windows Platform(UWP)앱이 자격 증명 보관을 사용하여 사용자 자격 증명을 안전하게 저장 및 검색하고 사용자의 Microsoft 계정으로 장치 간 로밍을 하는 방법을 설명합니다.

예를 들어, 미디어 파일 또는 소셜 네트워킹과 같은 보호된 리소스에 액세스하기 위해 서비스에 연결하는 앱이 있습니다. 서비스에는 각 사용자에 대한 로그인 정보가 필요합니다. 사용자의 사용자 이름 및 암호를 가져오는 앱에 UI를 빌드한 다음, 사용자를 서비스에 기록하는 데 사용됩니다. Credential Locker API를 사용하여 사용자의 사용자 이름과 암호를 저장하고, 다음에 앱을 열 때 사용자가 어떤 디바이스에 있든 관계없이 사용자를 쉽게 검색하고 자동으로 로그하도록 할 수 있습니다.

CredentialLocker에 저장된 사용자 자격 증명은 만료되지 않고ApplicationData.RoamingStorageQuota의 영향을 받지 않으며, 기존 로밍 데이터와 같은 비활성 상태로 인해 삭제되지 않습니다. 하지만 CredentialLocker에서 앱당 최대 20개의 자격 증명을 저장할 수 있습니다.

자격 증명 보관은 도메인 계정에 대해 약간 다르게 작동합니다. Microsoft 계정에 저장된 자격 증명이 있고 해당 계정을 도메인 계정(예시: 직장에서 사용하는 계정)과 연결하는 경우, 자격 증명은 해당 도메인 계정으로 로밍됩니다. 그러나 도메인 계정으로 로그온할 때 추가된 새 자격 증명은 로밍되지 않습니다. 이렇게 하면 도메인에 대한 개인 자격 증명이 도메인 외부에서 노출되지 않습니다.

사용자 자격 증명 저장하기

  1. Windows.Security.Credentials 네임스페이스에서 PasswordVault 개체를 사용하여 자격 증명 보관에 대한 참조를 가져옵니다.
  2. 앱의 식별자, 사용자 이름 및 암호를 포함하는 PasswordCredential 개체를 만들고 PasswordVault.Add 메서드에 전달하여 자격 증명을 보관함에 추가합니다.
var vault = new Windows.Security.Credentials.PasswordVault();
vault.Add(new Windows.Security.Credentials.PasswordCredential(
    "My App", username, password));

사용자 자격 증명 검색하기

PasswordVault 개체에 대한 참조가 있으면, 자격 증명 보관에서 사용자 자격 증명을 검색하는 몇 가지 옵션이 있습니다.

  • 보관함에서 사용자가 앱에 대해 제공한 모든 자격 증명을 PasswordVault.RetrieveAll 메서드를 사용하여 검색할 수 있습니다.

  • 저장된 자격 증명의 사용자 이름을 알고 있는 경우, 해당 사용자 이름에 대한 모든 자격 증명을 검색하기 위해 PasswordVault.FindAllByUserName 메서드를 사용할 수 있습니다.

  • 저장된 자격 증명의 리소스 이름을 알고 있는 경우, 해당 리소스 이름에 대한 모든 자격 증명을 검색하기 위해 PasswordVault.FindAllByResource 메서드를 사용할 수 있습니다.

  • 마지막으로 자격 증명의 사용자 이름과 리소스 이름을 모두 알고 있는 경우, 해당 자격 증명만 검색하기 위해 PasswordVault.Retrieve 메서드를 사용할 수 있습니다.

앱에 전역적으로 리소스 이름을 저장하고 해당 자격 증명을 찾으면 자동으로 로그온하는 예시를 살펴보겠습니다. 동일한 사용자에 대해 여러 자격 증명을 찾으면, 로그온할 때 사용할 기본 자격 증명을 선택하도록 사용자에게 요청합니다.

private string resourceName = "My App";
private string defaultUserName;

private void Login()
{
    var loginCredential = GetCredentialFromLocker();

    if (loginCredential != null)
    {
        // There is a credential stored in the locker.
        // Populate the Password property of the credential
        // for automatic login.
        loginCredential.RetrievePassword();
    }
    else
    {
        // There is no credential stored in the locker.
        // Display UI to get user credentials.
        loginCredential = GetLoginCredentialUI();
    }

    // Log the user in.
    ServerLogin(loginCredential.UserName, loginCredential.Password);
}


private Windows.Security.Credentials.PasswordCredential GetCredentialFromLocker()
{
    Windows.Security.Credentials.PasswordCredential credential = null;

    var vault = new Windows.Security.Credentials.PasswordVault();

    IReadOnlyList<PasswordCredential> credentialList = null;

    try
    {
        credentialList = vault.FindAllByResource(resourceName);
    }
    catch(Exception)
    {
        return null;
    }

    if (credentialList.Count > 0)
    {
        if (credentialList.Count == 1)
        {
            credential = credentialList[0];
        }
        else
        {
            // When there are multiple usernames,
            // retrieve the default username. If one doesn't
            // exist, then display UI to have the user select
            // a default username.

            defaultUserName = GetDefaultUserNameUI();

            credential = vault.Retrieve(resourceName, defaultUserName);
        }
    }

    return credential;
}

사용자 자격 증명 삭제하기

또한 자격 증명 보관에서 사용자 자격 증명을 삭제하는 것도 빠른 2단계 프로세스입니다.

  1. Windows.Security.Credentials 네임스페이스에서 PasswordVault 개체를 사용하여 자격 증명 보관에 대한 참조를 가져옵니다.

  2. 삭제하려는 자격 증명을 PasswordVault.Remove 메서드에 전달합니다.

var vault = new Windows.Security.Credentials.PasswordVault();
vault.Remove(new Windows.Security.Credentials.PasswordCredential(
    "My App", username, password));

모범 사례

더 큰 데이터 Blob이 아닌 암호에만 자격 증명 보관을 사용합니다.

다음의 조건을 충족하는 경우에만 자격 증명 보관에 암호를 저장합니다.

  • 사용자가 성공적으로 로그인했습니다.
  • 사용자가 암호를 저장하도록 선택했습니다.

앱 데이터 또는 로밍 설정을 사용하여 자격 증명을 일반 텍스트로 저장하지 마세요.