Amazon Web Services 한국 블로그
AWS IAM 아웃바운드 ID 페더레이션을 통한 외부 서비스 액세스 간소화
여러 클라우드 제공업체에 걸쳐 있거나 외부 서비스와 통합되는 애플리케이션을 구축할 때, 개발자는 자격 증명을 안전하게 관리해야 한다는 과제에 계속하여 직면하게 됩니다. 기존 접근 방식으로는 API 키 및 암호와 같은 장기 자격 증명을 저장해야 하므로 보안 위험과 운영 오버헤드가 발생합니다.
오늘, Amazon은 고객이 장기 자격 증명을 저장하지 않고도 Amazon Web Services(AWS) ID를 외부 서비스에 안전하게 페더레이션하는 데 사용할 수 있는 AWS Identity and Access Management(IAM) 아웃바운드 ID 페더레이션이라는 새로운 기능을 발표합니다. 이제 수명이 짧은 JSON 웹 토큰(JWT)을 사용하여 다양한 타사 공급업체, 서비스형 소프트웨어(SaaS) 플랫폼 및 자체 호스팅 애플리케이션을 통해 AWS 워크로드를 인증할 수 있습니다.
이 기능을 사용하면 IAM 역할 및 사용자와 같은 IAM 보안 주체가 AWS ID를 표명하는 암호화 서명된 JWT를 획득할 수 있습니다. 타사 공급업체, SaaS 플랫폼 및 온프레미스 애플리케이션과 같은 외부 서비스의 경우 서명의 유효성을 검사하여 토큰의 신뢰성을 확인할 수 있습니다. 인증에 성공하면 외부 서비스에 안전하게 액세스할 수 있습니다.
작동 방식
IAM 아웃바운드 ID 페더레이션을 사용하면 AWS IAM 자격 증명을 수명이 짧은 JWT로 교환할 수 있습니다. 이를 통해 장기 자격 증명과 관련된 보안 위험을 줄이는 동시에 일관된 인증 패턴을 사용할 수 있습니다.
AWS에서 실행되는 애플리케이션이 외부 서비스와 상호작용해야 하는 시나리오를 살펴보겠습니다. 외부 서비스의 API 또는 리소스에 액세스하기 위해 애플리케이션은 AWS Security Token Service(AWS STS) `GetWebIdentityToken` API를 호출하여 JWT를 얻습니다.
다음 다이어그램에는 이러한 흐름이 나와 있습니다.

- AWS에서 실행되는 애플리케이션은
GetWebIdentityTokenAPI를 호출하여 AWS STS에 토큰을 요청합니다. 애플리케이션은 기본 플랫폼에서 얻은 기존 AWS 자격 증명(예: Amazon EC2 인스턴스 프로파일, AWS Lambda 실행 역할 또는 기타 AWS 컴퓨팅 서비스)을 사용하여 이 API 호출을 인증합니다. - AWS STS는 애플리케이션의 ID를 표명하는 암호화 서명된 JSON 웹 토큰(JWT)을 반환합니다.
- 애플리케이션은 인증을 위해 JWT를 외부 서비스에 보냅니다.
- 외부 서비스는 JSON 웹 키 세트(JWKS) 엔드포인트에서 확인 키를 가져와 토큰의 신뢰성을 확인합니다.
- 외부 서비스는 이러한 확인 키를 사용하여 JWT의 서명을 검증하고, 토큰을 신뢰할 수 있으며 AWS에서 발행했음을 확인합니다.
- 검증에 성공하면 외부 서비스는 JWT를 자체 자격 증명으로 교환합니다. 이후 애플리케이션은 이러한 자격 증명을 사용하여 의도한 작업을 수행할 수 있습니다.
AWS IAM 아웃바운드 ID 페더레이션 설정
이 기능을 사용하려면 AWS 계정의 아웃바운드 ID 페더레이션을 활성화해야 합니다. IAM으로 이동하여 왼쪽 탐색 창의 액세스 관리에서 계정 설정을 선택하겠습니다.

이 기능을 활성화하면 AWS는 내 AWS 계정을 위한 고유한 발급자 URL을 생성합니다. 이 URL을 통해 /.well-known/openid-configuration 및 /.well-known/jwks.json에서 OpenID Connect (OIDC) 검색 엔드포인트에 접근할 수 있습니다. OpenID Connect (OIDC) 검색 엔드포인트에는 토큰 검증에 필요한 키와 메타데이터가 포함되어 있습니다.

