

# 아웃바운드 ID 페더레이션 시작하기
<a name="id_roles_providers_outbound_getting_started"></a>

이 가이드에서는 AWS 계정에 대해 아웃바운드 ID 페더레이션을 활성화하고 첫 번째 JSON 웹 토큰(JWT)([GetWebIdentityToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetWebIdentityToken.html) API 사용)을 가져오는 방법을 보여줍니다. 기능을 활성화하고, 외부 서비스와 신뢰 관계를 설정하고, IAM 권한을 구성하고, AWS CLI 또는 AWS SDK for Python(Boto3)을 사용하여 토큰을 요청합니다.

## 사전 조건
<a name="outbound-federation-prerequisites"></a>

시작하기 전에 다음을 갖추었는지 확인하세요.
+ 최신 버전의 AWS CLI 또는 Python 3.8(또는 이상) 및 Boto3 설치(AWSSDK 예시용)
+ 신뢰 관계를 구성할 수 있는 외부 서비스 계정(예: 외부 클라우드 공급자, SaaS 공급자 또는 테스트 애플리케이션)

**참고**  
`GetWebIdentityToken` API는 STS Global 엔드포인트에서 사용할 수 없습니다.
`GetWebIdentityToken` API에 의해 생성된 JSON 웹 토큰(JWT)은 AWS([AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API를 통해)에 대한 OpenID Connect(OIDC) 페더레이션에 사용할 수 없습니다.

## 계정에 대한 아웃바운드 ID 페더레이션 활성화
<a name="enable-outbound-federation"></a>

토큰을 요청하려면 먼저 아웃바운드 ID 페더레이션을 활성화해야 합니다. AWS Management Console을 사용하거나 프로그래밍 방식으로 [EnableOutboundWebIdentityFederation](https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableOutboundWebIdentityFederation.html) API를 사용하여 기능을 활성화할 수 있습니다.

### AWS CLI 사용
<a name="enable-using-cli"></a>

```
aws iam enable-outbound-web-identity-federation
```

### AWS SDK for Python 사용
<a name="enable-using-sdk"></a>

```
import boto3

# Create IAM client
iam_client = boto3.client('iam')

# Enable outbound identity federation
response = iam_client.enable_outbound_web_identity_federation()
print(f"Feature enabled. Issuer URL: {response['IssuerUrl']}")
print(f"Status: {response['Status']}")
```

### AWS 콘솔 사용
<a name="enable-using-console"></a>

IAM으로 이동하여 왼쪽 탐색 메뉴의 **액세스 관리** 섹션에서 **계정 설정**을 선택합니다.

![\[alt text not found\]](http://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/images/outbound-screen-1.png)


기능을 활성화한 후 계정별 발급자 URL을 기록해 둡니다. 외부 서비스에서 신뢰 관계를 구성할 때 이 URL을 사용합니다. [GetOutboundWebIdentityFederationInfo](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetOutboundWebIdentityFederationInfo.html) API를 사용하여 필요에 따라 이 발급자 URL을 검색할 수도 있습니다.

![\[alt text not found\]](http://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/images/outbound-screen-2.png)


## 외부 서비스에서 신뢰 관계 설정
<a name="establish-trust-relationship"></a>

AWS 계정에서 발급한 토큰을 신뢰하고 수락하도록 외부 서비스를 구성합니다. 구체적인 단계는 서비스에 따라 다르지만 일반적으로 다음을 포함합니다.
+ AWS 계정 발급자 URL을 신뢰할 수 있는 ID 공급자로 등록
+ 검증할 클레임 구성(대상, 주제 패턴)
+ 토큰 클레임을 외부 서비스의 권한에 매핑

자세한 구성 지침은 외부 서비스 설명서를 참조하세요.

## IAM 권한 구성
<a name="configure-iam-permissions"></a>

[GetWebIdentityToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetWebIdentityToken.html) API를 직접 호출할 권한을 부여하는 IAM 정책을 생성하고 토큰을 생성해야 하는 IAM 역할에 정책을 연결합니다.

이 예시 정책은 특정 제한이 있는 토큰 생성에 대한 액세스 권한을 부여합니다. 대상인 ‘https://api.example.com’에 대해서만 토큰을 요청할 수 있으며, 최대 토큰 수명은 5분(300초)입니다. 토큰 속성을 적용하는 데 사용할 수 있는 조건 키 목록은 [IAM 및 AWS STS 조건 컨텍스트 키](reference_policies_iam-condition-keys.md) 섹션을 참조하세요.

### IAM 정책 예제
<a name="example-iam-policy"></a>

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:GetWebIdentityToken",
            "Resource": "*",
            "Condition": {
                "ForAllValues:StringEquals": {
                    "sts:IdentityTokenAudience": "https://api.example.com"
                },
                "NumericLessThanEquals": {
                    "sts:DurationSeconds": 300
                }
            }
        }
    ]
}
```

## 첫 번째 JSON 웹 토큰(JWT) 요청
<a name="request-first-jwt"></a>

[GetWebIdentityToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetWebIdentityToken.html) API를 사용하여 JSON 웹 토큰을 요청할 수 있습니다. API를 직접적으로 호출할 때 다음 파라미터를 지정할 수 있습니다.
+ **Audience(필수):** 토큰의 의도된 수신자입니다. 이 값은 JWT의 ‘aud’ 클레임을 채웁니다. 외부 서비스는 토큰이 의도한 것인지 확인하기 위해 이 클레임을 검증합니다.
+ **SigningAlgorithm(필수):** 토큰에 서명하는 데 사용되는 암호화 알고리즘입니다. 유효한 값은 ES384와 RS256입니다. 최적의 보안과 성능이 요구되는 경우 ES384를 사용하고, ECDSA를 지원하지 않는 시스템과의 광범위한 호환성이 요구되는 경우 RS256을 사용합니다.
+ **DurationSeconds(선택 사항):** 초 단위의 토큰 수명입니다. 유효한 값의 범위는 60\$13600입니다. 기본값은 300(5분)입니다. 보안을 강화하려면 토큰 수명을 단축하는 것이 좋습니다.
+ **Tags(선택 사항):** 토큰에 사용자 지정 클레임으로 포함할 키-값 페어의 목록입니다. 외부 서비스는 이러한 클레임을 세분화된 권한 부여에 사용할 수 있습니다.

API는 다음 필드를 반환합니다.
+ **IdentityToken:** base64url 인코딩 문자열로 서명된 JWT입니다. 외부 서비스에 대한 요청에 이 토큰을 포함합니다.
+ **Expiration:** 토큰이 만료될 시점의 UTC 타임스탬프입니다.

### AWS CLI 사용
<a name="using-aws-cli"></a>

```
aws sts get-web-identity-token \
    --audience "https://api.example.com" \
    --signing-algorithm ES384 \
    --duration-seconds 300 \
    --tags Key=team,Value=data-engineering \
           Key=environment,Value=production \
           Key=cost-center,Value=analytics
