본문으로 건너뛰기
HexaTransfer
블로그로 돌아가기
기술 심층 분석

파일 전송을 위한 S3 호환 스토리지 아키텍처

S3 호환 스토리지 기반 파일 전송 시스템을 구축하세요. 아키텍처 패턴, 공급업체 비교, 성능 최적화 기법입니다.

KISA(한국인터넷진흥원)는 개인정보 보호법(PIPA) 준수를 위해 클라우드 스토리지에 저장되는 개인정보에 대한 접근 통제와 암호화를 권고합니다. S3 호환 스토리지는 API가 범용적이고, 가격이 경쟁적이며, 디스크를 관리하지 않고도 확장되기 때문에 대부분의 현대 파일 전송 서비스의 중추입니다. AWS S3가 모델을 선도했고, Cloudflare R2, Backblaze B2, Wasabi, MinIO, DigitalOcean Spaces가 동일한 REST 인터페이스를 구현했습니다. S3 호환 스토리지 기반의 전송 서비스를 구축하면 내구성 높은 오브젝트 스토리지(AWS의 경우 11 나인), 대용량 파일용 멀티파트 업로드, 앱 서버를 우회하는 직접 브라우저-스토리지 전송을 위한 사전 서명 URL을 얻습니다.

S3 API가 승리한 이유

S3 API는 사실상 표준입니다. Amazon이 2006년에 발표한 이후 모든 주요 오브젝트 스토리지 제공자가 워크로드를 확보하기 위해 이를 구현했습니다. AWS SDK for JavaScript(aws-sdk v3)를 사용하여 잘 작성된 전송 서비스는 엔드포인트 URL만 변경하여 제공자를 교체할 수 있습니다. minio-js, MinIO의 mc CLI, rclone 같은 오픈소스 클라이언트는 제공자에 관계없이 변경 없이 작동합니다. 이는 아키텍트에게 유연성을 줍니다. 안정성을 위해 AWS S3에서 시작하고, 무료 이그레스를 위해 Cloudflare R2로 이동하거나, 데이터 상주를 위해 MinIO 셀프 호스팅을 운영할 수 있으며, 애플리케이션 코드를 다시 작성할 필요가 없습니다.

전송 워크로드를 위한 제공자 비교

| 제공자 | 스토리지 | 이그레스 | 무료 계층 | 특징 | |---|---|---|---|---| | AWS S3 Standard | $0.023/GB | $0.09/GB | 5 GB, 15 GB 이그레스/월 | 11 나인 내구성 | | Cloudflare R2 | $0.015/GB | $0 | 10 GB, 100만 읽기/월 | 무료 이그레스 | | Backblaze B2 | $0.006/GB | $0.01/GB | 10 GB 무료 | Cloudflare와 대역폭 동맹 | | Wasabi | $0.0069/GB | $0 | 없음(유료만) | 90일 최소 스토리지 | | MinIO 셀프 호스팅 | 하드웨어 비용 | 자체 대역폭 | 오픈소스 | AGPL v3, 어디서나 실행 | | DigitalOcean Spaces | 250 GB에 $5/월 | 1 TB 포함 | 없음 | 고정 가격 번들 |

파일이 잠시 저장된 후 다운로드되는 전송 서비스에서는 이그레스가 비용을 지배합니다. Cloudflare R2와 Backblaze B2(대역폭 동맹을 통해)가 비용에서 우세합니다. AWS S3는 Intelligent-Tiering 및 수명 주기 정책 같은 기능에서 우세합니다.

대용량 파일을 위한 멀티파트 업로드

S3 멀티파트 업로드 API는 전송 서비스가 5 GB 이상의 파일을 처리하는 방법입니다. UploadId를 얻기 위해 InitiateMultipartUpload를 시작하고, 각 청크에 대해 UploadPart를 실행하며(최소 5 MB, 최대 파트당 5 GB, 총 10,000 파트), ETag 목록과 함께 CompleteMultipartUpload를 보냅니다. 파트는 병렬로 업로드할 수 있습니다. 실패한 파트는 독립적으로 재시도됩니다. 클라이언트는 각 파트에 대해 사전 서명 URL을 사용하므로 업로드가 앱 서버를 완전히 우회하여 브라우저에서 S3로 직접 이루어집니다. S3의 최대 오브젝트 크기는 5 TB로 사실상 모든 전송 사용 사례를 커버합니다.

사전 서명 URL과 직접 업로드

사전 서명 URL은 클라이언트가 서버가 바이트에 접촉하지 않고 S3에 직접 업로드하거나 다운로드할 수 있게 합니다. 백엔드는 HMAC-SHA256과 AWS 자격증명으로 서명된 URL을 생성하며, 지정된 시간(일반적으로 1~24시간) 동안 유효합니다. 클라이언트는 URL에 대해 PUT 또는 GET을 수행합니다. 이 패턴은 상당한 비용을 절약합니다. 앱 서버는 10 GB 파일을 프록시할 대역폭이 필요 없고, 클라이언트가 스토리지 엔드포인트에 직접 접근하므로 지연 시간이 줄어듭니다. 버킷의 CORS 구성이 출처에서 브라우저 업로드를 허용합니다. 저장 시 암호화에는 SSE-C(고객 제공 키를 사용한 서버 측 암호화) 또는 SSE-KMS를 사용하세요.

