파일 스토리지와 오브젝트 스토리지
서론
사용자가 아바타를 업로드했는데, 서버의 /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. 스토리지 유형 비교: 블록, 파일, 오브젝트
컴퓨터 세계에는 세 가지 주요 스토리지 방식이 있으며, 각각 다른 수준의 문제를 해결합니다.
| 차원 | 블록 스토리지 | 파일 스토리지 | 오브젝트 스토리지 |
|---|---|---|---|
| 데이터 단위 | 고정 크기의 블록 | 파일 + 디렉토리 | 객체(Key-Value) |
| 접근 프로토콜 | iSCSI/FC | NFS/SMB | HTTP 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. 파일 업로드 방안: 누가 파일을 업로드하나요?
파일 업로드에는 두 가지 주류 방안이 있습니다: 서버 중계와 클라이언트 직접 업로드. 대부분의 시나리오에서 클라이언트 직접 업로드가 더 나은 선택입니다.
클라이언트 직접 업로드의 장점
- 서버 대역폭 절약: 파일이 서버를 거치지 않고 OSS로 직접 전송
- 타임아웃 방지: 대용량 파일 업로드 시 Nginx/게이트웨이의 타임아웃 제한을 트리거하지 않음
- 서버 부하 감소: 서버는 자격 증명만 발급하면 되고, 파일 스트림을 처리할 필요 없음
- 이어올리기 지원: OSS가 기본적으로 멀티파트 업로드를 지원하며, 프론트엔드에서 이어올리기 구현 가능
구현 단계: 프론트엔드가 백엔드에 Pre-signed URL 요청 -> 프론트엔드가 이 URL로 OSS에 직접 업로드 -> OSS가 백엔드에 콜백 통지
4. CDN 가속: 전 세계 사용자가 모두 빠르게
사용자가 전 세계에 분포해 있을 때, 단일 오리진 서버에서 파일을 다운로드하면 매우 느립니다. CDN(Content Delivery Network)은 전 세계에 엣지 노드를 배포하여 파일을 사용자와 가장 가까운 노드에 캐시하고, 접근 지연을 크게 줄입니다.
| 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 |
요약
파일 스토리지는 모든 웹 애플리케이션이 직면하는 기본 문제입니다. 오브젝트 스토리지는 무한 용량, 저비용, 고가용성의 특성으로 인터넷 애플리케이션의 표준 선택이 되었습니다.
이 장의 핵심 포인트를 되돌아보세요:
- 세 가지 스토리지 유형: 블록 스토리지는 데이터베이스용, 파일 스토리지는 공유용, 오브젝트 스토리지는 사용자 파일용
- 오브젝트 스토리지 모델: Bucket + Key + Object, 평면 구조, HTTP API 접근
- 클라이언트 직접 업로드: Pre-signed URL 방안, 파일이 서버를 거치지 않아 효율적이고 자원 절약
- CDN 가속: 엣지 노드 캐시 + 파일명 해시로 전 세계 사용자에게 빠른 속도 보장
- 보안 및 관리: 권한 최소화, 수명 주기 규칙, 서버 측 암호화
더 읽어보기
- AWS S3 개발자 가이드 - 오브젝트 스토리지의 벤치마크 문서
- Alibaba Cloud OSS 모범 사례 - 국내에서 가장 많이 사용되는 오브젝트 스토리지
- MinIO 문서 - 오픈소스 S3 호환 오브젝트 스토리지
- Cloudflare R2 - 제로 이그레스 비용 오브젝트 스토리지
- Pre-signed URL 상세 설명 - 클라이언트 직접 업로드의 핵심 메커니즘