```

### AWS SDK for Python 사용
<a name="using-aws-sdk-python"></a>

```
import boto3

sts_client = boto3.client('sts')

response = sts_client.get_web_identity_token(
    Audience=['https://api.example.com'],
    DurationSeconds=300,
    SigningAlgorithm='RS256',
    Tags=[
        {'Key': 'team', 'Value': 'data-engineering'},
        {'Key': 'environment', 'Value': 'production'},
        {'Key': 'cost-center', 'Value': 'analytics'}
    ]
)

token = response['WebIdentityToken']
```

JWT를 디코딩하여 PyJWT, Python-jose for Python, Nimbus JOSE\$1JWT for Java, 디버거(예: jwt.io) 등의 표준 JWT 라이브러리를 사용하여 콘텐츠를 검사할 수도 있습니다. 토큰에 포함된 클레임에 대한 자세한 내용은 [토큰 클레임 이해](id_roles_providers_outbound_token_claims.md) 섹션을 참조하세요.

## 외부 서비스와 함께 토큰 사용
<a name="use-token-with-external-service"></a>

토큰을 받은 후 외부 서비스에 대한 요청에 포함합니다. 메서드는 서비스에 따라 다르지만 대부분의 서비스는 권한 부여 헤더에서 토큰을 수락합니다. 외부 서비스는 발급자의 잘 알려진 엔드포인트에서 JWKS 키를 가져오고, 토큰의 서명을 확인하고, AWS 워크로드에 대한 액세스 권한을 부여하기 전에 필수 클레임을 검증하는 토큰 검증 로직을 구현해야 합니다.

## OpenID Connect(OIDC) 엔드포인트에서 검증 키 및 메타데이터 가져오기
<a name="fetch-verification-keys"></a>

AWS 계정의 고유한 발급자 URL은 토큰 확인에 필요한 검증 키와 메타데이터가 포함된 OpenID Connect(OIDC) 검색 엔드포인트를 호스팅합니다.

OIDC 검색 엔드포인트 URL에는 일부 공급자가 토큰을 확인하는 데 사용하는 메타데이터가 포함되어 있습니다. 다음에서 사용할 수 있습니다.

```
{issuer_url}/.well-known/openid-configuration
```

JWKS(JSON 웹 키 세트) 엔드포인트에는 토큰 서명을 확인하는 데 사용되는 키가 포함되어 있습니다. 다음에서 사용할 수 있습니다.

```
{issuer_url}/.well-known/jwks.json
```

### curl을 사용하여 JWKS 가져오기
<a name="fetch-jwks-curl"></a>

```
curl https://{issuer_url}/.well-known/jwks.json
```

응답:

```
{
  "keys": [
    {
      "kty": "EC",
      "use": "sig",
      "kid": "key-id-1",
      "alg": "ES384",
      "crv": "P-384",
      "x": "base64-encoded-x-coordinate",
      "y": "base64-encoded-y-coordinate"
    },
    {
      "kty": "RSA",
      "use": "sig",
      "kid": "key-id-2",
      "n": "base64-encoded-modulus",
      "e": "AQAB"
    }
  ]
}
```

### AWS SDK for Python 사용
<a name="fetch-using-sdk"></a>

```
import requests

