Skip to content

파일 스토리지와 오브젝트 스토리지

서론

사용자가 아바타를 업로드했는데, 서버의 /uploads 디렉토리에 저장했습니다 -- 그러다 서버 디스크가 가득 찼거나, 두 번째 서버를 추가했더니 사용자가 아바타가 있었다 없었다 하는 것을 발견했습니다. 파일 스토리지는 간단해 보이지만, 분산 환경에서는 진지하게 다루어야 할 아키텍처 문제입니다. 오브젝트 스토리지는 인터넷 시대에 이 문제를 해결하는 표준 답안입니다.

이 글에서 배울 내용

이 장을 마치면 다음을 얻게 됩니다:

  • 스토리지 유형 이해: 블록 스토리지, 파일 스토리지, 오브젝트 스토리지의 차이와 적용 시나리오 이해
  • 오브젝트 스토리지 핵심 개념: Bucket, Object, Key, Pre-signed URL 등 핵심 개념 파악
  • 업로드 방안 설계: 클라이언트 직접 업로드 vs 서버 중계 방안의 선택 방법 학습
  • CDN 가속 원리: CDN이 정적 리소스의 글로벌 배포를 어떻게 가속하는지 이해
  • 모범 사례: 파일 명명, 권한 제어, 수명 주기 관리 등 실전 기법 파악
내용핵심 개념
제 1장스토리지 유형 비교블록 스토리지, 파일 스토리지, 오브젝트 스토리지
제 2장오브젝트 스토리지 핵심 개념Bucket, Object, Key, 메타데이터
제 3장파일 업로드 방안클라이언트 직접 업로드, Pre-signed URL
제 4장CDN 가속엣지 노드, 캐시 전략, 오리진 요청
제 5장모범 사례명명 규칙, 권한, 수명 주기

0. 전경도: 파일을 서버 로컬에 저장하면 안 되는 이유

프로젝트를 처음 시작할 때, 사용자가 업로드한 파일을 서버 로컬 디렉토리에 저장하는 것이 가장 직관적인 방법입니다. 하지만 프로젝트가 발전하면서 여러 가지 문제에 직면하게 됩니다:

  • 디스크 공간 제한: 서버 디스크는 항상 가득 차고, 확장이 번거로움
  • 다중 서버 비공유: 로드 밸런싱 후 사용자 요청이 다른 서버로 갈 수 있어 파일을 찾을 수 없음
  • 백업 없음: 서버가 다운되면 파일도 함께 손실
  • CDN 없음: 전 세계 사용자가 동일한 서버에 접속하여 속도가 느림

오브젝트 스토리지의 핵심 가치

오브젝트 스토리지(예: AWS S3, Alibaba Cloud OSS)는 이 모든 문제를 해결합니다: 무한 용량, 글로벌 접근 가능, 자동 백업, CDN 기본 지원. 이미 인터넷 애플리케이션에서 파일을 저장하는 사실상의 표준이 되었습니다.


1. 스토리지 유형 비교: 블록, 파일, 오브젝트

컴퓨터 세계에는 세 가지 주요 스토리지 방식이 있으며, 각각 다른 수준의 문제를 해결합니다.

Storage Type Comparison
Click to inspect the characteristics of each storage model
🧱
Block storage
📁
File storage
☁️
Object storage
Object storage
Stores files as objects through HTTP APIs. Each object has a unique key. It has a flat structure, nearly unlimited capacity, and low cost, making it a common choice for internet applications.
Access method
HTTP/HTTPS RESTful API (PUT/GET/DELETE)
Typical scenarios
Images, videos, backups, static site hosting, data lakes
Representative products
AWS S3, Alibaba Cloud OSS, MinIO, Cloudflare R2
Scalability
Nearly unlimited scaling with automatic distributed storage
차원블록 스토리지파일 스토리지오브젝트 스토리지
데이터 단위고정 크기의 블록파일 + 디렉토리객체(Key-Value)
접근 프로토콜iSCSI/FCNFS/SMBHTTP REST API
성능최고 (밀리초 단위)중간낮음 (하지만 충분함)
확장성제한적중간거의 무한
비용최고중간최저
전형적 시나리오데이터베이스공유 파일이미지/비디오/백업

간단한 기억법

  • 블록 스토리지는 하드 드라이브 -- 데이터베이스용
  • 파일 스토리지는 네트워크 공유 폴더 -- 여러 서버의 설정 공유용
  • 오브젝트 스토리지는 클라우드 드라이브 -- 사용자가 업로드한 이미지, 비디오용

2. 오브젝트 스토리지 핵심 개념

오브젝트 스토리지의 데이터 모델은 매우 간단합니다: Bucket(버킷)은 컨테이너, Object(객체)는 파일이며, 각 객체는 고유한 Key(키)로 식별됩니다.

my-app-bucket/                    ← Bucket(버킷)
├── avatars/user-123.jpg          ← Object Key
├── avatars/user-456.png          ← Object Key
├── reports/2024/q1-report.pdf    ← Object Key("디렉토리"는 Key의 접두사일 뿐)
└── uploads/temp/file.zip         ← Object Key
개념설명예시
Bucket스토리지 컨테이너, 글로벌 고유 명명my-app-prod, company-assets
Object저장된 파일 본체 + 메타데이터이미지 하나, PDF 하나
Key객체의 고유 식별자avatars/user-123.jpg
메타데이터객체의 부가 정보Content-Type, 커스텀 태그
ACL접근 제어 목록public-read, private
Pre-signed URL임시 인증 접근 링크15분 유효 기간의 업로드/다운로드 링크

