

버전 4(V4) AWS SDK for .NET 가 릴리스되었습니다.

변경 사항 해제 및 애플리케이션 마이그레이션에 대한 자세한 내용은 [마이그레이션 주제를](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html) 참조하세요.

 [https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html)

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon Cognito로 사용자 인증
<a name="cognito-apis-intro"></a>

**참고**  
이 주제의 정보는 .NET Framework 및 AWS SDK for .NET 버전 3.3 이하를 기반으로 하는 프로젝트에만 해당됩니다.

Amazon Cognito 자격 증명을 사용하면 사용자를 위한 고유한 자격 증명을 생성하고 Amazon S3 또는 Amazon DynamoDB와 같은 AWS 리소스에 대한 보안 액세스를 위해 사용자를 인증할 수 있습니다. Amazon Cognito Identity는 Amazon, Facebook, Twitter/Digits, Google 또는 OpenID Connect 호환 공급자와 같은 퍼블릭 ID 공급자와 인증되지 않은 자격 증명을 지원합니다. 또한 Amazon Cognito는 [개발자 인증 자격 증명](https://aws.amazon.com/blogs/mobile/amazon-cognito-announcing-developer-authenticated-identities/)을 지원하여 Amazon Cognito Sync를 사용하여 사용자 데이터를 동기화하고 AWS 리소스에 액세스하면서도 자체 백엔드 인증 프로세스를 사용하여 사용자를 등록하고 인증할 수 있게 합니다.

[Amazon Cognito](https://aws.amazon.com/cognito/)에 대한 자세한 내용은 [Amazon Cognito 개발자 안내서](https://docs.aws.amazon.com/cognito/latest/developerguide/)를 참조하세요.

다음 코드 예시는 Amazon Cognito 자격 증명을 쉽게 사용하는 방법을 보여줍니다. [자격 증명 공급자](cognito-creds-provider.md) 예에서는 사용자 자격 증명을 생성하고 인증하는 방법을 보여줍니다. [CognitoAuthentication 확장 라이브러리](cognito-authentication-extension.md) 예제에서는 CognitoAuthentication 확장 라이브러리를 사용하여 Amazon Cognito 사용자 풀을 인증하는 방법을 보여줍니다.

**Topics**
+ [자격 증명 공급자](cognito-creds-provider.md)
+ [CognitoAuthentication 확장 라이브러리](cognito-authentication-extension.md)

# Amazon Cognito 보안 인증 공급자
<a name="cognito-creds-provider"></a>

**참고**  
이 주제의 정보는 .NET Framework 및 AWS SDK for .NET 버전 3.3 이하를 기반으로 하는 프로젝트에만 해당됩니다.

 `Amazon.CognitoIdentity.CognitoAWSCredentials`[AWSSDK.CognitoIdentity](https://www.nuget.org/packages/AWSSDK.CognitoIdentity/) NuGet 패키지에 있는는 Amazon Cognito 및 AWS Security Token Service (AWS STS)를 사용하여 AWS 호출할 자격 증명을 검색하는 자격 증명 객체입니다.

`CognitoAWSCredentials` 설정의 첫 번째 단계는 "자격 증명 풀"을 생성하는 것입니다. (자격 증명 풀은 계정에 관련된 사용자 자격 증명 정보의 저장소입니다. 정보는 클라이언트 플랫폼, 디바이스 및 운영 체제 간에 가져올 수 있어 사용자가 스마트폰에서 앱을 사용하다가 태블릿으로 전환하면 앱 정보가 해당 사용자에게 계속 제공됩니다. Amazon Cognito 콘솔에서 새로운 자격 증명 풀을 생성할 수 있습니다. 콘솔을 사용 중인 경우, 콘솔에서 사용자에게 필요한 다음과 같은 다른 정보 또한 제공합니다.
+ 계정 번호- A 12자리 숫자. 예: 123456789012 (사용자 계정에 고유한 숫자)
+ 인증되지 않은 역할 ARN- 인증되지 않은 사용자가 맡을 역할 예를 들어, 이 역할은 데이터에 대한 읽기 전용 권한을 제공할 수 있습니다.
+ 인증된 역할 ARN- 인증된 사용자가 맡을 역할 이 역할은 데이터에 대한 더 광범위한 권한을 제공할 수 있습니다.

## CognitoAWSCredentials 설정
<a name="set-up-cognitoawscredentials"></a>

다음 코드 예제에서는 인증되지 않은 사용자로 Amazon S3를 호출하는 데 사용할 수 있도록 `CognitoAWSCredentials`를 설정하는 방법을 보여줍니다. 이렇게 하면 사용자를 인증하기 위해 필요한 최소한의 데이터만으로도 호출할 수 있습니다. 사용자 권한은 역할에 의해 제어되므로 필요한 액세스를 구성할 수 있습니다.

```
CognitoAWSCredentials credentials = new CognitoAWSCredentials(
    accountId,        // Account number
    identityPoolId,   // Identity pool ID
    unAuthRoleArn,    // Role for unauthenticated users
    null,             // Role for authenticated users, not set
    region);
using (var s3Client = new AmazonS3Client(credentials))
{
    s3Client.ListBuckets();
}
```

## 인증되지 않은 사용자 AWS 로 사용
<a name="use-aws-as-an-unauthenticated-user"></a>

다음 코드 예제에서는 미인증 사용자 AWS 로 사용을 시작한 다음 Facebook을 통해 인증하고 자격 증명을 업데이트하여 Facebook 자격 증명을 사용하는 방법을 보여줍니다. 이 접근 방식을 사용하여 인증된 역할을 통해 인증된 사용자에게 다른 자격 증명을 부여할 수 있습니다. 예를 들어, 사용자가 익명으로 콘텐츠를 볼 수 있도록 허용하되 하나 이상의 구성된 공급자로 로그온한 경우에 게시할 수 있도록 허용하는 스마트폰 애플리케이션이 있을 수도 있습니다.

```
CognitoAWSCredentials credentials = new CognitoAWSCredentials(
    accountId, identityPoolId,
    unAuthRoleArn,    // Role for unauthenticated users
    authRoleArn,      // Role for authenticated users
    region);
using (var s3Client = new AmazonS3Client(credentials))
{
    // Initial use will be unauthenticated
    s3Client.ListBuckets();

    // Authenticate user through Facebook
    string facebookToken = GetFacebookAuthToken();

    // Add Facebook login to credentials. This clears the current AWS credentials
    // and retrieves new AWS credentials using the authenticated role.
    credentials.AddLogin("graph.facebook.com", facebookAccessToken);

    // This call is performed with the authenticated role and credentials
    s3Client.ListBuckets();
}
```

`CognitoAWSCredentials` 객체는 AWS SDK for .NET의 일부인 `AmazonCognitoSyncClient`와 함께 사용하는 경우 훨씬 더 많은 기능을 제공합니다. `AmazonCognitoSyncClient`와 `CognitoAWSCredentials`를 모두 사용 중인 경우 `IdentityPoolId`로 호출할 때 `IdentityId` 및 `AmazonCognitoSyncClient` 속성을 지정하지 않아도 됩니다. 이러한 속성은 `CognitoAWSCredentials`에서 자동으로 채워집니다. 다음 코드 예에서는 이를 보여주고, 뿐만 아니라 `IdentityId`에 대한 `CognitoAWSCredentials`가 변경될 때마다 이를 알려주는 이벤트도 보여줍니다. `IdentityId`는 인증되지 않은 사용자에서 인증된 사용자로 변경될 때와 같은 일부 경우에 변경될 수 있습니다.

```
CognitoAWSCredentials credentials = GetCognitoAWSCredentials();

// Log identity changes
credentials.IdentityChangedEvent += (sender, args) =>
{
    Console.WriteLine("Identity changed: [{0}] => [{1}]", args.OldIdentityId, args.NewIdentityId);
};

using (var syncClient = new AmazonCognitoSyncClient(credentials))
{
    var result = syncClient.ListRecords(new ListRecordsRequest
    {
        DatasetName = datasetName
        // No need to specify these properties
        //IdentityId = "...",
        //IdentityPoolId = "..."        
    });
}
```

# Amazon CognitoAuthentication 확장 라이브러리 예
<a name="cognito-authentication-extension"></a>

**참고**  
이 주제의 정보는 .NET Framework 및 AWS SDK for .NET 버전 3.3 이하를 기반으로 하는 프로젝트에만 해당됩니다.

[Amazon.Extensions.CognitoAuthentication](https://www.nuget.org/packages/Amazon.Extensions.CognitoAuthentication/) NuGet 패키지에 있는 CognitoAuthentication 확장 라이브러리는 .NET Core 및 Xamarin 개발자를 위한 Amazon Cognito 사용자 풀의 인증 프로세스를 간소화합니다. 이 라이브러리는 사용자 인증 API 직접 호출을 생성하고 전송하기 위해 Amazon Cognito Identity Provider API를 기반으로 하여 구축됩니다.

## CognitoAuthentication 확장 라이브러리 사용
<a name="using-the-cognitoauthentication-extension-library"></a>

Amazon Cognito에는 표준 인증 흐름에서 SRP(Secure Remote Password)를 통해 사용자 이름과 암호를 확인할 수 있는 기본 제공 `AuthFlow` 및 `ChallengeName` 값이 있습니다. 인증 흐름에 대한 자세한 내용은 [Amazon Cognito 사용자 풀 인증 흐름](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html)을 참조하십시오.

다음 예제에는 다음과 같은 `using` 설명문이 필요합니다.

```
// Required for all examples
using System;
using Amazon;
using Amazon.CognitoIdentity;
using Amazon.CognitoIdentityProvider;
using Amazon.Extensions.CognitoAuthentication;
using Amazon.Runtime;
// Required for the GetS3BucketsAsync example
using Amazon.S3;
using Amazon.S3.Model;
```

### 기본 사용자 인증 사용
<a name="use-basic-authentication"></a>

요청에 서명하지 않아도 되는 [AnonymousAWSCredentials](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/Runtime/TAnonymousAWSCredentials.html)를 사용하여 [AmazonCognitoIdentityProviderClient](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/CognitoIdentityProvider/TCognitoIdentityProviderClient.html)를 생성합니다. 리전을 공급할 필요가 없습니다. 리전이 제공되지 않은 경우 기본 코드가 `FallbackRegionFactory.GetRegionEndpoint()`를 호출합니다. `CognitoUserPool` 및 `CognitoUser` 객체를 생성합니다. 사용자 암호를 포함한 `StartWithSrpAuthAsync`로 `InitiateSrpAuthRequest` 메서드를 호출합니다.

```
public static async void GetCredsAsync()
{
    AmazonCognitoIdentityProviderClient provider =
        new AmazonCognitoIdentityProviderClient(new Amazon.Runtime.AnonymousAWSCredentials());
    CognitoUserPool userPool = new CognitoUserPool("poolID", "clientID", provider);
    CognitoUser user = new CognitoUser("username", "clientID", userPool, provider);
    InitiateSrpAuthRequest authRequest = new InitiateSrpAuthRequest()
    {
        Password = "userPassword"
    };

    AuthFlowResponse authResponse = await user.StartWithSrpAuthAsync(authRequest).ConfigureAwait(false);
    accessToken = authResponse.AuthenticationResult.AccessToken;

}
```

### 챌린지로 인증
<a name="authenticate-with-challenges"></a>

NewPasswordRequired 및 Multi-Factor Authentication(MFA)과 같은 챌린지로 인증 흐름을 계속하는 것 또한 간단합니다. 요구 사항은 CognitoAuthentication 객체, SRP에 대한 사용자 암호, 및 다음 챌린지(사용자에게 정보를 입력하라는 메시지를 표시한 후에 확보됨)를 위해 필요한 정보 뿐입니다. 다음 코드에서는 챌린지 유형을 확인하고 인증 흐름 동안 MFA 및 NewPasswordRequired 챌린지에 대한 적절한 응답을 얻기 위한 하나의 방법을 보여줍니다.

전과 같이 기본 인증 요청을 사용하고 `await`를 `AuthFlowResponse` 합니다. 응답이 반환된 `AuthenticationResult` 객체를 통해 받은 루프인 경우. `ChallengeName` 유형이 `NEW_PASSWORD_REQUIRED`인 경우 `RespondToNewPasswordRequiredAsync` 메서드를 호출합니다.

```
public static async void GetCredsChallengesAsync()
{
    AmazonCognitoIdentityProviderClient provider = 
        new AmazonCognitoIdentityProviderClient(new Amazon.Runtime.AnonymousAWSCredentials());
    CognitoUserPool userPool = new CognitoUserPool("poolID", "clientID", provider);
    CognitoUser user = new CognitoUser("username", "clientID", userPool, provider);
    InitiateSrpAuthRequest authRequest = new InitiateSrpAuthRequest(){
        Password = "userPassword"
    };

    AuthFlowResponse authResponse = await user.StartWithSrpAuthAsync(authRequest).ConfigureAwait(false);

    while (authResponse.AuthenticationResult == null)
    {
        if (authResponse.ChallengeName == ChallengeNameType.NEW_PASSWORD_REQUIRED)
        {
            Console.WriteLine("Enter your desired new password:");
            string newPassword = Console.ReadLine();

            authResponse = await user.RespondToNewPasswordRequiredAsync(new RespondToNewPasswordRequiredRequest()
            {
                SessionID = authResponse.SessionID,
                NewPassword = newPassword
            });
            accessToken = authResponse.AuthenticationResult.AccessToken;
        }
        else if (authResponse.ChallengeName == ChallengeNameType.SMS_MFA)
        {
            Console.WriteLine("Enter the MFA Code sent to your device:");
            string mfaCode = Console.ReadLine();

            AuthFlowResponse mfaResponse = await user.RespondToSmsMfaAuthAsync(new RespondToSmsMfaRequest()
            {
                SessionID = authResponse.SessionID,
                MfaCode = mfaCode

            }).ConfigureAwait(false);
            accessToken = authResponse.AuthenticationResult.AccessToken;
        }
        else
        {
            Console.WriteLine("Unrecognized authentication challenge.");
            accessToken = "";
            break;
        }
    }

    if (authResponse.AuthenticationResult != null)
    {
        Console.WriteLine("User successfully authenticated.");
    }
    else
    {
        Console.WriteLine("Error in authentication process.");
    }
 
}
```

### 인증 후 AWS 리소스 사용
<a name="use-aws-resources-after-authentication"></a>

사용자가 CognitoAuthentication 라이브러리를 사용하여 인증되면 다음 단계는 사용자가 적절한 AWS 리소스에 액세스할 수 있도록 허용하는 것입니다. 이렇게 하려면 Amazon Cognito 연동 자격 증명 콘솔을 통해 자격 증명 풀을 생성해야 합니다. poolID 및 clientID를 사용하여 공급자로 생성한 Amazon Cognito 사용자 풀을 지정하면, Amazon Cognito 사용자 풀 사용자가 계정에 연결된 AWS 리소스에 액세스하도록 허용할 수 있습니다. 인증되지 않은 사용자와 인증된 사용자가 서로 다른 리소스에 액세스할 수 있도록 서로 다른 역할을 지정할 수도 있습니다. 역할의 연결된 정책의 **Action** 필드에서 권한을 추가하거나 제거할 수 있는 IAM 콘솔에서 이러한 역할을 변경할 수 있습니다. 그런 다음 적절한 자격 증명 풀, 사용자 풀 및 Amazon Cognito 사용자 정보를 사용하여 다른 AWS 리소스를 호출할 수 있습니다. 다음 예제에서는 연결된 자격 증명 풀의 역할이 허용하는 다양한 Amazon S3 버킷에 액세스하여 SRP로 인증된 사용자를 보여줍니다.

```
public async void GetS3BucketsAsync()
{
    var provider = new AmazonCognitoIdentityProviderClient(new AnonymousAWSCredentials());
    CognitoUserPool userPool = new CognitoUserPool("poolID", "clientID", provider);
    CognitoUser user = new CognitoUser("username", "clientID", userPool, provider);

    string password = "userPassword";

    AuthFlowResponse context = await user.StartWithSrpAuthAsync(new InitiateSrpAuthRequest()
    {
        Password = password
    }).ConfigureAwait(false);

    CognitoAWSCredentials credentials =
        user.GetCognitoAWSCredentials("identityPoolID", RegionEndpoint.< YourIdentityPoolRegion >);

    using (var client = new AmazonS3Client(credentials))
    {
        ListBucketsResponse response =
            await client.ListBucketsAsync(new ListBucketsRequest()).ConfigureAwait(false);

        foreach (S3Bucket bucket in response.Buckets)
        {
            Console.WriteLine(bucket.BucketName);
        }
    }
}
```

## 더 많은 인증 옵션
<a name="more-authentication-options"></a>

SRP, NewPasswordRequired 및 MFA 뿐만 아니라 CognitoAuthentication 확장 라이브러리도 다음을 위해 더 쉬운 인증 흐름을 제공합니다.
+ 사용자 지정 - `StartWithCustomAuthAsync(InitiateCustomAuthRequest customRequest)`에 대한 호출로 시작합니다.
+ RefreshToken - `StartWithRefreshTokenAuthAsync(InitiateRefreshTokenAuthRequest refreshTokenRequest)`에 대한 호출로 시작합니다.
+ RefreshTokenSRP - `StartWithRefreshTokenAuthAsync(InitiateRefreshTokenAuthRequest refreshTokenRequest)`에 대한 호출로 시작합니다.
+ AdminNoSRP - `StartWithAdminNoSrpAuthAsync(InitiateAdminNoSrpAuthRequest adminAuthRequest)`에 대한 호출로 시작합니다.

원하는 흐름에 따라 적절한 메서드를 호출합니다. 그런 다음 각 메서드 호출의 `AuthFlowResponse` 객체에 제시되어 있는 챌린지로 사용자에게 프롬프트 표시를 계속합니다. 또한 MFA 챌린지에 대한 `RespondToSmsMfaAuthAsync` 및 사용자 지정 챌린지에 대한 `RespondToCustomAuthAsync`와 같은 적절한 응답 메서드를 호출합니다.