

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

# 에서 자격 증명 공급자 사용 AWS SDK for Java 2.x
<a name="credentials"></a>

에서 자격 증명 공급자의 역할은 자격 증명을 AWS SDK for Java 2.x 소싱하고 SDK의 AWS 서비스 클라이언트에 제공하는 것입니다. SDK는 획득한 자격 증명을 사용하여 각 요청에 암호화 방식으로 서명하여 서비스를 인증합니다. 자격 증명은 일반적으로 액세스 키(액세스 키 ID)와 시크릿 액세스 키로 구성됩니다.

[SSO 토큰 공급자 구성을](https://docs.aws.amazon.com/sdkref/latest/guide/feature-sso-credentials.html#sso-token-config) 설정하거나 [IAM(AWS Identity and Access Management) 역할을 예로 들](https://docs.aws.amazon.com/sdkref/latest/guide/access-assume-role.html#credOrSourceAssumeRole)도록 런타임을 구성할 때 사용되는 임시 자격 증명을 사용하면 액세스 키에 세션 토큰이 추가되어 AWS 리소스에 대한 시간 제한 액세스를 제공합니다.

이 주제에서는 자격 증명에 액세스하기 위해 SDK를 활성화하는 여러 가지 방법에 대해 설명합니다.

**Topics**
+ [대화형 개발 작업](credentials-temporary.md)
+ [기본 자격 증명 공급자 체인 사용](credentials-chain.md)
+ [자격 증명 캐싱](credential-caching.md)
+ [특정 자격 증명 공급자 지정](credentials-providers.md)
+ [공유 구성 프로파일 사용](credentials-profiles.md)
+ [외부 프로세스 사용](credentials-process.md)
+ [코드에 자격 증명 제공](credentials-explicit.md)
+ [Amazon EC2에서 IAM 역할 자격 증명 읽기](ec2-iam-roles.md)

# 를 사용하여 대화형 개발 작업을 위한 액세스 자격 증명 AWS SDK for Java 2.x
<a name="credentials-temporary"></a>

보안을 강화하려면 수명이 긴 [자격 증명 대신 임시 자격 증명을 사용하도록](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp) Java용 SDK를 구성하는 것이 AWS 좋습니다. 임시 자격 증명은 액세스 키(액세스 키 ID 및 시크릿 액세스 키)와 세션 토큰으로 구성됩니다.

임시 자격 증명으로 작업할 수 있는 몇 가지 접근 방식을 사용할 수 있습니다. 사용하는 접근 방식과 SDK에 제공하는 구성은 사용 사례에 따라 다릅니다.

Java SDK로 대화형 개발 작업을 수행할 때는 AWS 콘솔 로그인 자격 증명을 사용하는 것이 좋습니다.

## 콘솔 로그인 자격 증명 사용
<a name="using-con-login-creds"></a>

기존 AWS Management Console 로그인 자격 증명을 사용하여 AWS 서비스에 프로그래밍 방식으로 액세스할 수 있습니다. 브라우저 기반 인증 흐름 후는 AWS CLI 및 Java 2.x용 SDK와 같은 로컬 개발 도구에서 작동하는 임시 자격 증명을 AWS 생성합니다.

이 프로세스를 사용하면 초기 계정 설정 중에 생성된 루트 자격 증명, IAM 사용자 또는 자격 증명 공급자의 페더레이션 자격 증명을 사용하여 인증할 수 있으며,가 AWS CLI 자동으로 임시 자격 증명을 관리합니다. 이 접근 방식은 장기 자격 증명을 로컬에 저장할 필요가 없으므로 보안이 강화됩니다.

`aws login` 명령을 실행하면 활성 콘솔 세션에서 선택하거나 브라우저 기반 인증 흐름을 통해 로그인할 수 있으며, 그러면 임시 자격 증명이 자동으로 생성됩니다. Java 2.x용 SDK는 최대 12시간 동안 이러한 자격 증명을 자동으로 새로 고칩니다.

**중요**  
모든 프로젝트에서 작동하는 공유 구성 파일에서 설정한 구성 외에도 각 개별 Java 프로젝트에는 Maven `pom.xml` 파일에 다음과 같은 종속성이 필요합니다.  

```
<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>signin</artifactId>
</dependency>
```
`signin` 종속성은 SDK for Java 2.x가 콘솔 로그인 자격 증명에 액세스하고 사용할 수 있도록 하는 코드를 제공합니다.

사전 시퀀스, 로그인 및 로그아웃에 대한 자세한 내용은 *AWS SDK 및 도구 참조 안내서*의 [콘솔 자격 증명을 사용하여 AWS 로컬 개발을 위한 로그인](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sign-in.html)을 참조하세요.

## Single-sign-on 접근 방식
<a name="single-sign-on-approach"></a>

Java SDK로 대화형 개발 작업을 수행할 때 Single Sign-On 접근 방식을 사용할 수도 있습니다. 이 접근 방식을 사용하려면 다음 설정이 필요합니다.
+ [IAM Identity Center를 통해 설정](get-started-auth.md#setup-auth)
+ [AWS 공유 구성 파일에서 프로필 구성](get-started-auth.md#setup-credentials) 
+ 를 사용하고 명령을 AWS CLI 실행하여 로그인 및 활성 세션 생성 [3. 를 사용하여 로그인 AWS CLI](get-started-auth.md#setup-login-sso) 

### IAM Identity Center 구성
<a name="credentials-temporary-idc"></a>

이 안내서의 [설정 개요](setup.md#setup-overview)에 설명된 대로 IAM Identity Center Single Sign-On 액세스를 사용하도록 SDK를 구성하면 SDK는 임시 자격 증명을 사용합니다.

SDK는 IAM Identity Center 액세스 토큰을 사용하여 `config` 파일의 `sso_role_name` 설정으로 구성된 IAM 역할에 대한 액세스 권한을 얻습니다. SDK는 이 IAM 역할을 맡고 AWS 서비스 요청에 서명할 임시 자격 증명을 검색합니다.

SDK가 구성에서 임시 자격 증명을 가져오는 방법에 대한 자세한 내용은 AWS SDK 및 도구 참조 안내서의 [IAM Identity Center 인증 이해](https://docs.aws.amazon.com/sdkref/latest/guide/understanding-sso.html) 단원을 참조하세요.

**중요**  
모든 프로젝트에서 작동하는 공유 `config` 파일에 설정한 구성 외에도 각 개별 Java 프로젝트에는 Maven `pom.xml` 파일에 다음과 같은 종속성이 필요합니다.  

```
<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>sso</artifactId>
</dependency>
<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>ssooidc</artifactId>
</dependency>
```
`sso` 및 `ssooidc` 종속성은 SDK for Java 2.x가 임시 자격 증명에 액세스할 수 있도록 하는 코드를 제공합니다.

### AWS 액세스 포털에서 임시 자격 증명 검색
<a name="credentials-temporary-from-portal"></a>

IAM Identity Center Single Sign-On 구성의 대안으로 AWS 액세스 포털에서 사용할 수 있는 임시 자격 증명을 복사하고 사용할 수 있습니다. 프로파일에서 임시 보안 인증을 사용하거나 이를 시스템 속성 및 환경 변수의 값으로 사용할 수 있습니다.

**임시 자격 증명 파일을 위한 로컬 자격 증명 파일 설정**

1. [공유 자격 증명 파일 생성](https://docs.aws.amazon.com/sdkref/latest/guide/file-location.html)

1. 자격 증명 파일에서 작업 중인 임시 자격 증명을 붙여넣을 때까지 다음 자리 표시자 텍스트를 붙여넣습니다.

   ```
   [default]
   aws_access_key_id=<value from AWS access portal>
   aws_secret_access_key=<value from AWS access portal>
   aws_session_token=<value from AWS access portal>
   ```

1. 파일을 저장합니다. 이제 파일 `~/.aws/credentials`이 로컬 개발 시스템에 존재해야 합니다. 이 파일에는 이름이 지정된 특정 프로필이 지정되지 않은 경우 Java용 SDK에서 사용하는 [[기본] 프로필](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html#file-format-profile)이 들어 있습니다.

1. [AWS 액세스 포털에 로그인](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtosignin.html)

1. [수동 자격 증명 새로 고침](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtogetcredentials.html#how-to-get-temp-credentials) 제목 아래의 다음 지침에 따라 AWS 액세스 포털에서 IAM 역할 자격 증명을 복사합니다.

   1. 링크된 설명의 2단계에서 개발 요구 사항에 따라 액세스 권한을 부여하는 IAM 역할 이름에 대해 `Access keys`를 선택합니다. 이 역할은 일반적으로 **PowerUserAccess** 또는 **Developer**와 같은 이름을 갖습니다.

   1. 모달 대화 상자에서 운영 체제를 선택하고 **프로파일 추가의 콘텐츠를 AWS 자격 증명 파일에 복사합니다**.

1. 복사한 자격 증명을 로컬 `credentials` 파일에 붙여넣고 붙여넣은 프로필 이름을 모두 제거합니다. 파일은 다음과 유사해야 합니다.

   ```
   [default]
   aws_access_key_id=AKIAIOSFODNN7EXAMPLE
   aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   aws_session_token=IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZVERYLONGSTRINGEXAMPLE
   ```

1. `credentials` 파일을 저장합니다.

SDK는 서비스 클라이언트를 생성할 때 이러한 임시 자격 증명에 액세스하여 각 요청에 사용합니다. 5a단계에서 선택한 IAM 역할 설정에 따라 [임시 보안 인증의 유효 기간](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtosessionduration.html)이 결정됩니다. 최대 유효 기간은 12시간입니다.

임시 보안 인증이 만료되면 4\$17단계를 반복합니다.

# 의 기본 자격 증명 공급자 체인 AWS SDK for Java 2.x
<a name="credentials-chain"></a>

의 기본 자격 증명 공급자 체인은 미리 정의된 위치 시퀀스에서 AWS 자격 증명을 AWS SDK for Java 2.x 자동으로 검색하므로 애플리케이션이 자격 증명 소스를 명시적으로 지정 AWS 서비스 하지 않고 로 인증할 수 있습니다.

기본 자격 증명 공급자 체인은 [DefaultCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/DefaultCredentialsProvider.html) 클래스에 의해 구현됩니다. 다양한 위치에서 구성을 확인하는 다른 자격 증명 공급자 구현에 순차적으로 위임합니다. 모든 필수 구성 요소를 찾을 수 있는 첫 번째 자격 증명 공급자가 체인을 종료합니다.

기본 자격 증명 공급자 체인을 사용하여 임시 자격 증명을 제공하려면 서비스 클라이언트 빌더를 만들되 자격 증명 공급자는 지정하지 않습니다. 다음 코드 조각은 기본 자격 증명 공급자 체인을 사용하여 구성 설정을 찾고 검색하는 `DynamoDbClient`를 만듭니다.

```
// Any external Region configuration is overridden.
// The SDK uses the default credentials provider chain because no specific credentials provider is specified.
Region region = Region.US_WEST_2;
DynamoDbClient ddb = 
    DynamoDbClient.builder()
                  .region(region)
                  .build();
```

## 자격 증명 설정 검색 순서
<a name="credentials-default"></a>

Java 2.x용 SDK의 기본 자격 증명 공급자 체인은 사전 정의된 시퀀스를 사용하여 사용자 환경의 구성을 검색합니다.

1. Java 시스템 속성
   + SDK는 [SystemPropertyCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/SystemPropertyCredentialsProvider.html) 클래스를 사용하여, `aws.accessKeyId`, `aws.secretAccessKey`, 및 `aws.sessionToken` Java 시스템 속성에서 임시 자격 증명을 로드합니다.
**참고**  
Java 시스템 속성을 설정하는 방법에 대한 자세한 내용은 공식 *Java Tutorials* 웹 사이트의 [시스템 속성](https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html) 자습서를 참조하세요.

1. 환경 변수
   + SDK는 [EnvironmentVariableCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/EnvironmentVariableCredentialsProvider.html) 클래스를 사용하여 `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` 및 `AWS_SESSION_TOKEN` 환경 변수에서 임시 자격 증명을 로드합니다.

1. 웹 ID 토큰 및 IAM 역할 ARN
   + SDK는 [WebIdentityTokenFileCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/WebIdentityTokenFileCredentialsProvider.html) 클래스를 사용하여 웹 ID 토큰으로 역할을 수임해 자격 증명을 로드합니다.
   + 자격 증명 공급자는 다음 환경 변수 또는 JVM 시스템 속성을 찾습니다.
     + `AWS_WEB_IDENTITY_TOKEN_FILE or aws.webIdentityTokenFile`
     + `AWS_ROLE_ARN` 또는 `aws.roleArn`
     + `AWS_ROLE_SESSION_NAME` 또는 `aws.roleSessionName`(선택 사항)
   + SDK는 값을 획득하면 AWS Security Token Service (STS)를 호출하고 반환되는 임시 자격 증명을 사용하여 요청에 서명합니다.
   + Amazon Elastic Kubernetes Service(EKS)와 같은 런타임 환경은 웹 자격 증명 토큰을 AWS SDKs에 자동으로 제공하여 애플리케이션이 임시 AWS 자격 증명을 얻을 수 있도록 합니다.

1. 공유 `credentials` 및 `config` 파일
   + SDK는 [ProfileCredentialsProvider를](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/ProfileCredentialsProvider.html) 사용하여 IAM Identity Center 싱글 사인온 설정 또는 `[default]` 프로필의 임시 자격 증명을 공유 `credentials` 및 `config` 파일에 로드합니다.

      AWS SDKs 및 도구 참조 안내서에는 SDK for Java가 IAM Identity Center Single Sign-On 토큰과 함께 작동하여 SDK가 호출하는 데 사용하는 임시 자격 증명을 가져오는 방법에 대한 [자세한 정보가](https://docs.aws.amazon.com/sdkref/latest/guide/understanding-sso.html#idccredres) 나와 있습니다 AWS 서비스.
**참고**  
`credentials` 및 `config` 파일은 AWS SDKs 및 도구에서 공유됩니다. 자세한 정보는 AWS SDK 및 도구 참조 가이드의 [.aws/credentials 및 .aws/config 파일](https://docs.aws.amazon.com/sdkref/latest/guide/creds-config-files.html)을 참조하세요.
   + 공유 `credentials` 및 `config` 파일의 프로파일에는 많은 다양한 설정 세트가 포함될 수 있으므로 `ProfileCredentialsProvider`는 일련의 다른 공급자에 위임하여 `[default]` 프로파일에서 설정을 찾습니다.
     + **웹 ID 토큰 자격 증명**(`WebIdentityTokenCredentialsProvider` 클래스): 프로파일에 `role_arn`, `web_identity_token_file`이 포함된 경우
     + **SSO 자격 증명**(`SsoCredentialsProvider` 클래스): 프로파일에 `sso_role_name`, `sso_account_id`와 같은 SSO 관련 속성이 포함된 경우
     + **소스 프로파일이 있는 역할 기반 자격 증명**(`StsAssumeRoleCredentialsProvider` 클래스): 프로파일에 `role_arn`, `source_profile`이 포함된 경우
     + **자격 증명 소스가 있는 역할 기반 자격 증명**(`StsAssumeRoleWithSourceCredentialsProvider` 클래스): 프로파일에 `role_arn`, `credential_source`가 포함된 경우 
       + `credential_source = Environment`인 경우: `SystemPropertyCredentialsProvider`, `EnvironmentVariableCredentialsProvider`의 체인 사용
       + `credential_source = Ec2InstanceMetadata`인 경우: `InstanceProfileCredentialsProvider` 사용
       + `credential_source = EcsContainer`인 경우: `ContainerCredentialsProvider` 사용
     + **콘솔 로그인 자격 증명**(클래스 `LoginCredentialsProvider`): 프로파일에가 포함된 경우 `login_session` 
     + **프로세스 자격 증명**(`ProcessCredentialsProvider` 클래스): 프로파일에 `credential_process`가 포함된 경우
     + **세션 자격 증명**(`StaticSessionCredentialsProvider` 클래스): 프로파일에 `aws_access_key_id`, `aws_secret_access_key`, `aws_session_token`이 포함된 경우
     + **기본 자격 증명**(`StaticCredentialsProvider` 클래스): 프로파일에 `aws_access_key_id` 및 `aws_secret_access_key`가 포함된 경우

1.  Amazon ECS 컨테이너 자격 증명
   + SDK는 [ContainerCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/ContainerCredentialsProvider.html) 클래스를 사용하여 다음 환경 변수로 임시 자격 증명을 로드합니다.

     1. `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` 또는 `AWS_CONTAINER_CREDENTIALS_FULL_URI`

     1. `AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE` 또는 `AWS_CONTAINER_AUTHORIZATION_TOKEN`

   ECS 컨테이너 에이전트는 ECS 자격 증명 엔드포인트를 가리키는 `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` 환경 변수를 자동으로 설정합니다. 일반적으로 다른 환경 변수는 표준 ECS 자격 증명 엔드포인트가 사용되지 않는 특정 시나리오에서 설정됩니다.

1.  Amazon EC2 인스턴스 IAM 역할 제공 자격 증명
   + SDK는 [InstanceProfileCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/InstanceProfileCredentialsProvider.html) 클래스를 사용하여 Amazon EC2 메타데이터 서비스에서 임시 자격 증명을 로드합니다.

1. SDK가 위에 나열된 모든 단계를 통해 필요한 구성 설정을 찾을 수 없는 경우 다음과 비슷한 출력이 포함된 예외가 발생합니다.

   ```
   software.amazon.awssdk.core.exception.SdkClientException: Unable to load credentials from any of the providers 
   in the chain AwsCredentialsProviderChain(credentialsProviders=[SystemPropertyCredentialsProvider(), 
   EnvironmentVariableCredentialsProvider(), WebIdentityTokenCredentialsProvider(), ProfileCredentialsProvider(), 
   ContainerCredentialsProvider(), InstanceProfileCredentialsProvider()])
   ```

## 코드에서 `DefaultCredentialsProvider` 사용
<a name="default-credentials-provider-in-code"></a>

코드에서 기본 자격 증명 공급자 체인을 명시적으로 사용할 수 있습니다. 이는 SDK가 기본적으로 `DefaultCredentialsProvider`를 사용하기 때문에 자격 증명 공급자를 전혀 지정하지 않는 것과 기능적으로 동일합니다. 그러나 명시적으로 사용하면 코드를 더 읽기 쉽고 자체적으로 문서화할 수 있습니다. 기본 자격 증명 체인을 사용하려는 의도를 명확하게 보여줍니다.

```
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;

public class ExplicitDefaultCredentialsExample {
    public static void main(String[] args) {
        // Explicitly create the DefaultCredentialsProvider.
        DefaultCredentialsProvider defaultCredentialsProvider = DefaultCredentialsProvider
                                                                    .builder().build();

        // Use it with any service client.
        S3Client s3Client = S3Client.builder()
            .region(Region.US_WEST_2)
            .credentialsProvider(defaultCredentialsProvider)
            .build();

        // Now you can use the client with the default credentials chain.
        s3Client.listBuckets();
    }
}
```

기본 자격 증명 공급자를 구축할 때 추가 구성을 제공할 수 있습니다.

```
DefaultCredentialsProvider customizedProvider = DefaultCredentialsProvider.builder()
    .profileName("custom-profile")  // Use a specific profile if the chain gets to the `ProfileCredentialsProvider` stage.
    .asyncCredentialUpdateEnabled(true)  // Enable async credential updates.
    .build();
```

이 접근 방식을 사용하면 기본 자격 증명 체인의 편의성을 유지하면서 더 많은 제어 권한을 얻을 수 있습니다.

# 의 자격 증명 캐싱 AWS SDK for Java 2.x
<a name="credential-caching"></a>

는 자격 증명 캐싱을 AWS SDK for Java 2.x 구현하여 성능을 개선하고 자격 증명 소스에 대한 호출을 줄입니다. 이 섹션에서는 자격 증명 캐싱의 작동 방식과 애플리케이션에 맞게 자격 증명을 구성하는 방법을 설명합니다.

## 자격 증명 공급자 캐싱 이해
<a name="understanding-credential-provider-caching"></a>

SDK for Java 2.x의 자격 증명 공급자는 다양한 캐싱 전략을 사용합니다.
+ **내부 자격 증명 캐싱**: 많은 공급자가 검색한 자격 증명을 캐시합니다.
+ **자동 새로 고침**: 캐시된 자격 증명이 있는 공급자는 새로 고침 메커니즘을 구현합니다.

### 내부 자격 증명 캐싱이 있는 공급자
<a name="providers-with-internal-caching"></a>

다음 자격 증명 공급자는 새 인스턴스를 만들 때도 자격 증명을 내부적으로 캐시합니다.
+ **인스턴스 프로파일 자격 증명 공급자**: Amazon EC2 메타데이터 서비스에서 자격 증명을 캐시합니다.
+ **컨테이너 자격 증명 공급자**: 컨테이너 메타데이터 엔드포인트에서 자격 증명을 캐시합니다.
+ **STS 기반 공급자**: AWS Security Token Service (STS)에서 임시 자격 증명을 캐시합니다.
+ **웹 ID 토큰 공급자**: 웹 ID 토큰에서 얻은 자격 증명을 캐시합니다.
+ **프로세스 자격 증명 공급자**: 외부 프로세스에서 자격 증명을 캐시합니다.

### 내부 캐싱이 없는 공급자
<a name="providers-without-caching"></a>

다음 공급자는 내부 캐싱을 구현하지 않습니다.
+ **환경 변수 자격 증명 공급자**
+ **시스템 속성 자격 증명 공급자**
+ **정적 자격 증명 공급자**

## 자격 증명 캐싱 구성
<a name="configuring-credential-caching"></a>

자격 증명 공급자를 구축할 때 캐싱 동작을 사용자 지정할 수 있습니다.

### 기한 경과 시간
<a name="stale-time"></a>

자격 증명이 오래된 것으로 간주되어 새로 고침이 필요한 경우를 제어합니다.

```
.staleTime(Duration.ofMinutes(2))  // Consider stale 2 minutes before expiration.
```

### 미리 가져오기 시간
<a name="prefetch-time"></a>

만료되기 전에 자격 증명 새로 고침을 시작할 시기를 결정합니다.

```
.prefetchTime(Duration.ofMinutes(10))  // Start refresh 10 minutes before expiration.
```

### 비동기식 업데이트
<a name="async-updates"></a>

백그라운드 자격 증명 새로 고침을 사용합니다.

```
.asyncCredentialUpdateEnabled(true)  // Refresh credentials in background thread.
```

### 세션 지속 시간
<a name="session-duration"></a>

STS 기반 공급자의 경우는 임시 자격 증명이 유효한 기간을 제어합니다.

```
.refreshRequest(r -> r.durationSeconds(3600))  // 1 hour session.
```

## 자격 증명 구성 캐싱 예제
<a name="example-optimized-sts-config"></a>

자격 증명 공급자 구현을 위한 캐싱을 구성하는 예로 SDK가 백그라운드 스레드를 사용하여 자격 증명이 만료되기 전에 미리 가져오도록(사전 검색) 할 수 있습니다. 이렇게 하면 새 자격 증명을 검색하는 차단 직접 호출을 방지할 수 있습니다.

다음은 빌더에서 `[asyncCredentialUpdateEnabled](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/auth/StsCredentialsProvider.BaseBuilder.html#asyncCredentialUpdateEnabled(java.lang.Boolean))` 속성을 `true`로 설정하여 백그라운드 스레드를 사용해 자격 증명을 미리 가져오는 `[StsAssumeRoleCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/auth/StsAssumeRoleCredentialsProvider.html)`를 만드는 예제입니다.

```
StsAssumeRoleCredentialsProvider provider = StsAssumeRoleCredentialsProvider.builder()
    .refreshRequest(r -> r
        .roleArn("arn:aws:iam::111122223333:role/example-role")
        .roleSessionName("example-session")
        .durationSeconds(3600))  // 1 hour session
    .staleTime(Duration.ofMinutes(5))  // Consider stale 5 minutes before expiration
    .prefetchTime(Duration.ofMinutes(10))  // Start refresh 10 minutes before expiration
    .asyncCredentialUpdateEnabled(true)  // Refresh in background
    .build();

S3Client s3 = S3Client.builder()
    .credentialsProvider(provider)
    .build();
```

에서 작업을 `s3Client` 처음 호출하면 `[AssumeRoleRequest](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/model/AssumeRoleRequest.html)`가 AWS Security Token Service (STS)로 전송됩니다. STS는 15분(900초) 동안 유효한 임시 자격 증명을 반환합니다. `s3Client` 인스턴스는 15분이 경과하기 전에 새로 고침될 때까지 캐시된 자격 증명을 사용합니다. 기본적으로 SDK는 현재 세션의 만료 시간 5분\$11분 전에 새 세션에 대한 새 자격 증명을 검색하려고 시도합니다. 사전 가져오기 기간에는 `[prefetchTime](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/auth/StsCredentialsProvider.BaseBuilder.html#prefetchTime(java.time.Duration))` 및 `[staleTime](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/auth/StsCredentialsProvider.BaseBuilder.html#staleTime(java.time.Duration))` 속성을 사용하여 구성할 수 있습니다.

다음과 같은 세션 기반 자격 증명 공급자를 유사하게 구성할 수 있습니다.
+ `StsWebIdentityTokenFileCredentialsProvider`
+ `StsGetSessionTokenCredentialsProvider`
+ `StsGetFederationTokenCredentialsProvider`
+ `StsAssumeRoleWithWebIdentityCredentialsProvider`
+ `StsAssumeRoleWithSamlCredentialsProvider`
+ `StsAssumeRoleCredentialsProvider`
+ `DefaultCredentialsProvider`(세션을 사용하는 자격 증명 공급자에 위임하는 경우)
+ `ProcessCredentialsProvider`
+ `WebIdentityTokenFileCredentialsProvider`
+ `ContainerCredentialsProvider`
+ `InstanceProfileCredentialsProvider`

자격 증명 캐싱을 이해하면 작업 시 애플리케이션의 성능과 신뢰성을 최적화하는 데 도움이 됩니다 AWS 서비스.

# 에서 특정 자격 증명 공급자 지정 AWS SDK for Java 2.x
<a name="credentials-providers"></a>

기본 자격 증명 공급자 체인은 많은 시나리오에서 편리하지만 자격 증명 공급자를 명시적으로 지정하면 인증 동작, 성능 및 보안을 더 잘 제어할 수 있습니다.

자격 증명 공급자를 지정하려는 이유는 다음과 같습니다.
+ 기본 공급자 체인은 여러 소스를 순차적으로 확인하여 지연 시간을 추가할 수 있습니다.

  ```
  // The default provider chain checks might check multiple sources until it finds
  // sufficient configuration.
  S3Client s3Client = S3Client.builder().build();
  
  // You can specify exactly where to look.
  S3Client optimizedClient = S3Client.builder()
      .credentialsProvider(InstanceProfileCredentialsProvider.create())
      .build();
  ```
+ 자격 증명 구성에 액세스하려면 비표준 위치를 사용해야 합니다.

  ```
  // Use configuration from a custom file location.
  S3Client s3Client = S3Client.builder()
      .credentialsProvider(ProfileCredentialsProvider.builder()
              .profileFile(ProfileFile.builder()
                      .content(Paths.get("/custom/path/to/configuration/file"))
                      .type(ProfileFile.Type.CONFIGURATION) // Expects all non-default profiles to be prefixed with "profile".
                      .build())
              .profileName("custom")
              .build())
      .build();
  ```
+ 다양한 서비스 클라이언트에서 다른 자격 증명을 사용합니다. 예를 들어 애플리케이션이 여러 AWS 계정에 액세스해야 하거나 다른 서비스에 대해 다른 권한을 사용해야 하는 경우:

  ```
  // S3 client using one set of credentials.
  S3Client s3Client = S3Client.builder()
      .credentialsProvider(ProfileCredentialsProvider.create("s3-readonly"))
      .build();
  
  // DynamoDB client using different credentials.
  DynamoDbClient dynamoDbClient = DynamoDbClient.builder()
      .credentialsProvider(ProfileCredentialsProvider.create("dynamodb-admin"))
      .build();
  ```
+ 자격 증명 새로 고침 동작 제어:

  ```
  // Create a provider with custom refresh behavior.
  StsAssumeRoleCredentialsProvider customRefreshProvider = 
      StsAssumeRoleCredentialsProvider.builder()
          .refreshRequest(AssumeRoleRequest.builder()
              .roleArn("arn:aws:iam::123456789012:role/my-role")
              .roleSessionName("custom-session")
              .build())
          .stsClient(StsClient.create())
          .asyncCredentialUpdateEnabled(true) // Use a background thread to prefetch credentials.
          .build();
  
  S3Client s3Client = S3Client.builder()
      .credentialsProvider(customRefreshProvider)
      .build();
  ```

# 에서 AWS 공유 구성 프로필 사용 AWS SDK for Java 2.x
<a name="credentials-profiles"></a>

공유 `config` 및 `credentials` 파일을 사용하여 여러 프로필을 설정할 수 있습니다. 이렇게 하면 애플리케이션에서 여러 자격 증명 구성 세트를 사용할 수 있습니다. `[default]` 프로필은 앞서 언급한 바 있습니다. SDK는 [ProfileCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/ProfileCredentialsProvider.html) 클래스를 사용하여 공유 `credentials` 파일에 정의된 프로필에서 설정을 로드합니다.

다음 코드 조각은 이름이 `my_profile`로 지정된 프로필의 일부로 정의된 설정을 사용하는 서비스 클라이언트를 빌드하는 방법을 보여줍니다.

```
Region region = Region.US_WEST_2;
DynamoDbClient ddb = DynamoDbClient.builder()
      .region(region)
      .credentialsProvider(ProfileCredentialsProvider.create("my_profile"))
      .build();
```

## 다른 프로필을 기본값으로 설정
<a name="set-a-custom-profile-as-the-default"></a>

`[default]` 프로필 이외의 프로필을 애플리케이션의 기본 프로필로 설정하려면 `AWS_PROFILE` 환경 변수를 사용자 지정 프로필 이름으로 설정합니다.

Linux, macOS 또는 Unix에서 이러한 변수를 설정하려면 `export`를 사용합니다.

```
export AWS_PROFILE="other_profile"
```

Windows에서 이러한 변수를 설정하려면 `set`을 사용합니다.

```
set AWS_PROFILE="other_profile"
```

또는 `aws.profile` Java 시스템 속성을 프로필 이름으로 설정합니다.

## 프로필 자격 증명 다시 로드
<a name="profile-reloading"></a>

빌더에 프로필 자격 증명을 다시 로드하는 `profileFile()` 메서드가 있는 모든 자격 증명 공급자를 구성할 수 있습니다. 이러한 자격 증명 프로필 클래스는 `ProfileCredentialsProvider`, `DefaultCredentialsProvider`, `InstanceProfileCredentialsProvider`, 및 `ProfileTokenProvider.`입니다.

**참고**  
프로필 자격 증명 재로드는 프로필 파일의 다음 설정(`aws_access_key_id`, `aws_secret_access_key` 및 `aws_session_token`)에서만 작동합니다.  
`region`, `sso_session`, `sso_account_id`, 및 `source_profile` 등의 설정은 무시됩니다.

지원되는 자격 증명 공급자가 프로필 설정을 다시 로드하도록 구성하려면 `profileFile()` 빌더 메서드에 [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/profiles/ProfileFileSupplier.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/profiles/ProfileFileSupplier.html) 인스턴스를 제공하세요. 다음 코드 예제는 `[default]` 프로필에서 자격 증명 설정을 다시 로드하는 `ProfileCredentialsProvider`를 보여줍니다.

```
ProfileCredentialsProvider provider = ProfileCredentialsProvider
    .builder()
    .profileFile(ProfileFileSupplier.defaultSupplier())
    .build();

// Set up a service client with the provider instance.
DynamoDbClient dynamoDbClient = DynamoDbClient.builder()
                    .region(Region.US_EAST_1)
                    .credentialsProvider(provider)
                    .build();

/*
    Before dynamoDbClient makes a request, it reloads the credentials settings 
    by calling provider.resolveCredentials().
*/
```

`ProfileCredentialsProvider.resolveCredentials()`가 호출되면 Java용 SDK가 설정을 다시 로드합니다. `ProfileFileSupplier.defaultSupplier()`는 SDK에서 제공하는 `ProfileFileSupplier`의 [여러 편의 구현](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/profiles/ProfileFileSupplier.html) 중 하나입니다. 사용 사례에 필요한 경우 자체 구현을 제공할 수 있습니다.

다음 예제는 `ProfileFileSupplier.reloadWhenModified()` 편의 메서드를 사용하는 방법을 보여줍니다. `reloadWhenModified()`는 `Path` 매개 변수를 사용하여 표준 `~/.aws/credentials`(또는 `config`) 위치가 아닌 구성의 소스 파일을 유연하게 지정할 수 있습니다.

SDK에서 파일 내용이 수정되었다고 판단하는 경우에만 `resolveCredentials()`가 호출될 때 설정이 다시 로드됩니다.

```
Path credentialsFilePath = ...

ProfileCredentialsProvider provider = ProfileCredentialsProvider
    .builder()
    .profileFile(ProfileFileSupplier.reloadWhenModified(credentialsFilePath, ProfileFile.Type.CREDENTIALS))
    .profileName("my-profile")
    .build();
/*
    A service client configured with the provider instance calls provider.resolveCredential()
    before each request.
*/
```

`ProfileFileSupplier.aggregate()` 메서드는 여러 구성 파일의 내용을 병합합니다. 파일을 `resolveCredentials()`를 호출할 때마다 다시 로드할지 아니면 파일을 처음 읽을 때 파일 설정을 고정할지를 결정합니다.

다음 예제는 프로필 설정이 포함된 두 파일의 설정을 병합하는 `DefaultCredentialsProvider`를 보여줍니다. SDK는 `resolveCredentials()`가 호출되고 설정이 변경될 때마다 `credentialsFilePath` 변수가 가리키는 파일에 설정을 다시 로드합니다. `profileFile` 객체의 설정은 동일하게 유지됩니다.

```
Path credentialsFilePath = ...;
ProfileFile profileFile = ...;

DefaultCredentialsProvider provider = DefaultCredentialsProvider
        .builder()
        .profileFile(ProfileFileSupplier.aggregate(
                ProfileFileSupplier.reloadWhenModified(credentialsFilePath, ProfileFile.Type.CREDENTIALS),
                ProfileFileSupplier.fixedProfileFile(profileFile)))
        .profileName("my-profile")
        .build();
/*
    A service client configured with the provider instance calls provider.resolveCredential()
    before each request.
*/
```

# 를 사용하여 외부 프로세스에서 자격 증명 로드 AWS SDK for Java 2.x
<a name="credentials-process"></a>

**주의**  
다음은 외부 프로세스에서 자격 증명을 소싱하는 방법을 설명합니다. 이는 잠재적으로 위험할 수 있으므로 주의해서 진행하세요. 가능하면 다른 자격 증명 공급자를 사용하는 것이 좋습니다. 이 옵션을 사용하는 경우 운영 체제의 보안 모범 사례를 사용하여 가능하면 `config` 파일을 잠그도록 해야 합니다.  
사용자 지정 자격 증명 도구가 `StdErr`에 비밀 정보를 기록하지 않도록 하세요. SDKs 이러한 정보를 AWS CLI 캡처하고 로깅하여 권한이 없는 사용자에게 노출될 수 있습니다.

Java 2.x용 SDK를 사용하면 외부 프로세스로부터 사용자 지정 사용 사례에 대한 임시 자격 증명을 얻을 수 있습니다. 이 기능을 구성하는 방법에는 두 가지가 있습니다.

## `credential_process` 설정 사용
<a name="credentials-credential_process"></a>

임시 자격 증명을 제공하는 방법이 있는 경우 `credential_process` 설정을 프로필 정의의 일부로 `config` 파일에 추가하여 통합할 수 있습니다. 지정하는 값은 명령 파일의 전체 경로를 사용해야 합니다. 파일 경로에 공백이 있는 경우 따옴표로 감싸야 합니다.

SDK가 명령을 그대로 정확하게 호출한 후 `stdout`에서 JSON 데이터를 읽어옵니다.

다음 예에서는 공백이 없는 파일 경로와 공백이 있는 파일 경로에 이 설정을 사용하는 방법을 보여줍니다.

------
#### [ Linux/macOS ]

**파일 경로에 공백이 없음**  

```
[profile process-credential-profile]
credential_process = /path/to/credential/file/credential_file.sh --custom-command custom_parameter
```

**파일 경로에 공백**  

```
[profile process-credential-profile]
credential_process = "/path/with/space to/credential/file/credential_file.sh" --custom-command custom_parameter
```

------
#### [ Windows ]

**파일 경로에 공백이 없음**  

```
[profile process-credential-profile]
credential_process = C:\Path\To\credentials.cmd --custom_command custom_parameter
```

**파일 경로에 공백**  

```
[profile process-credential-profile]
credential_process = "C:\Path\With Space To\credentials.cmd" --custom_command custom_parameter
```

------

다음 코드 조각은 이름이 `process-credential-profile`로 지정된 프로필의 일부로 정의된 임시 자격 증명을 사용하는 서비스 클라이언트를 빌드하는 방법을 보여줍니다.

```
Region region = Region.US_WEST_2;
S3Client s3Client = S3Client.builder()
      .region(region)
      .credentialsProvider(ProfileCredentialsProvider.create("process-credential-profile"))
      .build();
```

외부 프로세스를 임시 자격 증명의 소스로 사용하는 방법에 대한 자세한 내용은 SDK 및 도구 참조 안내서의 [프로세스 자격 증명 섹션을](https://docs.aws.amazon.com/sdkref/latest/guide/feature-process-credentials.html) 참조하세요. AWS SDKs 

## `ProcessCredentialsProvider` 사용
<a name="credentials-procredprovider"></a>

`config` 파일의 설정을 사용하는 대신 SDK의 `[ProcessCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/ProcessCredentialsProvider.html)`를 사용하여 Java로 임시 자격 증명을 로드할 수 있습니다.

다음 예제는 `ProcessCredentialsProvider`를 사용하여 외부 프로세스를 지정하고 임시 자격 증명을 사용하는 서비스 클라이언트를 구성하는 다양한 버전의 방법을 보여줍니다.

------
#### [ Linux/macOS ]

**파일 경로에 공백이 없음**  

```
ProcessCredentialsProvider credentials = 
    ProcessCredentialsProvider
        .builder()
        .command("/path/to/credentials.sh optional_param1 optional_param2")
        .build();

S3Client s3 = S3Client.builder()
                      .region(Region.US_WEST_2)
                      .credentialsProvider(credentials)
                      .build();
```

**파일 경로에 공백**  

```
ProcessCredentialsProvider credentials = 
    ProcessCredentialsProvider
        .builder()
        .command("/path\\ with\\ spaces\\ to/credentials.sh optional_param1 optional_param2")
        .build();

S3Client s3 = S3Client.builder()
                      .region(Region.US_WEST_2)
                      .credentialsProvider(credentials)
                      .build();
```

------
#### [ Windows ]

**파일 경로에 공백이 없음**  

```
ProcessCredentialsProvider credentials = 
    ProcessCredentialsProvider
        .builder()
        .command("C:\\Path\\To\\credentials.exe optional_param1 optional_param2")
        .build();

S3Client s3 = S3Client.builder()
                      .region(Region.US_WEST_2)
                      .credentialsProvider(credentials)
                      .build();
```

**파일 경로에 공백**  

```
ProcessCredentialsProvider credentials = 
    ProcessCredentialsProvider
        .builder()
        .command("\"C:\\Path\\With Spaces To\\credentials.exe\" optional_param1 optional_param2")
        .build();

S3Client s3 = S3Client.builder()
                      .region(Region.US_WEST_2)
                      .credentialsProvider(credentials)
                      .build();
```

------

## 인증 시 IAM Roles Anywhere 사용
<a name="credentials-iam-roles-anywhere"></a>

[IAM Roles Anywhere](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/introduction.html)는 외부에서 실행되는 워크로드에 대한 임시 AWS 자격 증명을 얻을 수 AWS 서비스 있는 입니다 AWS. 온프레미스 또는 기타 클라우드 환경에서 AWS 리소스에 안전하게 액세스할 수 있습니다.

IAM Roles Anywhere로 요청을 인증하려면 먼저 필요한 정보를 수집하고 [자격 증명 도우미 도구](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/credential-helper.html)를 다운로드해야 합니다. IAM Roles Anywhere 사용 설명서의 [시작하기](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/getting-started.html) 설명에 따라 필요한 아티팩트를 만들 수 있습니다.

SDK for Java에는 IAM Roles Anywhere에서 임시 자격 증명을 검색할 수 있는 전용 자격 증명 공급자가 없지만, 자격 증명 도우미 도구를 옵션 중 하나와 함께 사용하여 [외부 프로세스에서 자격 증명을 검색](#credentials-process)할 수 있습니다.

### 프로파일에서 `credential_process` 설정 사용
<a name="credentials-iam-roles-anywhere-config"></a>

공유 구성 파일의 다음 코드 조각은 `credential_process` 설정을 `roles_anywhere` 사용하는 AWS 라는 프로필을 보여줍니다.

```
[profile roles_anywhere]
credential_process = ./aws_signing_helper credential-process \
  --certificate /path/to/certificate \
  --private-key /path/to/private-key \
  --trust-anchor-arn arn:aws:rolesanywhere:region:account:trust-anchor/TA_ID \
  --profile-arn arn:aws:rolesanywhere:region:account:profile/PROFILE_ID \
  --role-arn arn:aws:iam::account:role/role-name-with-path
```

모든 아티팩트를 조합한 후 빨간색으로 표시된 텍스트를 값으로 대체해야 합니다. 설정의 첫 번째 요소인 `aws_signing_helper`는 자격 증명 도우미 도구의 실행 파일이고 `credential-process`는 명령입니다.

다음 코드와 같이 `roles_anywhere` 프로파일을 사용하도록 서비스 클라이언트를 구성하면 SDK는 임시 자격 증명을 캐시하고 만료되기 전에 새로 고침합니다.

```
S3Client s3Client = S3Client.builder()
    .credentialsProvider(ProfileCredentialsProvider.builder()
        .profileName("roles_anywhere").build())
    .build();
```

### `ProcessCredentialsProvider` 구성
<a name="credentials-iam-roles-anywhere-process"></a>

다음 그림과 같이 프로파일 설정을 사용하는 대신 `ProcessCredentialsProvider`에서 코드 전용 접근 방식을 사용할 수 있습니다.

```
ProcessCredentialsProvider processCredentialsProvider = ProcessCredentialsProvider.builder()
    .command("""
            ./aws_signing_helper credential-process \
            --certificate /path/to/certificate \
            --private-key /path/to/private-key \
            --trust-anchor-arn arn:aws:rolesanywhere:region:account:trust-anchor/TA_ID \
            --profile-arn arn:aws:rolesanywhere:region:account:profile/PROFILE_ID \
            --role-arn arn:aws:iam::account:role/role-name-with-path
        """).build();

S3Client s3Client = S3Client.builder()
    .credentialsProvider(processCredentialsProvider)
    .build();
```

모든 아티팩트를 수집한 후 빨간색으로 표시된 텍스트를 값으로 대체합니다.

# 를 사용하여 코드에 자격 증명 제공 AWS SDK for Java 2.x
<a name="credentials-explicit"></a>

기본 자격 증명 체인이나 특정 또는 사용자 지정 공급자 또는 공급자 체인이 애플리케이션에 작동하지 않는 경우 코드에서 직접 임시 자격 증명을 제공할 수 있습니다. 위에[ 설명된](credentials-temporary.md#credentials-temporary-from-portal) [IAM 역할 자격 증명](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtogetcredentials.html) 또는 AWS Security Token Service ()에서 검색된 임시 자격 증명일 수 있습니다AWS STS. 를 사용하여 임시 자격 증명을 검색한 경우 다음 코드 예제와 같이 AWS 서비스 클라이언트에 AWS STS제공합니다.

1. `StsClient.assumeRole()`를 호출하여 역할을 맡으세요.

1. [StaticCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/StaticCredentialsProvider.html) 객체를 생성하고 `AwsSessionCredentials` 객체와 함께 제공하세요.

1. `StaticCredentialsProvider`를 사용하여 클라이언트 빌더를 구성하고 클라이언트를 빌드합니다.

다음 예시에서는 IAM 수임 역할에 AWS STS 대해에서 반환한 임시 자격 증명을 사용하여 Amazon S3 서비스 클라이언트를 생성합니다.

```
    // The AWS IAM Identity Center identity (user) who executes this method does not have permission to list buckets.
    // The identity is configured in the [default] profile.
    public static void assumeRole(String roleArn, String roleSessionName) {
        // The IAM role represented by the 'roleArn' parameter can be assumed by identities in two different accounts
        // and the role permits the user to only list buckets.

        // The SDK's default credentials provider chain will find the single sign-on settings in the [default] profile.
        // The identity configured with the [default] profile needs permission to call AssumeRole on the STS service.
        try {
            Credentials tempRoleCredentials;
            try (StsClient stsClient = StsClient.create()) {
                AssumeRoleRequest roleRequest = AssumeRoleRequest.builder()
                        .roleArn(roleArn)
                        .roleSessionName(roleSessionName)
                        .build();

                AssumeRoleResponse roleResponse = stsClient.assumeRole(roleRequest);
                tempRoleCredentials = roleResponse.credentials();
            }
            // Use the following temporary credential items for the S3 client.
            String key = tempRoleCredentials.accessKeyId();
            String secKey = tempRoleCredentials.secretAccessKey();
            String secToken = tempRoleCredentials.sessionToken();

            // List all buckets in the account associated with the assumed role
            // by using the temporary credentials retrieved by invoking stsClient.assumeRole().
            StaticCredentialsProvider staticCredentialsProvider = StaticCredentialsProvider.create(
                    AwsSessionCredentials.create(key, secKey, secToken));
            try (S3Client s3 = S3Client.builder()
                    .credentialsProvider(staticCredentialsProvider)
                    .build()) {
                List<Bucket> buckets = s3.listBuckets().buckets();
                for (Bucket bucket : buckets) {
                    System.out.println("bucket name: " + bucket.name());
                }
            }
        } catch (StsException | S3Exception e) {
            logger.error(e.getMessage());
            System.exit(1);
        }
    }
```

## 권한 세트
<a name="credentials-explicit-permission-set"></a>

에 정의된 다음 권한 세트를 AWS IAM Identity Center 사용하면 자격 증명(사용자)이 다음 두 작업을 수행할 수 있습니다.

1. Amazon Simple Storage Service `GetObject` 운영.

1.  AWS Security Token Service의 `AssumeRole` 작업.

역할을 맡지 않으면 예제에 표시된 `s3.listBuckets()` 메서드가 실패합니다.

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

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"s3:GetObject",
				"sts:AssumeRole"
			],
			"Resource": [
				"*"
			]
		}
	]
}
```

------

## 수임된 역할
<a name="credentials-explicit-role-to-assume"></a>

### 수임된 역할 권한 정책
<a name="credentials-explicit-role-policy"></a>

다음 권한 정책은 이전 예제에 수임된 역할에 연결되어 있습니다. 이 권한 정책은 역할과 동일한 계정의 모든 버킷을 나열하는 기능을 허용합니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

------

### 수임된 역할 신뢰 정책
<a name="credentials-explicit-trust-policy"></a>

다음 권한 정책은 이전 예제에 수임된 역할에 연결되어 있습니다. 이 정책을 통해 두 계정의 ID(사용자)가 역할을 수임할 수 있습니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333:root",
                    "arn:aws:iam::555555555555:root"
                ]
            },
            "Action": "sts:AssumeRole",
            "Condition": {}
        }
    ]
}
```

------

# SDK for Java 2.x를 사용하여 Amazon EC2에서 IAM 역할 자격 증명 읽기
<a name="ec2-iam-roles"></a>

 IAM 역할을 사용하여 EC2 인스턴스에서 실행되고 AWS CLI 또는 AWS API 요청을 수행하는 애플리케이션의 임시 자격 증명을 관리할 수 있습니다. 이것은 EC2 인스턴스 내에 액세스 키를 저장하는 경우에 바람직한 방법입니다. EC2 인스턴스에 AWS 역할을 할당하고 모든 애플리케이션에서 사용할 수 있도록 하려면 인스턴스에 연결된 인스턴스 프로파일을 생성합니다. 인스턴스 프로필에는 역할이 포함되어 있으며 EC2 인스턴스에서 실행되는 프로그램이 임시 보안 인증을 얻을 수 있습니다. 자세한 정보는 *IAM 사용 설명서*의 [IAM 역할을 사용하여 Amazon EC2 인스턴스에서 실행되는 애플리케이션에 권한 부여](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html)를 참조하세요.

이 주제에서는 EC2 인스턴스에서 실행되도록 Java 애플리케이션을 설정하고가 IAM 역할 자격 증명을 획득 AWS SDK for Java 2.x 하도록 설정하는 방법에 대한 정보를 제공합니다.

## 환경에서 IAM 역할 자격 증명 획득
<a name="default-provider-chain"></a>

애플리케이션이 `create` 메서드(또는 `builder().build()` 메서드)를 사용하여 AWS 서비스 클라이언트를 생성하는 경우 Java용 SDK는 *기본 자격 증명 공급자 체인*을 사용합니다. 기본 자격 증명 공급자 체인은 SDK가 임시 자격 증명과 교환할 수 있는 구성 요소를 위한 실행 환경을 검색합니다. 이 [의 기본 자격 증명 공급자 체인 AWS SDK for Java 2.x](credentials-chain.md) 섹션에서는 전체 검색 프로세스를 설명합니다.

기본 공급자 체인의 마지막 단계는 애플리케이션이 Amazon EC2 인스턴스에서 실행되는 경우에만 사용할 수 있습니다. 이 단계에서는 SDK가 `InstanceProfileCredentialsProvider`를 사용하여 EC2 인스턴스 프로필에 정의된 IAM 역할을 읽습니다. 그런 다음 SDK는 해당 IAM 역할에 대한 임시 보안 인증을 획득합니다.

이러한 자격 증명은 임시용이므로 기간이 경과되면 만료되지만, `InstanceProfileCredentialsProvider`는 가져온 자격 증명을 통해 계속 AWS에 액세스할 수 있도록 자격 증명을 정기적으로 새로 고칩니다.

## 프로그래밍 방식으로 IAM 역할 자격 증명 획득
<a name="programmatic-configuration-for-IAM-role"></a>

최종적으로 EC2에서 `InstanceProfileCredentialsProvider`를 사용하는 기본 자격 증명 공급자 체인의 대안으로 `InstanceProfileCredentialsProvider`를 사용하여 서비스 클라이언트를 명시적으로 구성할 수 있습니다. 이 접근 방법은 다음 코드 조각에 나와 있습니다.

```
S3Client s3 = S3Client.builder()
       .credentialsProvider(InstanceProfileCredentialsProvider.create())
       .build();
```

## IAM 역할 자격 증명을 안전하게 획득
<a name="securely-read-IAM-role_credentials"></a>

기본적으로 EC2 인스턴스는 구성된 IAM 역할과 같은 정보에 SDK의 `InstanceProfileCredentialsProvider`가 액세스할 수 있도록 [IMDS](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)(인스턴스 메타데이터 서비스)를 실행합니다. EC2 인스턴스는 기본적으로 2가지 버전의 IMDS를 실행합니다.
+ 인스턴스 메타데이터 서비스 버전 1(IMDSv1) – 요청/응답 방법
+ 인스턴스 메타데이터 서비스 버전 2(IMDSv2) – 세션 지향 방법

[IMDSv2는 IMDSv1보다 더 안전한 접근 방식](https://aws.amazon.com/blogs/security/defense-in-depth-open-firewalls-reverse-proxies-ssrf-vulnerabilities-ec2-instance-metadata-service/)입니다.

기본적으로 Java SDK는 먼저 IMDSv2를 시도하여 IAM 역할을 가져오지만, 실패하면 IMDSv1을 시도합니다. 그러나 IMDSv1은 덜 안전하므로 에서는 IMDSv2만 사용하고 SDK가 IMDSv1을 시도하지 못하도록 비활성화하는 것이 AWS 좋습니다.

보다 안전한 접근 방식을 사용하려면 다음 설정 중 하나에 `true` 값을 제공하여 SDK가 IMDSv1을 사용하지 않도록 설정합니다.
+ 환경 변수: `AWS_EC2_METADATA_V1_DISABLED`
+ JVM 시스템 속성: aws.`disableEc2MetadataV1`
+ 공유 구성 파일 설정: `ec2_metadata_v1_disabled`

이러한 설정 중 하나를 `true`로 설정하면 초기 IMDSv2 직접 호출이 실패할 경우 SDK는 IMDSv1을 사용하여 IMDS 역할 자격 증명을 로드하지 않습니다.