프로젝트에서 AWS S3를 이용하여 Spring Boot 에서 이미지를 업로드 하는 것을 구현하였다.
프로젝트에서 AWS S3를 사용한 이유는 S3 버킷에 실제 이미지를 저장하고 이미지 참조 링크만 저장하여 DB에 저장함으로 용량을 줄일 수 있기 때문이다.
프로젝트를 진행하며 요금이 너무 많이 나와 인스턴스를 삭제하고 다시 만든 적이 있었는데 그 과정에서 S3 버킷도 다시 만들게 되고 접근 권한이 모두 사라진 것이다 🥲
이전에 설정 해놓은 접근 권한은 그저 구글링하여 보고 따라한 것이었던 탓에 오류가 발생한 후 다시 해보려니 쉽지 않았고 이렇게 S3에 대한 정리부터 다시 해볼까 하여 블로그에 정리하게 되었다! 😎 그리고 이전에는 모든 사람에게 권한을 줌으로써 이를 해결했다면 이번에는 공부를 하며 정책과 권한을 수정해봤는데 수정해보며 더 안전한 정책을 설정할 수 있었다.
S3 (Simple Storage Service)
S3의 개념
AWS는 AWS 에서 제공하는 클라우드 스토리지 서비스 모델이다. 클라우드 스토리지 서비스는 클라우드 컴퓨팅 제공 업체를 통해 데이터와 파일을 인터넷에 저장할 수 있는 것으로 우리가 평소에 한 번 쯤 써봤을 "구글 드라이브, 네이버 MyBox, 마이크로소프트의 OneDrive 등" 도 이에 포함된다.
AWS S3를 통해 어디서나 원하는 양의 데이터를 저장하고 검색할 수 있으며 S3는 웹 사이트, 모바일 앱, 데이터 분석, 백업 및 복구 등 다양한 곳에서 사용된다.
클라우드 스토리지는 객체 스토리지, 파일스토리지, 블록 스토리지 세 가지 유형이 있는데 그 중 S3는 객체 스토리지를 이용한다. * AWS 에서는 모든 스토리지 유형을 제공하고 있으며 그 중 S3는 객체 스토리지 유형인 것이다. 객체 스토리지는 계층 구조가 없고 메타 데이터 등 최소한의 정보만을 가지고 있기 때문에 많은 양의 데이터를 저장할 수 있다. 즉 S3는 분석, 백업(이미지, 동영상, 파일 등), 아카이브 작업만 가능하다. ➡️ 파일 설치는 불가하며 파일 업로드, 삭제, 저장만 가능
S3 특징
✅ 높은 내구성 - 99.999999999%의 객체 내구성을 보장하여 파일 유실도가 낮음
✅ 손쉬운 확장성 - 개별 파일은 0바이트부터 5테라까지 저장할 수 있으며 파일의 수가 제한이 없어 트래픽을 고려하지 않아도 됨
✅ 보안성과 편리성 - 보안 프로토콜을 제공하고 IAM 을 통한 역할 제어, 버저닝을 활성화한 백업본 만들기 등이 가능함
S3 구성
S3의 주요 구성 요소에는 버킷(Bucket)과 오브젝트(Object)가 있다.
✅ 버킷(Bucket) : S3 데이터 저장소로 각 버킷은 고유한 이름을 가지며 AWS 전체에서 유일해야한다.
✅ 오브젝트(Object) : 버킷에 저장되는 저장 파일로 데이터 파일과 메타데이터를 포함한다.
버킷은 폴더 또는 파티션의 개념과 비슷하며 접근권한, 보안 설정에 따라 파일을 다르게 저장할 수 있다.
중복된 이름을 가질 수 없으며 모든 리전(region)에서 유일해야한다.(bucket이 웹 사이트의 형태의 주소를 가지기 때문)
버킷은 한 계정당 최대 100개 까지 사용이 가능하며 소유권 이전이 불가하다.
저장되는 파일의 크기는 0바이트부터 5테라바이트까지 가능하며 수는 제한이 없다.
✅ 키(Key) : 오브젝트의 고유한 식별자로 버킷 내에서 오브젝트의 이름, 파일의 이름이다.
✅ 값(Value) : 파일의 데이터로 Key의 접두어 및 슬래시를 이용해 폴더개념같이 사용가능하다.
✅ 메타데이터(Meta Data) : 버킷에 올리는 데이터의 최종 수정일, 파일 타입 등 (메타데이터 또한 "키"-"값" 쌍)
✅ 버전 아이디(Version ID) : 파일의 버전 관리를 위한 고유 아이디로 이전 복구가 가능한 특징이 있다.
S3 보안 / 권한 정책
AWS 서비스는 전세계에서 사용 하는 서비스로 S3 또한 어디서든 접속 가능한 서비스이다. 이러한 이유로 AWS 에서는 안전하게 보호하기 위해 S3의 기본 버킷 정책을 private으로 설정하고 있다.
private으로 설정되면 생성한 사용자만 해당 버킷과 그 내부에 액세스가 가능하다.
✅ IAM (Identity and Access Management) : 사용자 생성 및 버킷 액세스 권한 관리한다.
✅ ACL(Access Control List) : 초기 접근 제어 방식으로 각 객체 및 버킷에 대한 사용자별 권한을 세밀하게 설정할 수 있다.
✅ Bucket Policy : JSON 형태의 문서로 하나의 S3 버킷 내 모든 객체에 대한 권한을 세부적으로 구성한다.
✅ Pre-signed URL : 임시 URL을 사용하여 다른 사용자에게 기간 제한(임시권한) 액세스 부여한다.
액세스 관리 기능을 조합하여 사용함으로 다른 사용자에게 액세스 권한을 부여할 수 있다.
Public Access
퍼블릭 액세스 차단 설정은 말 그대로 외부 모든 접근에 대한 차단을 활성화 할 것인지, 비활성화 할 것인지에 대한 설정이다.
✨ 개인 프로젝트에서는 사진을 불러오는 것 때문에 대부분 비활성화하여 사용하는데 실무에서는 보안을 의해 모든 액세스를 차단하거나 ACL을 이용해 액세스 차단을 해준다.
ACL (Access Control List)
ACL은 특정 버킷이나 객체에 대한 접근 권한을 관리하는데 사용되며 이를 상세하게 제어할 수 있다.
✨ ACL에서는 간단하게 권한 설정을 하기 때문에 더욱 복잡하고 세밀한 접근 제어를 위해서는 IAM(Identity and Access Management) 정책이나 버킷 정책을 사용하는 것이 좋다.
✅ 버킷 소유자 (AWS 계정) : 고유한 사용자 ID가 주어져 있으며, 이 ID로 해당 사용자에게 접근 권한을 부여할 수 있다.
✅ 모든 사용자(퍼블릭 액세스) : 모든 사용자를 대상으로 하며, 이 그룹에 권한을 부여하면 누구나 해당 리소스에 접근할 수 있다.
✅ 인증된 사용자 그룹(AWS 계정의 인증된 사용자) : AWS에서 인증된 모든 사용자를 대상으로 한다. AWS 계정에 로그인한 사용자라면 누구든지 해당 리소스에 접근할 수 있다.
✅ S3 로그 전송 그룹 : S3 로그 전송을 위한 특별한 그룹으로 로그 전송 기능을 사용할 때 필요한 권한을 이 그룹에 부여할 수 있다.
버킷 정책(Bucket Policy)
버킷 정책을 통해 적절한 권한을 가진 사용자만 객체에 액세스할 수 있도록 하여 버킷의 객체 액세스를 보호할 수 있다.
버킷 정책은 JSON 형태로 이루어져 있으며 예를 들어 다음과 같은 형태를 갖는다.
{
"Version": "2012-10-17",
"Id": "Policy", // 정책 Id
"Statement": [
{
"Sid": "Stmt1697524902675", // statement Id
"Effect": "Allow", // 버킷에 대한 명령을 Allow, Deny
"Principal": "*", // 정책 적용 대상
"Action": "s3:GetObject", // 버킷 정책에서 허용한 Action
"Resource": "arn:aws:s3:::my-aws-bucket/*"
}
]
}
이 외에도 특정 IP 주소만 액세스 할 수 있게 한다던가, 특정 폴더에 대한 사용자 액세스 관리, 액세스 로그에 대한 액세스 관리 등 더욱 다양한 정책 관리가 가능하다.
🔗 버킷 정책 예제
버킷 생성 및 설정하기
버킷 만들기
1. s3 > 버킷에 들어간다.
2. `버킷 만들기` 클릭
3. 일반 구성
✨ AWS 리전은 데이터 센터의 위치를 말하는데 다른 지역을 선택하게 되면 요금 폭탄을 맞을 수 있으니 주의! 해야한다.
4. 객체 소유권
다른 AWS 계정에서 버킷의 소유권을 가질 수 있는지, 액세스 제어를 할 수 있는지에 대한 설정이다.
비활성화 하여 내가 접속한 계정에서만 소유할 수 있도록 한다.
5. 버킷의 퍼블릭 액세스 차단 설정
퍼블릭 액세스를 차단할 것인지, 허용할 것인지 설정하는 것이다. 차단을 비활성화 하여 외부에서 파일을 읽을 수 있게 한다. 이렇게 해야 이미지를 사이트에서 읽을 수 있다던가 할 수 있는데 실무에서는 차단하는 것이 좋다.
(모든 퍼블릭 액세스를 차단하였다면 인증 및 권한을 부여, 서명된 URL 사용 등 다른 설정을 통해 이를 해결할 수 있다.)
6. 버킷 버전 관리 - 비활성화
7. 기본 암호화
버킷 만들기 클릭하여 버킷을 만든다.
폴더 만들기 및 파일 업로드
폴더를 만들거나 파일을 업로드할 수 있다.
폴더 만들기
폴더를 만들면 버킷 경로는 "s3://my-aws-bucket/profile-image/" 와 같은 형태로 만들어진다.
파일 업로드
파일 업로드는 업로드 버튼을 눌러 파일을 추가하거나 폴더를 추가할 수 있다. 파일은 하나씩 추가도 가능하고 폴더추가를 통해 폴더 통째로 추가할 수도 있다.
(* drag and drop 으로 끌고와서 파일을 업로드할 수도 있다.)
정책 및 권한 설정
파일을 업로드 하고 객체 URL을 통해 접근을 시도하면 접근이 거부될 수도 있다. 접근이 거부되면 버킷 권한 탭에서 액세스와 정책을 살펴볼 수 있다.
퍼블릭 액세스 차단 비활성화
버킷을 만들 때 비활성화 하였기 때문에 비활성화 된 상태일 수도 있다. 만약 되어있지 않다면 이를 비활성화 시킨다.
버킷 정책 편집
JSON으로 작성된 버킷 정책은 버킷에 저장된 객체에 대한 액세스 권한을 제공한다.
1. 편집을 누른 후 버킷 정책을 생성한다.
2. 정책 생성기 클릭
* 버킷 ARN을 미리 복사해둔다.
3. 정책 생성
입력 후 Add Statement , Generate Policy 후 복사 한다.
(만들어진 생성문을 복사했다면 창을 닫아도 된다. )
4. 만들어진 정책문 붙여넣기 & 변경 사항 저장
정책문을 붙여넣고 변경 사항을 저장하면 정책이 적용될 것이다.
🔗 버킷 정책 예제
+) 만약 버킷 정책까지 설정해주었는데 접근이 안 된다면 ACL 설정 또한 퍼블릭으로 바꾸어 줄 수 있다.
하지만, ACL 정책은 퍼블릭으로 바꾸지 않는 것이 좋기 때문에 사용자 정책을 통해 특정 사용자에게 접근을 제한하는 것이 좋다. 외부에서 무단으로 접근할 수 있기 때문이다.
ACL (액세스 제어 목록) 편집
모든 사용자 또는 인증된 사용자 그룹 피부여자에게 액세스 권한을 부여하면 누구나 이 버킷의 객체에 액세스할 수 있게 된다. 따라서, 권장되지는 않는 방법이다.
✨ 이 대신 각 사용자 정책을 통해 특정 사용자에게 접근을 제한하는 것이 좋다.
1. 편집을 눌러 편집할 수 있는 창으로 넘어간다.
2. 퍼블릭으로 설정해준다.
AWS S3 버킷을 퍼블릭으로 설정했다면 해당 버킷 내의 파일에 대한 액세스 권한을 설정해야 한다. 파일 업로드 시에 파일에 대한 접근 권한을 설정할 수 있으며, 이를 통해 파일별로 액세스를 제어할 수 있다.
3. 파일을 선택해 ACL 을 사용하여 퍼블릭으로 설정을 해준다.
이 외에도 Pre-signed URL (미리 서명된 URL) 공유 등으로 제한된 시간 동안 액세스 권한을 부여하는 등의 설정을 할 수 있다.
💬 느낀 점
인스턴스를 다시 생성하고 버킷을 다시 생성하며 접근 권한이 사라져 해결했던 방법에 대한 블로깅을 하려고 하였다. (내가 실제 작업한 것에 대한...) 근데 내가 S3에 대해 아는 것이 정말 없다는 것을 알았고 개념에 대해 정리 해보고자 하였다. 처음에 ACL 접근 제어를 모든 사람이 읽을 수 있도록 해놓았었는데 정리 해보고 공부하며 외부에서의 접근은 보안상 위험할 수 있다는 것을 알게 되었다. 모든 사람이 데이터를 읽을 수 있게 되면 누구나 접근이 가능하기 때문에 민감한 데이터가 노출될 수 있고 바로 위에서 작성한 것 처럼 '버킷을 퍼블릭으로 설정했다면 해당 버킷 내의 파일에 대한 액세스 권한을 설정' 해야 하기에 이 또한 퍼블릭으로 해놓음으로써 외부에 데이터들이 모두 노출될 수 있다. 따라서, 사용자 정책을 통해 접근을 통제 해주었는데 이것과 관련된 블로깅을 S3 업로드 를 위한 코드와 함께 작성해볼까 한다. 이렇게 개념을 정리함으로써 세세한 정책들까지 살펴보고 배울 수 있어서 좋았다!
📖 참고 자료
'DevOps > AWS' 카테고리의 다른 글
[AWS] IAM Role 역할 생성하기 (0) | 2023.12.13 |
---|---|
[AWS] AWS CLI 실습 - 액세스 키(Access Key) 발급 및 간단한 명령어 입력 해보기 (0) | 2023.12.12 |
[AWS] windows 에서 AWS CLI 설정하기 (0) | 2023.12.11 |
[AWS] IAM 정책 / 정책 실습 - 사용자 권한 적용하는 방법 (0) | 2023.11.22 |
[AWS] IAM 사용자 계정으로 관리자 및 그룹 생성하기 / 사용자, 그룹, 정책 알아보기 (0) | 2023.11.18 |