AWS

S3 객체 소유권과 액세스 제어

heesoohi 2025. 5. 20. 11:52

Amazon S3에서는 객체를 업로드한 사용자 또는 계정이 그 객체의 소유자(owner)가 된다. 즉, 외부 계정이 내 버킷에 객체를 업로드하면, 그 객체는 기본적으로 외부 계정의 소유가 된다. 이때 버킷 소유자는 그 객체에 대해 자동으로 접근 권한을 갖지 않는다.

 

IAM 정책 만으로는 객체에 접근할 수 없다. 그 이유는, IAM 정책은 주체(사용자나 역할)에게 권한을 부여하는데, 하지만 객체에 대한 최종 접근 권한은 다음과 같이 결정된다:

최종 권한 = IAM 정책 + 버킷 정책 + 객체 ACL + 소유권 구조​

 

즉, IAM 정책에서 s3:GetObject 권한이 있더라도, 객체가 다른 계정의 소유이거나, ACL에서 허용되지 않았거나, 버킷 정책에서 막았다면

➡️ 객체에 접근할 수 없다.

 

이 문제를 해결하기 위해 AWS는 bucket-owner-full-control이라는 ACL 옵션을 제공한다. 외부 사용자가 객체를 업로드할 때 이 ACL을 설정하면, 버킷 소유자에게 그 객체에 대한 전체 권한을 위임할 수 있다. 하지만 사용자가 이 ACL을 설정하지 않으면? 버킷 소유자는 여전히 객체를 소유하지 않게 된다.

 

버킷 소유자는 아래와 같이 버킷 정책에서 특정 ACL이 포함되지 않은 업로드를 거부할 수 있다:

{
  "Effect": "Deny",
  "Principal": "*",
  "Action": "s3:PutObject",
  "Resource": "arn:aws:s3:::example-bucket/*",
  "Condition": {
    "StringNotEquals": {
      "s3:x-amz-acl": "bucket-owner-full-control"
    }
  }
}

 

이 정책은 bucket-owner-full-control ACL이 포함되지 않은 객체 업로드를 자동으로 차단한다.