-
[AWS + Spring] Spring Boot에서 S3와 CloudFront를 이용한 파일 업로드 (1)Spring 2023. 8. 5. 18:14반응형
Spring Boot 애플리케이션에서 파일 업로드 기능을 구현하고, 이를 AWS S3와 CloudFront를 활용하여 파일을 안정적으로 저장하고 배포하는 방법을 설명합니다. 이를 통해 애플리케이션의 성능과 안정성을 향상시키며, 사용자 경험을 개선할 수 있습니다.
Spring Boot Server에서 미리 서명된 Presigned URL을 생성하고 Client단에서 별도의
권한 없이도 파일을 업로드 할 수 있습니다.
💡 CloudFront와 S3를 연결 하는 이유는 아래와 같습니다.1. 빠른 파일 배포
- CloudFront는 전 세계에 분산된 엣지 로케이션(Edge Location)을 가지고 있으며, 사용자에게 가까운 엣지 로케이션에서 콘텐츠를 제공합니다. 이로 인해 파일을 빠르게 다운로드할 수 있으며, 사용자 경험을 향상시킵니다.
2. 캐싱 기능
- CloudFront는 콘텐츠를 엣지 로케이션에 캐시하여 반복적인 요청에 대한 성능을 개선합니다. S3와 비교하여 더 빠른 응답 시간을 제공하며, 애플리케이션 서버의 부하를 줄여줍니다.
3. 보안 강화
- CloudFront는 AWS WAF(Web Application Firewall)와 통합하여 DDoS 공격 및 다른 웹 보안 위협으로부터 보호할 수 있습니다. 또한, CloudFront를 통해 특정 파일에 대한 접근 제어를 설정할 수 있어 보안성을 높일 수 있습니다.
4. 비용 최적화
- CloudFront는 콘텐츠 제공에 필요한 데이터 트래픽만큼만 요금을 부과합니다. 따라서 S3에서 직접 파일을 다운로드하는 경우보다 데이터 전송 비용을 절감할 수 있습니다.
5. 컨텐츠 갱신 관리
- CloudFront는 오리진 서버에서 파일이 변경되었을 때 자동으로 해당 변경 내용을 업데이트하여 사용자에게 최신 콘텐츠를 제공합니다. 이로 인해 콘텐츠 갱신 관리가 편리해집니다.
6. 프록시 기능
- CloudFront는 애플리케이션 서버의 직접 접근을 막고 중간에 위치하여 프록시 역할을 수행합니다. 이는 애플리케이션 서버의 보안을 강화하고 부하를 분산하는데 도움이 됩니다.
7. 확장성
- CloudFront는 높은 가용성과 확장성을 제공하며, 글로벌 사용자들에게 빠르고 안정적인 서비스를 제공할 수 있습니다.따라서 S3와 CloudFront를 연결하는 것은 파일 배포 및 업로드의 성능을 개선하고, 보안성과 비용 효율성을 높이며, 사용자 경험을 향상시킬 수 있는 중요한 결정입니다.
📌 시작하기
목차1. AWS 계정 권한 설정
2. S3 버킷 생성
3. CloudFront 배포 생성
4. S3 정책 설정
5. Spring Boot 프로젝트 설정
6. 파일 업로드 기능 구현
1. AWS IAM 계정 생성- Master 계정이 아닌 S3 업로드용 IAM 계정을 생성합니다.
AmazonS3FullAccess 권한을 적용합니다.
2. S3 버킷 생성
- Resource를 저장하기 위한 S3 Bucket을 생성합니다.
- 퍼블릭 액세스를 차단하여 미리 생성한 IAM 계정에게만 권한을 부여할 예정입니다.
3. CloudFront 배포 생성
원본 도메인명을 입력하고, S3 버킷 액세스는 '원본 액세스 제어'로 설정 합니다.
서명 요청을 선택 하고, 원본 유형은 S3로 지정합니다.
기본값으로 설정합니다.
💡 뷰어 프로토콜 정책을 Redirect HTTP to HTTPS로 설정 합니다.
- HTTP 요청이 CloudFront로 들어오면, CloudFront는 요청을 HTTPS로 리다이렉션하여 보안 연결을 강제합니다.
- HTTPS는 데이터를 암호화하여 전송하므로, 사용자의 데이터 보안을 강화할 수 있습니다. 또한 HTTPS를 사용하는 것은
검색 엔진 최적화(SEO) 측면에서도 이점이 있습니다.
💡 허용된 HTTP 방법을 GET, HEAD로 설정 합니다.
- CloudFront에 대한 HTTP 요청 중 GET 및 HEAD 메서드만 허용합니다. 즉, POST, PUT 등의 메서드는 허용되지 않습니다.
- 보안 상의 이유로 HTTP GET 및 HEAD 요청만 허용하면, 악의적인 요청에 의한 보안 위협을 줄일 수 있습니다.
필요한 HTTP 메서드만 허용함으로써 웹 애플리케이션의 안정성을 높일 수 있습니다.
💡 뷰어 액세스 제한은 NO로 설정 합니다.
- 뷰어 액세스 제한을 사용하지 않음을 나타냅니다. 즉, 특정 IP 주소, 국가, 또는 기타 제한 조건에 따른 액세스 제어를 하지 않음을
의미합니다.
- 액세스 제한을 사용하지 않으면 모든 사용자가 CloudFront에서 콘텐츠를 볼 수 있습니다. 단순한 콘텐츠 전송을 위한 경우에
유용하며 추가적인 액세스 제어가 필요 없는 경우에 설정합니다.
💡 캐시 키 및 원본 요청은 Cache Policy and origin request policy로 설정하고 CachingOptimized 정책을 선택합니다.
- CloudFront 캐시 정책(Cache Policy) 및 오리진 요청 정책(Origin Request Policy)으로 "CachingOptimized"를 사용합니다.
이는 CloudFront가 최적의 캐시 행동을 수행하도록 지시하는 설정입니다.
- CachingOptimized 캐시 정책을 사용하면, 콘텐츠의 최적의 캐싱과 캐시된 콘텐츠의 유효성을 유지하면서 원본 서버에
지속적인 요청을 줄일 수 있습니다. 이로 인해 더 효율적이고 빠른 콘텐츠 전송이 가능해집니다.
미리 생성 해놓은 대체 도메인, SSL 인증서 (https)를 적용합니다.
지원 HTTP 버전은 HTTP/2를 선택합니다.
HTTP/2는 HyperText Transfer Protocol의 두 번째 주요 버전으로, 이전 버전인 HTTP/1.1의 성능과 성능 개선을 위해 설계되었습니다. 주요 특징은 다음과 같습니다.
1. 다중화(Multiplexing)2. 헤더 압축(Header Compression)
3. 서버 푸시(Server Push)
4. 이진 프레이밍(Binary Framing)
HTTP/2를 사용하면 웹 페이지의 로딩 속도를 향상시키고, 빠르고 효율적인 웹 애플리케이션을 제공할 수 있습니다. CloudFront는 HTTP/2를 지원하여 클라이언트와의 통신을 최적화하고, 사용자에게 더 나은 경험을 제공할 수 있도록 도와줍니다.
설정은 여기까지 입니다. 이제 생성을 합니다.
설정을 마치고 CloudFront 생성을 하고 나면 상단에 S3 정책 알림이 뜨는데 복사하여 S3 권한 정책에 붙여넣어야 합니다.
4. S3 정책 설정
- Amazon S3 > 버킷 > My Bucket > 권한 화면으로 이동합니다.
- 위에서 복사한 CloudFront 정책을 붙여 넣습니다. (5-18 Line)
- PutObject Action을 위에서 생성한 IAM 계정에 대해 Allow 해주는 정책을 입력합니다. (19-27 Line)
* Sid는 마음대로 지정할 수 있습니다.
AllowCloudFrontServicePrincipal
이 정책은 위에서 생성한 CloudFront 배포를 통해 접근하는 요청만이 S3 버킷의 객체를 읽을 수 있도록 허용합니다.
따라서 CloudFront를 통해 해당 S3 버킷의 객체에 대한 안전한 읽기 권한을 부여하는 역할을 합니다.
일반적으로 CloudFront는 S3의 콘텐츠를 안전하게 전송하고 캐시하기 위해 이러한 정책을 사용합니다.
AllowIAMUserAPutObject
이 정책은 지정한 특정 IAM 사용자에게 위에서 생성한 S3 버킷에 있는 모든 객체를 업로드할 수 있는 권한을 부여합니다.
따라서 이 사용자는 해당 버킷에 파일이나 객체를 업로드할 수 있게 됩니다.
이러한 방식으로 특정 사용자에게만 업로드 권한을 부여할 수 있어서 보안성을 높일 수 있습니다.
CORS 정책 추가
추가적으로, S3 Cors 정책도 설정을 해줘야 합니다.
본 포스팅에서는 GET, PUT Method에 대해서 CORS 설정 적용 하겠습니다.
MaxAgeSecond는 3000으로 지정 했습니다.
이렇게 File Upload를 할 Resource 저장소인 AWS S3와
캐싱 및 보안 목적으로 CloudFront 배포를 생성 하고 연결 및 정책 설정도 마쳤습니다.
본 포스팅 내용이 길어져서 다음 포스팅에서 Spirng Boot 설정과 API를 구현 해보겠습니다.
https://developer-been.tistory.com/38
반응형'Spring' 카테고리의 다른 글
Spring boot Gitlab CI/CD 구축 (1) (0) 2023.09.10 [AWS + Spring] Spring Boot에서 S3와 CloudFront를 이용한 파일 업로드 (2) (0) 2023.09.03 [Spring] Scheduler Lock(SchedLock) - Multiple Scheduler Instance 방지 (0) 2023.02.22 [AWS + Spring] EB + ElastiCache Redis + Spring Boot 연동 (2) (0) 2023.01.15 [AWS + Spring] EB + ElastiCache Redis + Spring Boot 연동 (1) (0) 2023.01.15