이제 IAM 권한을 구성해야 합니다. IAM 보안 주체(역할 또는 사용자)는 토큰을 요청하려면 sts:GetWebIdentityToken 권한이 있어야 합니다.
예를 들어, 다음 ID 정책은 STS GetWebIdentityToken API에 대한 액세스를 지정하여 IAM 보안 주체가 토큰을 생성할 수 있도록 합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:GetWebIdentityToken",
"Resource": "*",
}
]
}
이 단계에서는 AWS 계정에서 발행한 토큰을 신뢰하고 수락하도록 외부 서비스를 구성해야 합니다. 구체적인 단계는 서비스에 따라 다르지만, 일반적으로 다음과 같습니다.
- AWS 계정 발급자 URL을 신뢰할 수 있는 자격 증명 공급자로 등록
- 검증할 클레임 구성(audience 및 subject 검증 패턴)
- 토큰 클레임을 외부 서비스 권한에 매핑
그럼 시작해 보겠습니다.
이제 클라이언트 측 토큰 생성과 서버 측 검증 프로세스를 모두 보여주는 예제를 살펴보겠습니다.
먼저 STS GetWebIdentityToken API를 호출하여 AWS ID를 표명하는 JWT를 획득합니다. API를 호출할 때 의도한 대상, 서명 알고리즘, 토큰 수명을 요청 파라미터로 지정할 수 있습니다.
Audience: JWT에 ‘aud’ 클레임을 채워 토큰의 의도된 수신자 식별(예: ‘my-app’)DurationSeconds: 60초(1분)에서 3600초(1시간) 사이의 토큰 수명(초)이며 기본값은 600초(5분)SigningAlgorithm: ES384(P-384 및 SHA-384 사용 ECDSA) 또는 RS256(SHA-256 사용 RSA) 중 하나를 선택Tags(선택 사항): 토큰에서 사용자 지정 클레임으로 나타나는 키-값 쌍의 배열로, 외부 서비스가 세분화된 액세스 제어를 구현할 수 있도록 하는 추가 컨텍스트를 포함하는 데 사용 가능
다음은 AWS SDK for Python(Boto3)를 사용하여 자격 증명 토큰을 가져오는 예제입니다. AWS Command Line Interface(AWS CLI)를 사용하여 이 작업을 수행할 수도 있습니다.
import boto3
sts_client = boto3.client('sts')
response = sts_client.get_web_identity_token(
Audience=['my-app'],
SigningAlgorithm='ES384', # or 'RS256'
DurationSeconds=300
)
jwt_token = response['WebIdentityToken']
print(jwt_token)
그러면 일반적인 JWT 파서를 사용하여 검사할 수 있는 서명된 JWT가 반환됩니다.
{
eyJraWQiOiJFQzM4NF8wIiwidHlwIjoiSldUIiwiYWxnIjoiRVMzODQifQ.hey<REDACTED FOR BREVITY>...
이 JWT 디버거와 같은 JWT 파서를 사용하여 토큰을 디코딩할 수 있습니다. 토큰 헤더를 보면 ES384 (ECDSA)로 서명되었음을 알 수 있습니다.
{
"kid": "EC384_0",
"typ": "JWT",
"alg": "ES384"
}
페이로드에는 표준 OIDC 클레임과 AWS 관련 메타데이터도 포함됩니다. 표준 OIDC 클레임에는 주체(‘sub’), 대상(‘aud’), 발급자(‘iss’) 등이 포함됩니다.
{
"aud": "my-app",
"sub": "arn:aws:iam::ACCOUNT_ID:role/MyAppRole",
"https://sts.amazonaws.com/": {
"aws_account": "ACCOUNT_ID",
"source_region": "us-east-1",
"principal_id": "arn:aws:iam::ACCOUNT_ID:role/MyAppRole"
},
"iss": "https://abc12345-def4-5678-90ab-cdef12345678.tokens.sts.global.api.aws",
"exp": 1759786941,
"iat": 1759786041,
"jti": "5488e298-0a47-4c5b-80d7-6b4ab8a4cede"
}
또한 AWS STS는 자격 증명별 클레임(예: 계정 ID, 조직 ID, 보안 주체 태그) 및 세션 컨텍스트를 통해 토큰을 보강합니다. 이러한 클레임은 토큰 요청이 시작된 컴퓨팅 환경 및 세션에 대한 정보를 제공합니다. AWS STS는 해당하는 경우 요청하는 보안 주체의 세션 컨텍스트를 기반으로 이러한 클레임을 자동으로 포함합니다. 요청 태그를 API 호출에 전달하여 토큰에 커스텀 클레임을 추가할 수도 있습니다. JWT에서 제공하는 클레임에 대해 자세히 알아보려면 문서 페이지를 확인하세요.
iss(발급자) 클레임에 주목하시기 바랍니다. 이는 외부 서비스에서 토큰이 신뢰할 수 있는 AWS 계정에서 생성되었는지 확인하는 데 사용하는 계정별 발급자 URL입니다. 외부 서비스는 발급자 URL의 /.well-known/jwks.json 엔드포인트에서 호스팅되는 퍼블릭 JSON 웹 키 세트(JWKS) 엔드포인트에서 제공되는 AWS의 확인 키를 사용하여 서명을 검증함으로써 JWT를 확인할 수 있습니다.
이제 외부 서비스가 이 ID 토큰을 처리하는 방법을 살펴보겠습니다.
다음은 외부 서비스가 AWS 토큰을 확인하는 데 사용할 수 있는 Python 예제의 코드 조각입니다.
import json
import jwt
import requests
from jwt import PyJWKClient
# 신뢰할 수 있는 발급자 목록 - EnableOutboundFederation API 응답에서 가져옴
TRUSTED_ISSUERS = [
"https://EXAMPLE.tokens.sts.global.api.aws",
# 여기에 신뢰할 수 있는 AWS 계정 발급자 URL 추가
# EnableOutboundFederation API 응답에서 가져옴
]
def verify_aws_jwt(token, expected_audience=None):
"""AWS IAM 아웃바운드 ID 페더레이션 JWT 확인"""
try:
# 토큰에서 발급자 가져오기
unverified_payload = jwt.decode(token, options={"verify_signature": False})
issuer = unverified_payload.get('iss')
# 발급자를 신뢰할 수 있는지 확인
if not TRUSTED_ISSUERS or issuer not in TRUSTED_ISSUERS:
raise ValueError(f"Untrusted issuer: {issuer}")
# PyJWKClient를 사용하여 AWS에서 JWKS 가져오기
jwks_client = PyJWKClient(f"{issuer}/.well-known/jwks.json")
signing_key = jwks_client.get_signing_key_from_jwt(token)
# 토큰 서명 및 클레임 확인
decoded_token = jwt.decode(
token,
signing_key.key,
algorithms=["ES384", "RS256"],
audience=expected_audience,
issuer=issuer
)
return decoded_token
except Exception as e:
print(f"Token verification failed: {e}")
return None
IAM 정책을 사용하여 토큰 생성에 대한 액세스 제어
IAM 보안 주체 (예: 역할 또는 사용자)가 외부 서비스 인증을 위한 토큰을 요청하려면 IAM 정책에서 sts:GetWebIdentityToken 권한을 가지고 있어야 합니다. AWS 계정 관리자는 자격 증명 정책, 서비스 제어 정책(SCP), 리소스 제어 정책(RCP), 가상 프라이빗 클라우드 엔드포인트(VPCE) 정책과 같은 모든 관련 AWS 정책 유형에서 이 권한을 구성하여 계정에서 토큰을 생성할 수 있는 IAM 보안 주체를 제어할 수 있습니다.
또한 관리자는 새 조건 키를 사용하여 서명 알고리즘(sts:SigningAlgorithm), 허용된 토큰 대상(sts:IdentityTokenAudience) 및 최대 토큰 수명(sts:DurationSeconds)을 지정할 수 있습니다. 조건 키에 대해 자세히 알아보려면 IAM 및 STS 조건 키 문서 페이지를 참조하세요.
추가 정보
이번 출시의 주요 세부 정보는 다음과 같습니다.
- 가용성 – AWS IAM 아웃바운드 ID 페더레이션은 모든 AWS 상용 리전, AWS GovCloud(미국) 리전 및 중국 리전에서 추가 비용 없이 사용할 수 있습니다.
- 가격 – 이 기능은 추가 비용 없이 사용할 수 있습니다.
AWS IAM 콘솔을 방문해 AWS 계정에서 이 기능을 활성화하고 AWS IAM 아웃바운드 ID 페더레이션을 시작하세요. 자세한 내용은 AWS ID를 외부 서비스에 페더레이션 설명서 페이지를 참조하시기 바랍니다.
즐겁게 빌드해 보세요!
– Donnie