오브젝트 스토리지에는 진짜 "디렉토리"가 없습니다

avatars/user-123.jpg에서 avatars/는 디렉토리가 아니라 Key의 접두사일 뿐입니다. 오브젝트 스토리지는 평면 구조이며 모든 객체가 동일한 계층에 있습니다. 콘솔에 표시되는 "폴더"는 접두사별로 그룹화한 시각적 효과입니다.


3. 파일 업로드 방안: 누가 파일을 업로드하나요?

파일 업로드에는 두 가지 주류 방안이 있습니다: 서버 중계와 클라이언트 직접 업로드. 대부분의 시나리오에서 클라이언트 직접 업로드가 더 나은 선택입니다.

File Upload Method Comparison
Switch between upload modes to compare their flow
1
Client → Server
The user selects a file and uploads it to your backend server
Large files consume server bandwidth and memory
2
Server receives file
The backend temporarily stores the file on local disk or in memory
May hit Nginx body size limits
3
Server → OSS
The backend forwards the file to object storage
The file is transferred twice, which is inefficient
4
OSS returns URL
Object storage returns the file access URL
5
Server → Client
The backend returns the file URL to the frontend

클라이언트 직접 업로드의 장점

  1. 서버 대역폭 절약: 파일이 서버를 거치지 않고 OSS로 직접 전송
  2. 타임아웃 방지: 대용량 파일 업로드 시 Nginx/게이트웨이의 타임아웃 제한을 트리거하지 않음
  3. 서버 부하 감소: 서버는 자격 증명만 발급하면 되고, 파일 스트림을 처리할 필요 없음
  4. 이어올리기 지원: OSS가 기본적으로 멀티파트 업로드를 지원하며, 프론트엔드에서 이어올리기 구현 가능

구현 단계: 프론트엔드가 백엔드에 Pre-signed URL 요청 -> 프론트엔드가 이 URL로 OSS에 직접 업로드 -> OSS가 백엔드에 콜백 통지


4. CDN 가속: 전 세계 사용자가 모두 빠르게

사용자가 전 세계에 분포해 있을 때, 단일 오리진 서버에서 파일을 다운로드하면 매우 느립니다. CDN(Content Delivery Network)은 전 세계에 엣지 노드를 배포하여 파일을 사용자와 가장 가까운 노드에 캐시하고, 접근 지연을 크게 줄입니다.

How CDN Acceleration Works
Compare file access paths with and without CDN
👤
Beijing user
5ms
Beijing CDN node
Cache hit
Return to origin on cache miss
🏢
Origin (US West S3)
Time to first byte (TTFB)
~30ms
Download 1MB image
~50ms
CDN 개념설명
엣지 노드전 세계 각지에 분포된 캐시 서버
오리진 요청(회원)엣지 노드에 캐시가 없을 때 오리진 서버에 파일 요청
캐시 적중률요청이 엣지 노드에서 직접 응답된 비율, 높을수록 좋음
TTL캐시 유효 기간, 만료 후 다시 오리진 요청 필요
캐시 갱신엣지 노드의 캐시를 능동적으로 제거하여 새 파일이 적용되도록 함

CDN 모범 사례

  • 파일명에 해시 추가: logo.png 대신 logo.a3f2b1.png 사용, 파일 업데이트 시 캐시 갱신 불필요
  • 적절한 TTL 설정: 정적 리소스(JS/CSS/이미지)는 긴 TTL(1년), HTML은 짧은 TTL(5분) 설정
  • Gzip/Brotli 압축 활성화: 텍스트류 리소스는 압축 후 크기가 60-80% 감소

5. 모범 사례

실천설명예시
Key 명명 규칙의미 있는 접두사로 파일 구성{type}/{date}/{uuid}.{ext}
핫스팟 Key 방지증가하는 숫자로 시작하지 않기UUID 또는 해시 접두사 사용
권한 최소화Bucket 기본값은 private공개가 필요한 파일에만 public-read 설정
수명 주기 규칙만료 파일 자동 정리임시 파일 7일 후 자동 삭제
CORS 설정프론트엔드 직접 업로드 시 CORS 설정 필요해당 도메인에 PUT/POST 허용
서버 측 암호화민감 파일에 SSE 활성화SSE-S3 또는 SSE-KMS

요약

파일 스토리지는 모든 웹 애플리케이션이 직면하는 기본 문제입니다. 오브젝트 스토리지는 무한 용량, 저비용, 고가용성의 특성으로 인터넷 애플리케이션의 표준 선택이 되었습니다.

이 장의 핵심 포인트를 되돌아보세요:

  1. 세 가지 스토리지 유형: 블록 스토리지는 데이터베이스용, 파일 스토리지는 공유용, 오브젝트 스토리지는 사용자 파일용
  2. 오브젝트 스토리지 모델: Bucket + Key + Object, 평면 구조, HTTP API 접근
  3. 클라이언트 직접 업로드: Pre-signed URL 방안, 파일이 서버를 거치지 않아 효율적이고 자원 절약
  4. CDN 가속: 엣지 노드 캐시 + 파일명 해시로 전 세계 사용자에게 빠른 속도 보장
  5. 보안 및 관리: 권한 최소화, 수명 주기 규칙, 서버 측 암호화

더 읽어보기