전송 서비스의 아키텍처 패턴

일반적인 S3 백엔드 전송 아키텍처는 세 계층입니다. 프론트엔드는 브라우저에서 실행되며 멀티파트 업로드를 시작하고 청크 진행을 추적합니다. API 백엔드(소규모 Node.js, Go, 또는 Python 서비스)는 인증, PostgreSQL 또는 DynamoDB의 메타데이터 저장, 사전 서명 URL 생성을 처리합니다. 스토리지 계층은 S3 호환 버킷입니다. 앱 계층이 상태 비저장이고 스토리지 계층이 모든 대역폭을 흡수하기 때문에 이 아키텍처는 수평으로 확장됩니다. GET 요청 앞에 Cloudflare 또는 CloudFront CDN을 추가하면 전 세계 다운로드 속도가 향상되고 S3 이그레스가 줄어듭니다.

수명 주기 정책과 자동 삭제

전송 서비스는 파일이 자동으로 만료되어야 합니다. S3 수명 주기 규칙은 오브젝트를 나이에 따라 스토리지 클래스 간에 전환하거나 삭제합니다. "7일보다 오래된 오브젝트 삭제" 규칙은 매일 실행되어 만료된 전송을 비용 없이 제거합니다. Cloudflare R2는 Terraform 제공자 또는 R2 API를 통한 수명 주기 규칙을 지원합니다. 더 세밀한 제어를 위해 각 오브젝트에 만료 타임스탬프를 태그하고 태그를 기반으로 삭제하는 야간 Lambda를 실행하세요. 포기된 멀티파트 업로드에는 고유한 규칙이 있어야 합니다. 1~7일 후 AbortIncompleteMultipartUpload가 불완전한 세션에서 스토리지를 회수합니다.

성능 최적화

S3 처리량은 접두사에 따라 확장됩니다. AWS S3는 버킷의 접두사당 초당 3,500 PUT과 5,500 GET을 목표로 하며, 키의 첫 문자의 일관된 해싱을 사용하여 부하를 분산합니다. 순차적 키 접두사(001, 002, 003)를 피하세요. 동일한 파티션으로 해시되어 핫스팟을 생성합니다. 무작위 접두사나 UUID의 첫 8자 같은 해시 기반 키를 사용하세요. Transfer Acceleration은 가장 가까운 CloudFront 엣지를 통해 업로드를 라우팅하여 추가 비용으로 먼 클라이언트의 업로드 시간을 50~500% 단축할 수 있습니다.

암호화 옵션과 트레이드오프

서버 측 암호화는 세 가지입니다. SSE-S3(또는 R2의 기본 암호화)는 제공자가 관리하는 키로 AES-256을 사용하며, 투명하고 무료입니다. SSE-KMS는 AWS KMS 관리 키를 사용하며 10,000 요청당 $0.03에 키 비용이 추가되고 규정 준수에 유용한 KMS 감사 로그를 생성합니다. SSE-C는 요청당 고객 제공 키를 수락하며, 서버가 이를 암호화에 사용하고 키를 폐기합니다. 진정한 E2EE를 위해서는 libsodium 또는 Web Crypto의 AES-GCM을 사용하여 업로드 전에 클라이언트 측에서 암호화한 다음 저장된 오브젝트를 불투명한 암호문으로 처리하세요.

HexaTransfer의 접근 방식

최소 전송 흐름: 클라이언트가 업로드 토큰을 요청하고, 백엔드가 멀티파트 업로드 시작을 위한 사전 서명 URL을 생성하고, 클라이언트가 청크를 S3에 직접 업로드하고, 백엔드가 메타데이터를 저장하고 공유 가능한 링크를 반환하고, 수신자가 링크를 클릭하면 백엔드가 사전 서명 다운로드 URL을 생성하고 브라우저가 가져와 복호화합니다. HexaTransfer는 이 패턴을 클라이언트 측 AES-256-GCM 암호화와 함께 사용하므로 S3 호환 백엔드는 암호문만 저장하고 암호화 키는 브라우저를 떠나지 않습니다.

https://hexatransfer.com 에서 무료로 시작하세요. 계정 불필요, 최대 10 GB.

엔드투엔드 암호화로 대용량 파일을 안전하게 전송

엔드투엔드 암호화로 최대 10GB의 파일을 무료로 전송하세요. 계정이 필요하지 않습니다. 업로드 전에 브라우저에서 파일이 암호화되어 다른 사람은 읽을 수 없습니다.

파일 보내기