대용량 파일 업로드 처리와 S3 연동, 그리고 보안 고려사항

클라이언트가 Presigned URL을 통해 S3에 직접 업로드하고, Lambda로 파일을 검증하여 서버 부하를 최소화하면서 안전한 파일 관리를 구현하는 방법

기존 서버 업로드 방식의 한계

  • 서버 리소스 과부하: 대용량 파일 처리 시 CPU, 메모리 집중 사용으로 다른 API 성능 저하

  • 확장성 문제: 동시 업로드 증가 시 서버 인스턴스 확장만으로는 해결 한계

  • 타임아웃 위험: 대용량 파일 업로드 중 연결 끊김 및 업로드 실패 빈발

  • 후처리 부담: 파일 검증, 변환 작업으로 인한 응답 지연

S3 Presigned URL + Lambda 아키텍처

flowchart TD
    A[Client] -- 1. Presigned URL 요청 --> B[Django Server]
    B -- 2. URL 발급 & DB 저장 --> A
    A -- 3. 파일 직접 업로드 --> C[S3]
    C -- 4. 업로드 이벤트 트리거 --> D[Lambda]
    D -- 5. 파일 검사 --> C
    D -- 6. 검사 결과 전달 --> B
    B -- 7. 상태 업데이트 --> E[Database]

구현 단계

1. Presigned URL 생성 및 파일 정보 사전 저장

  • boto3로 Presigned URL 생성

  • 파일 메타데이터를 데이터베이스에 사전 저장 (상태: 업로드 준비중)

  • ContentType을 활용한 다양한 객체 연결 지원

  • 만료 시간 설정으로 보안 강화

2. 클라이언트 직접 업로드

  • 발급받은 Presigned URL로 S3에 파일 직접 업로드

  • 서버 요청 시와 동일한 파일만 업로드 가능 (후처리에서 검증)

3. Lambda 트리거 기반 파일 검증

  • S3 업로드 완료 이벤트로 Lambda 자동 실행

  • 악성 코드 스캔, 파일 타입 검증 등 보안 검사 수행

  • 파일 무결성 확인 (용량, 타입, 해시값 등)

4. 검증 결과 반영

  • Lambda에서 서버로 검증 결과 전달

  • 파일 정보 불일치 시 상태를 '실패'로 변경

  • 검증 통과 시 상태를 '업로드 완료'로 변경하여 다운로드 허용

주요 장점

  • 서버 리소스 절약: 파일 데이터가 서버를 거치지 않아 메모리, CPU 사용량 대폭 감소

  • 확장성 향상: 대용량 파일 업로드가 서버 성능에 미치는 영향 최소화

  • 안전한 상태 관리: Lambda를 통한 자동화된 파일 검증 및 상태 업데이트

  • 유연한 파일 관리: 스케줄러를 통한 만료 파일 자동 정리 가능

보안 및 관리 요소

  • Presigned URL 만료 시간: 짧은 유효 시간으로 URL 탈취 위험 최소화

  • 파일 무결성 검증: 업로드 요청 파일과 실제 업로드 파일 일치 확인

  • 악성 코드 스캔: Lambda에서 자동화된 보안 검사 수행

  • ContentType 활용: 다양한 모델과의 유연한 파일 연결 지원

실무 적용 고려사항

  • 기존 서버 업로드 대비: 스트리밍 방식 등으로 리소스를 절약해도 파일 검증 과정에서 CPU/메모리 사용 불가피

  • API 성능 보호: 파일 처리로 인한 다른 API 영향 방지 가능

  • 대용량 파일 필수: 자주 대용량 파일을 다루는 서비스에서는 필수적 아키텍처

Last updated