# Fetch Openid Configuration
open_id_config_response = requests.get("https://{issuer_url}/.well-known/openid-configuration")
open_id_config = open_id_config_response.json()

# Fetch JWKS
jwks_response = requests.get("https://{issuer_url}/.well-known/jwks.json")
jwks = jwks_response.json()
```

토큰을 검증할 때마다 키를 가져올 필요가 없도록 이러한 키를 캐싱하는 것이 좋습니다.

### 필수 클레임 검증
<a name="essential-claim-validations"></a>
+ **Subject (sub):** 제목 클레임에 예상 IAM 위탁자 ARN 패턴이 포함되어 있는지 확인합니다.
+ **Expiration (exp):** 토큰이 만료되지 않았는지 확인합니다. JWT 라이브러리는 일반적으로 이를 자동으로 처리합니다.
+ **Audience (aud):** 대상이 예상 값과 일치하는지 확인합니다. 이렇게 하면 다른 서비스용 토큰이 사용자의 토큰과 함께 사용되지 않습니다.
+ **Issuer (iss):** 발급자가 신뢰하는 AWS 계정과 일치하는지 확인합니다. 신뢰할 수 있는 발급자 URL의 목록을 유지 관리합니다.

가능하면 추가 AWS 관련 클레임을 검증하여 외부 서비스에서 세분화된 액세스 제어를 구현해야 합니다. 예를 들어 AWS 조직의 IAM 위탁자에 대한 액세스를 제한하려면 org\$1id 클레임을 검증하고, 속성 기반 액세스 제어를 적용하려면 principal\$1tags를 확인하고(예: 프로덕션 환경 또는 특정 팀만 허용), 컴퓨팅 리소스를 기반으로 액세스를 제한하려면 lambda\$1source\$1function\$1arn 또는 ec2\$1instance\$1source\$1vpc와 같은 세션 컨텍스트 클레임을 확인합니다. 토큰에 포함된 전체 클레임 목록은 [토큰 클레임 이해](id_roles_providers_outbound_token_claims.md)를 참조하세요.