아웃바운드 ID 페더레이션 시작하기
이 가이드에서는 AWS 계정에 대해 아웃바운드 ID 페더레이션을 활성화하고 첫 번째 JSON 웹 토큰(JWT)(GetWebIdentityToken API 사용)을 가져오는 방법을 보여줍니다. 기능을 활성화하고, 외부 서비스와 신뢰 관계를 설정하고, IAM 권한을 구성하고, AWS CLI 또는 AWS SDK for Python(Boto3)을 사용하여 토큰을 요청합니다.
사전 조건
시작하기 전에 다음을 갖추었는지 확인하세요.
-
최신 버전의 AWS CLI 또는 Python 3.8(또는 이상) 및 Boto3 설치(AWSSDK 예시용)
-
신뢰 관계를 구성할 수 있는 외부 서비스 계정(예: 외부 클라우드 공급자, SaaS 공급자 또는 테스트 애플리케이션)
참고
GetWebIdentityTokenAPI는 STS Global 엔드포인트에서 사용할 수 없습니다.GetWebIdentityTokenAPI에 의해 생성된 JSON 웹 토큰(JWT)은 AWS(AssumeRoleWithWebIdentity API를 통해)에 대한 OpenID Connect(OIDC) 페더레이션에 사용할 수 없습니다.
계정에 대한 아웃바운드 ID 페더레이션 활성화
토큰을 요청하려면 먼저 아웃바운드 ID 페더레이션을 활성화해야 합니다. AWS Management Console을 사용하거나 프로그래밍 방식으로 EnableOutboundWebIdentityFederation API를 사용하여 기능을 활성화할 수 있습니다.
AWS CLI 사용
aws iam enable-outbound-web-identity-federation
AWS SDK for Python 사용
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 콘솔 사용
IAM으로 이동하여 왼쪽 탐색 메뉴의 액세스 관리 섹션에서 계정 설정을 선택합니다.
기능을 활성화한 후 계정별 발급자 URL을 기록해 둡니다. 외부 서비스에서 신뢰 관계를 구성할 때 이 URL을 사용합니다. GetOutboundWebIdentityFederationInfo API를 사용하여 필요에 따라 이 발급자 URL을 검색할 수도 있습니다.
외부 서비스에서 신뢰 관계 설정
AWS 계정에서 발급한 토큰을 신뢰하고 수락하도록 외부 서비스를 구성합니다. 구체적인 단계는 서비스에 따라 다르지만 일반적으로 다음을 포함합니다.
-
AWS 계정 발급자 URL을 신뢰할 수 있는 ID 공급자로 등록
-
검증할 클레임 구성(대상, 주제 패턴)
-
토큰 클레임을 외부 서비스의 권한에 매핑
자세한 구성 지침은 외부 서비스 설명서를 참조하세요.
IAM 권한 구성
GetWebIdentityToken API를 직접 호출할 권한을 부여하는 IAM 정책을 생성하고 토큰을 생성해야 하는 IAM 역할에 정책을 연결합니다.
이 예시 정책은 특정 제한이 있는 토큰 생성에 대한 액세스 권한을 부여합니다. 대상인 ‘https://api.example.com’에 대해서만 토큰을 요청할 수 있으며, 최대 토큰 수명은 5분(300초)입니다. 토큰 속성을 적용하는 데 사용할 수 있는 조건 키 목록은 IAM 및 AWS STS 조건 컨텍스트 키 섹션을 참조하세요.
IAM 정책 예제
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:GetWebIdentityToken", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "sts:IdentityTokenAudience": "https://api.example.com" }, "NumericLessThanEquals": { "sts:DurationSeconds": 300 } } } ] }
첫 번째 JSON 웹 토큰(JWT) 요청
GetWebIdentityToken API를 사용하여 JSON 웹 토큰을 요청할 수 있습니다. API를 직접적으로 호출할 때 다음 파라미터를 지정할 수 있습니다.
-
Audience(필수): 토큰의 의도된 수신자입니다. 이 값은 JWT의 ‘aud’ 클레임을 채웁니다. 외부 서비스는 토큰이 의도한 것인지 확인하기 위해 이 클레임을 검증합니다.
-
SigningAlgorithm(필수): 토큰에 서명하는 데 사용되는 암호화 알고리즘입니다. 유효한 값은 ES384와 RS256입니다. 최적의 보안과 성능이 요구되는 경우 ES384를 사용하고, ECDSA를 지원하지 않는 시스템과의 광범위한 호환성이 요구되는 경우 RS256을 사용합니다.
-
DurationSeconds(선택 사항): 초 단위의 토큰 수명입니다. 유효한 값의 범위는 60~3600입니다. 기본값은 300(5분)입니다. 보안을 강화하려면 토큰 수명을 단축하는 것이 좋습니다.
-
Tags(선택 사항): 토큰에 사용자 지정 클레임으로 포함할 키-값 페어의 목록입니다. 외부 서비스는 이러한 클레임을 세분화된 권한 부여에 사용할 수 있습니다.
API는 다음 필드를 반환합니다.
-
IdentityToken: base64url 인코딩 문자열로 서명된 JWT입니다. 외부 서비스에 대한 요청에 이 토큰을 포함합니다.
-
Expiration: 토큰이 만료될 시점의 UTC 타임스탬프입니다.
AWS CLI 사용
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 사용
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+JWT for Java, 디버거(예: jwt.io) 등의 표준 JWT 라이브러리를 사용하여 콘텐츠를 검사할 수도 있습니다. 토큰에 포함된 클레임에 대한 자세한 내용은 토큰 클레임 이해 섹션을 참조하세요.
외부 서비스와 함께 토큰 사용
토큰을 받은 후 외부 서비스에 대한 요청에 포함합니다. 메서드는 서비스에 따라 다르지만 대부분의 서비스는 권한 부여 헤더에서 토큰을 수락합니다. 외부 서비스는 발급자의 잘 알려진 엔드포인트에서 JWKS 키를 가져오고, 토큰의 서명을 확인하고, AWS 워크로드에 대한 액세스 권한을 부여하기 전에 필수 클레임을 검증하는 토큰 검증 로직을 구현해야 합니다.
OpenID Connect(OIDC) 엔드포인트에서 검증 키 및 메타데이터 가져오기
AWS 계정의 고유한 발급자 URL은 토큰 확인에 필요한 검증 키와 메타데이터가 포함된 OpenID Connect(OIDC) 검색 엔드포인트를 호스팅합니다.
OIDC 검색 엔드포인트 URL에는 일부 공급자가 토큰을 확인하는 데 사용하는 메타데이터가 포함되어 있습니다. 다음에서 사용할 수 있습니다.
{issuer_url}/.well-known/openid-configuration
JWKS(JSON 웹 키 세트) 엔드포인트에는 토큰 서명을 확인하는 데 사용되는 키가 포함되어 있습니다. 다음에서 사용할 수 있습니다.
{issuer_url}/.well-known/jwks.json
curl을 사용하여 JWKS 가져오기
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 사용
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()
토큰을 검증할 때마다 키를 가져올 필요가 없도록 이러한 키를 캐싱하는 것이 좋습니다.
필수 클레임 검증
-
Subject (sub): 제목 클레임에 예상 IAM 위탁자 ARN 패턴이 포함되어 있는지 확인합니다.
-
Expiration (exp): 토큰이 만료되지 않았는지 확인합니다. JWT 라이브러리는 일반적으로 이를 자동으로 처리합니다.
-
Audience (aud): 대상이 예상 값과 일치하는지 확인합니다. 이렇게 하면 다른 서비스용 토큰이 사용자의 토큰과 함께 사용되지 않습니다.
-
Issuer (iss): 발급자가 신뢰하는 AWS 계정과 일치하는지 확인합니다. 신뢰할 수 있는 발급자 URL의 목록을 유지 관리합니다.
가능하면 추가 AWS 관련 클레임을 검증하여 외부 서비스에서 세분화된 액세스 제어를 구현해야 합니다. 예를 들어 AWS 조직의 IAM 위탁자에 대한 액세스를 제한하려면 org_id 클레임을 검증하고, 속성 기반 액세스 제어를 적용하려면 principal_tags를 확인하고(예: 프로덕션 환경 또는 특정 팀만 허용), 컴퓨팅 리소스를 기반으로 액세스를 제한하려면 lambda_source_function_arn 또는 ec2_instance_source_vpc와 같은 세션 컨텍스트 클레임을 확인합니다. 토큰에 포함된 전체 클레임 목록은 토큰 클레임 이해를 참조하세요.