Storage Browser for S3 설정
Storage Browser for S3 설정
최종 사용자를 Amazon S3 로케이션과 연결하려면 먼저 인증·인가 방법을 설정해야 해요. Storage Browser와 함께 설정할 수 있는 인증·인가 방법은 세 가지가 있어요.
- 방법 1: 고객 및 타사 파트너를 위한 데이터 접근 관리
- 방법 2: 내 AWS 계정의 IAM 주체를 위한 데이터 접근 관리
- 방법 3: 규모에 맞는 데이터 접근 관리
출처: 문서
본문
방법 1: 고객 및 타사 파트너를 위한 데이터 접근 관리
이 방법에서는 AWS Amplify Auth를 사용해 파일의 접근 제어와 보안을 관리할 수 있어요. 고객이나 타사 파트너를 S3 데이터에 연결하려 할 때 이상적이며, 고객이 소셜 또는 엔터프라이즈 신원 공급자로 인증할 수 있어요.
Amplify Storage를 사용하도록 구성된 S3 버킷과 함께 AWS Amplify Auth를 사용해 최종 사용자와 타사 파트너에게 IAM 자격 증명을 제공해요. AWS Amplify Auth는 완전 관리형 고객 신원·접근 관리 서비스인 Amazon Cognito를 기반으로 해요. Amplify 인증 모델은 현재 인증된 사용자가 접근할 수 있는 접두사를 정의해요.
Amplify 인증·스토리지 방식으로 컴포넌트를 초기화하려면 웹 애플리케이션에 다음 코드 스니펫을 추가하세요:
import { createAmplifyAuthAdapter, createStorageBrowser } from '@aws-amplify/ui-react-storage/browser';
import "@aws-amplify/ui-react-storage/styles.css";
import config from './amplify_outputs.json';
Amplify.configure(config);
export const { StorageBrowser } = createStorageBrowser({
config: createAmplifyAuthAdapter(),
});
방법 2: 내 AWS 계정의 IAM 주체를 위한 데이터 접근 관리
IAM 주체나 AWS 계정에 대한 접근을 직접 관리하려면, GetDataAccess S3 API 작업을 호출할 권한이 있는 IAM 역할을 만들 수 있어요. 이를 설정하려면 S3 일반 목적 버킷과 접두사에 대한 권한을 지정된 IAM 자격 증명에 매핑하는 S3 Access Grants 인스턴스를 만들어야 해요. Storage Browser 컴포넌트는 IAM 자격 증명을 얻은 후 클라이언트 측에서 ListCallerAccessGrants S3 API 작업을 호출해 요청자에게 부여된 grants를 가져와 컴포넌트의 로케이션을 채워요. s3:GetDataAccess 권한을 얻은 후에는 그 자격 증명으로 S3 데이터 접근을 요청해요.
import { createManagedAuthAdapter, createStorageBrowser } from '@aws-amplify/ui-react-storage/browser';
import "@aws-amplify/ui-react-storage/styles.css";
export const { StorageBrowser } = createStorageBrowser({
config: createManagedAuthAdapter({
credentialsProvider: async (options?: { forceRefresh?: boolean }) => {
// return your credentials object
return {
credentials: {
accessKeyId: 'my-access-key-id',
secretAccessKey: 'my-secret-access-key',
sessionToken: 'my-session-token',
expiration: new Date()
},
}
},
// AWS `region` and `accountId`
region: '',
accountId: '',
// call `onAuthStateChange` when end user auth state changes
// to clear sensitive data from the `StorageBrowser` state
registerAuthListener: (onAuthStateChange) => {},
})
});
방법 3: 규모에 맞는 데이터 접근 관리
S3 Access Grants 인스턴스를 내 IAM Identity Center와 연결해 더 확장 가능한 솔루션(예: 회사 전체에 데이터 접근 제공)을 구축하려면, 현재 인증된 사용자를 대신해 Amazon S3에서 데이터를 요청할 수 있어요. 예를 들어 회사 디렉터리의 사용자 그룹에 S3 데이터 접근을 부여할 수 있어요. 이 방식은 Microsoft Entra, Okta 등 외부 공급자에 호스팅된 사용자를 포함해 사용자·그룹에 대한 S3 Access Grants 권한을 중앙에서 관리할 수 있게 해줘요.
이 방법을 사용하면 IAM Identity Center와의 통합으로 기존 사용자 디렉터리를 사용할 수 있어요. IAM Identity Center 신뢰할 수 있는 신원 전파(trusted identity propagation)의 또 다른 이점은, Amazon S3에 대한 각 AWS CloudTrail 데이터 이벤트가 S3 데이터에 접근한 최종 사용자 신원을 직접 참조한다는 점이에요.
OAuth 2.0을 지원하는 애플리케이션이 있고 사용자가 AWS 서비스에 접근해야 한다면 신뢰할 수 있는 신원 전파를 권장해요. 신뢰할 수 있는 신원 전파를 사용하면 사용자가 애플리케이션에 로그인하고, 그 애플리케이션이 AWS 서비스 데이터에 접근하는 요청에 사용자 신원을 전달할 수 있어요. 이 애플리케이션은 인증된 사용자를 대신해 IAM Identity Center와 상호작용해요.
신뢰할 수 있는 신원 전파는 연결된 AWS 서비스의 관리자가 서비스 데이터에 대한 접근을 부여·감사하는 데 사용할 수 있는 IAM Identity Center 기능이에요. 이 데이터에 대한 접근은 그룹 연결 같은 사용자 속성에 기반해요. 설정하려면 연결된 AWS 서비스 관리자와 IAM Identity Center 관리자 간의 협업이 필요해요.
설정 (Setup)
AWS Management Console에서 S3 Access Grants와 IAM Identity Center 신뢰할 수 있는 신원 전파로 Storage Browser 인증을 설정하려면, 애플리케이션이 현재 인증된 사용자를 대신해 Amazon S3에서 데이터를 요청해야 해요. 이 방식으로 회사 디렉터리의 사용자나 사용자 그룹에게 S3 버킷·접두사·객체에 직접 접근할 수 있게 해줘요. 즉 애플리케이션이 사용자를 IAM 주체에 매핑할 필요가 없어요.
IAM Identity Center와 S3 Access Grants를 사용해 Storage Browser for S3를 설정하는 워크플로는 다음과 같아요:
| 단계 | 설명 |
|---|---|
| 1 | AWS Organizations에 IAM Identity Center 활성화 |
| 2 | IAM Identity Center 페더레이션 구성 |
| 3 | IAM Identity Center 콘솔에서 신뢰할 수 있는 토큰 발급자(trusted token issuer) 추가 |
| 4 | 부트스트랩 애플리케이션 및 신원 보유자(identity bearer)용 IAM 역할 생성 |
| 5 | IAM Identity Center에서 애플리케이션 생성 및 구성 |
| 6 | 신원 전파를 위한 신뢰할 수 있는 애플리케이션으로 S3 Access Grants 추가 |
| 7 | 사용자나 그룹에 grant 생성 |
| 8 | Storage Browser for S3 컴포넌트 생성 |
AWS Organizations에 IAM Identity Center 활성화 — AWS Management Console에 로그인해 IAM Identity Center 콘솔을 열고, Enable IAM Identity Center에서 Enable을 선택해요. IAM Identity Center는 AWS Organizations 설정이 필요해요. 조직이 없다면 AWS가 만들어 주도록 선택할 수 있어요. Enable with AWS Organizations를 선택하고 Continue를 선택해요. 선택 사항으로 태그를 추가하거나 위임된 관리(delegated administration)를 구성할 수 있어요. AWS Organizations가 관리 계정에 연결된 주소로 검증 이메일을 보내며, 24시간 내에 이메일 주소를 검증해야 해요.
IAM Identity Center 페더레이션 구성 — 회사 디렉터리 사용자와 함께 Storage Browser for S3를 사용하려면 IAM Identity Center가 외부 신원 공급자(IdP)를 사용하도록 구성해야 해요. 각 IdP는 다른 구성 설정을 사용하므로, 구성한 IdP의 발급자 URL과 audience 속성을 기록해 두세요.
신뢰할 수 있는 토큰 발급자 추가 — IAM Identity Center 콘솔에서 Settings → Authentication 탭 → Trusted token issuers 섹션에서, 발급자 URL과 신뢰할 수 있는 토큰 발급자 이름을 입력하고 Create trusted token issuer를 선택해요. 그다음 속성 매핑을 구성하고, 완료 후에는 애플리케이션 관리자에게 토큰 발급자 이름을 알려주세요.
IAM 역할 생성 — 부트스트랩 애플리케이션용 IAM 역할과 신원 보유자용 IAM 역할, 두 개를 만들어야 해요. 부트스트랩 애플리케이션은 IdP가 발급한 토큰을 받아 CreateTokenWithIAM API를 호출해 Identity Center가 발급한 토큰과 교환해요.
bootstrap-role용 예시 IAM 정책(토큰 교환 권한):
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"sso-oauth:CreateTokenWithIAM",
],
"Resource": "arn:${Partition}:sso::${AccountId}:application/${InstanceId}/${ApplicationId}",
"Effect": "Allow"
},
{
"Action": [
"sts:AssumeRole",
"sts:SetContext"
],
"Resource": "arn:aws:iam::${AccountId}:role/identity-bearer-role",
"Effect": "Allow"
}
]
}
identity-bearer-role용 예시 IAM 정책(웹 애플리케이션에 반환되는 IAM 자격 증명 생성):
{
"Action": [
"s3:GetDataAccess",
"s3:ListCallerAccessGrants",
],
"Resource": "arn:${Partition}:s3:${Region}:${Account}:access-grants/default",
"Effect": "Allow"
}
identity-bearer-role의 신뢰 정책:
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:${Partition}:iam::${Account}:role/${RoleNameWithPath}"
},
"Action": [
"sts:AssumeRole",
"sts:SetContext"
]
}
IAM Identity Center에서 애플리케이션 생성·구성 — IAM Identity Center 콘솔에서 Applications → Customer managed 탭 → Add application을 선택해요. OAuth 2.0 애플리케이션 유형을 선택하고, 표시 이름(예: storage-browser-oauth), 설명, AWS access portal URL을 입력해요. User and group assignment method에서 Do not require assignments를 선택하고, 인증 단계에서 이전에 만든 신뢰할 수 있는 토큰 발급자를 선택하고 aud claim을 입력해요. 자격 증명 단계에서 암호 구성 방법으로 Enter one or more IAM roles를 선택하고 이전에 만든 부트스트랩 역할(bootstrap-role)의 ARN을 입력한 뒤 Submit을 선택해요.
신뢰할 수 있는 애플리케이션으로 S3 Access Grants 추가 — 신뢰 전파를 위해 S3 Access Grants를 지정해야 해요. S3 Access Grants는 사용자가 Amazon S3 데이터에 접근하기 위한 자격 증명을 제공해요. 먼저 S3 Access Grants를 설정(인스턴스 생성, 로케이션 등록)했다는 전제가 필요해요. 그런 다음 IAM Identity Center 콘솔에서 애플리케이션의 Details 페이지 → Trusted applications for identity propagation → Specify trusted applications에서 Individual applications를 선택하고 S3 Access Grants 서비스를 선택해요. 사용자가 접근을 요청할 수 있는 애플리케이션을 선택하고 접근 수준을 구성한 뒤 Trust applications를 선택해요. 사용자에게 s3:access_grants:read_write 권한이 부여되었는지 확인하세요.
사용자나 그룹에 grant 생성 — IAM Identity Center를 사용해 사용자를 프로비저닝해요. SCIM을 사용해 자동 또는 수동으로 사용자·그룹을 프로비저닝할 수 있어요. SCIM은 IAM Identity Center 신원을 IdP의 신원과 동기화해요. S3 Access Grants가 IAM Identity Center와 함께 사용될 때는 로컬 IAM Identity Center 사용자를 사용하지 않으므로 이 단계가 필요해요. 자동 프로비저닝을 활성화하고 액세스 토큰을 생성하세요.
Storage Browser for S3 컴포넌트 생성 — IAM Identity Center 인스턴스 설정과 S3 Access Grants grant 생성이 끝나면 React 애플리케이션에서 createManagedAuthAdapter로 권한 규칙을 설정해요. IAM Identity Center에서 얻은 자격 증명을 반환하는 credentials provider를 제공하고 createStorageBrowser로 컴포넌트를 초기화해요:
import { createManagedAuthAdapter, createStorageBrowser } from '@aws-amplify/ui-react-storage/browser';
import '@aws-amplify/ui-react-storage/styles.css';
export const { StorageBrowser } = createStorageBrowser({
config: createManagedAuthAdapter({
credentialsProvider: async (options?: { forceRefresh?: boolean }) => {
// return your credentials object
return {
credentials: {
accessKeyId: 'my-access-key-id',
secretAccessKey: 'my-secret-access-key',
sessionToken: 'my-session-token',
expiration: new Date(),
},
}
},
// AWS `region` and `accountId` of the S3 Access Grants Instance.
region: '',
accountId: '',
// call `onAuthStateChange` when end user auth state changes
// to clear sensitive data from the `StorageBrowser` state
registerAuthListener: (onAuthStateChange) => {},
})
});
그런 다음 웹 애플리케이션의 JSON 웹 토큰(JWT)을 IAM Identity Center의 IAM 자격 증명과 교환하는 메커니즘을 만들어요. API 엔드포인트를 설정해 자격 증명 요청을 처리해요:
- 들어오는 요청의 인증 헤더에서 JWT를 검색해요.
- 지정된 JWKS URL의 공개 키로 토큰을 검증해요.
- 토큰의 만료, 발급자, 주체, audience claim을 확인해요.
IdP의 JWT를 AWS IAM 자격 증명과 교환하려면:
- 요청에 필요한 Permission과 Scope 파라미터가 제공되었는지 확인해요.
CreateTokenWithIAMAPI로 JWT를 IAM Identity Center 토큰과 교환해요. (참고: IdP JWT는 한 번 사용하면 다시 쓸 수 없어요.)AssumeRoleAPI로 IAM Identity Center 토큰을 사용해 일시적 역할을 맡아요. 신원 보유자 역할(identity-bearer-role)을 사용해 자격 증명을 요청하세요.- IAM 자격 증명을 웹 애플리케이션에 반환해요.
팁: 민감한 정보를 로깅하지 마세요. 인증 누락, 만료된 토큰 등에 대한 오류 처리 제어를 사용하는 것을 권장해요.