

# 웹 아이덴티티 페더레이션 사용
<a name="WIF"></a>

대규모 사용자를 대상으로 하는 애플리케이션을 작성하려는 경우 필요에 따라 인증 및 권한 부여를 위해 *웹 자격 증명 연동* 기능을 사용할 수 있습니다. 웹 자격 증명 연동을 사용하면 개별 사용자를 생성할 필요가 없습니다. 그 대신에 사용자는 자격 증명 공급자에 로그인한 후 AWS Security Token Service(AWS STS)에서 임시 보안 자격 증명을 얻을 수 있습니다. 그러면 앱은 이러한 자격 증명을 사용하여 AWS 서비스에 액세스할 수 있습니다.

웹 자격 증명 연동은 다음 자격 증명 공급자를 지원합니다.
+ Login with Amazon
+ Facebook
+ Google

## 웹 ID 페더레이션 관련 추가 리소스
<a name="WIF.AdditionalResources"></a>

다음 리소스는 웹 ID 페더레이션에 대해 자세히 알아보는 데 도움이 됩니다.
+ AWS 개발자 블로그의 게시글 [AWS SDK for .NET을 사용한 웹 자격 증명 연동](https://aws.amazon.com/blogs/developer/web-identity-federation-using-the-aws-sdk-for-net)에서는 Facebook에서 웹 자격 증명 연동을 사용하는 방법을 안내합니다. 여기에는 웹 자격 증명으로 IAM 역할을 수임하는 방법과 임시 보안 자격 증명을 사용해 AWS 리소스에 액세스하는 방법을 보여주는 C\$1 코드 조각이 포함되어 있습니다.
+ [AWS Mobile SDK for iOS](https://aws.amazon.com/sdkforios/) 및 [AWS Mobile SDK for Android](https://aws.amazon.com/sdkforandroid/)에는 샘플 앱이 포함되어 있습니다. 이러한 앱에는 자격 증명 공급자를 호출하는 방법과 이러한 공급자의 정보를 사용하여 임시 보안 자격 증명을 가져오고 사용하는 방법을 보여 주는 코드가 포함되어 있습니다.
+ [모바일 애플리케이션을 사용한 웹 자격 증명 연동](https://aws.amazon.com/articles/4617974389850313) 항목에서는 웹 자격 증명 연동에 대해 설명하며, 웹 자격 증명 연동을 사용하여 AWS 리소스에 액세스하는 방법의 예를 보여 줍니다.

## 웹 아이덴티티 페더레이션에 대한 정책 예
<a name="WIF.Example"></a>

DynamoDB에서 웹 자격 증명 연동을 사용하는 방법을 보려면 [IAM 정책 조건을 사용하여 세분화된 액세스 제어 구현](specifying-conditions.md)에 소개된 *GameScores* 테이블을 다시 살펴보세요. 다음은 *GameScores*의 기본 키입니다.


****  

| 테이블 이름 | 기본 키 속성 | 파티션 키 이름 및 유형 | 정렬 키 이름 및 유형 | 
| --- | --- | --- | --- | 
| GameScores(UserId, GameTitle, ...) | 복합 | 속성 이름: UserId 유형: 문자열 | 속성 이름: GameTitle 유형: 문자열 | 

이번에는 모바일 게임 앱에서 이 테이블을 사용하며 해당 앱에서 수천 명 또는 수만 명의 사용자를 지원해야 한다고 가정해 보겠습니다. 이 규모에서는 개별 앱 사용자를 관리하고 각 사용자가 *GameScores* 테이블에서 자신의 고유 데이터에만 액세스할 수 있도록 하는 것이 매우 어렵습니다. 다행히 많은 사용자가 이미 Facebook, Google 또는 Login with Amazon 같은 타사 자격 증명 공급자의 계정을 이미 보유하고 있습니다. 따라서 인증 작업에 대해 이러한 공급자 중 하나를 활용할 수 있습니다.

웹 자격 증명 연동을 사용하여 이 작업을 수행하려면 앱 개발자가 자격 증명 공급자(예: Login with Amazon)에 앱을 등록하고 고유한 앱 ID를 받아야 합니다. 그러고 나면 개발자는 IAM 역할을 생성해야 합니다. (이 예에서 이 역할의 이름은 *GameRole*입니다.) 이 역할에는 앱이 *GameScores* 테이블에 액세스할 수 있는 조건을 지정하는 IAM 정책 문서가 연결되어 있어야 합니다.

게임을 플레이하려는 사용자는 해당 게임 앱에서 자신의 Login with Amazon 계정에 로그인해야 합니다. 그런 다음 앱은 Login with Amazon 앱 ID를 지정하고 *GameRole*의 멤버십을 요청하여 AWS Security Token Service(AWS STS)를 직접적으로 호출합니다. AWS STS는 임시 AWS 자격 증명을 앱에 반환하여 앱이 *GameRole* 정책 문서에 따라 *GameScores* 테이블에 액세스하도록 허용합니다.

다음 다이어그램은 이러한 각 단계가 어떻게 서로 연결되는지 보여 줍니다.

![\[게임 앱의 워크플로입니다. 앱은 Amazon ID 및 AWS STS를 사용하여 DynamoDB 테이블에 액세스하기 위한 임시 자격 증명을 얻습니다.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/wif-overview.png)


**웹 아이덴티티 페더레이션 개요**

1. 앱은 타사 자격 증명 공급자를 호출하여 사용자와 앱을 인증합니다. 자격 증명 공급자가 웹 자격 증명 토큰을 앱에 반환합니다.

1. 앱이 AWS STS를 호출하고 웹 자격 증명 토큰을 입력으로 전달합니다. AWS STS는 앱에 권한을 부여하고 임시 AWS 액세스 자격 증명을 제공합니다. 앱은 IAM 역할(*GameRole*)을 수임하고 역할의 보안 정책에 따라 AWS 리소스에 액세스할 수 있습니다.

1. 앱은 DynamoDB를 호출하여 *GameScores* 테이블에 액세스합니다. *GameRole*을 위임했으므로 앱은 해당 역할과 연결된 보안 정책을 준수해야 합니다. 정책 문서는 앱이 사용자와 관련이 없는 데이터에 액세스할 수 없도록 합니다.

다시 한번 다음은 [IAM 정책 조건을 사용하여 세분화된 액세스 제어 구현](specifying-conditions.md)에 나온 *GameRole*의 보안 정책입니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"AllowAccessToOnlyItemsMatchingUserID",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "dynamodb:BatchWriteItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ],
               "dynamodb:Attributes":[
                  "UserId",
                  "GameTitle",
                  "Wins",
                  "Losses",
                  "TopScore",
                  "TopScoreDateTime"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

`Condition` 절은 앱에 표시되는 *GameScores*의 항목을 결정합니다. 이 작업은 Login with Amazon ID를 `UserId`의 `GameScores` 파티션 키 값과 비교하여 수행됩니다. 이 정책에 나열된 DynamoDB 작업 중 하나를 통해서는 현재 사용자에게 속한 항목만 처리할 수 있습니다. 테이블의 다른 항목에는 액세스할 수 없습니다. 또한 정책에 나열된 특정 속성만 액세스할 수 있습니다.