Skip to content

[fix] 사진 해상도 무제한으로 인한 썸네일 생성 메모리 폭증 위험 #87

Description

@hamtorygoals

📄 Description

이슈 #70(PHOTO-02/03 파일 수·용량 제한) 검증 과정에서 발견한 별도 문제입니다.

ThumbnailProcessingService.process()는 원본을 통째로 다운로드해 ThumbnailImageProcessor.createThumbnail()에서 ImageIO.read()로 완전히 압축 해제(디코딩)한 뒤 리사이즈·재인코딩합니다. 이 디코딩 단계의 메모리 비용은 압축 파일 크기가 아니라 해상도(픽셀 수)에 비례합니다.

그런데 PhotoUploadCompleteRequest.width/height는 클라이언트가 EXIF에서 추출해 보낸 값을 검증 없이 그대로 저장하는 메타데이터일 뿐이고, 실제 다운로드된 원본의 해상도 자체를 제한하는 로직은 시스템 어디에도 없습니다. PHOTO-02가 검증하는 건 sizeBytes(≤20MiB)와 contentType뿐입니다.

즉 압축률이 높은 포맷·설정을 쓰면 20MiB 이하이면서도 해상도가 매우 큰 이미지를 업로드할 수 있고, 이 경우 썸네일 생성 시 서버 메모리 사용량이 예상보다 훨씬 커질 수 있습니다.

실측 결과 (조사용 벤치마크, ThumbnailMemoryBenchmarkTest)

  • 12MP(4032×3024) 이미지: 파일 크기를 0.3MiB12.4MiB로 40배 이상 바꿔도 디코딩+리사이즈+인코딩 피크 메모리 증가량은 7174MiB로 거의 고정
  • 48.8MP(8064×6048) 이미지: 파일 크기가 **더 작음(0.76MiB < 1.34MiB)**에도 피크 메모리는 3.4배 더 큼(252MiB)
  • thumbnailExecutor 최대 동시성(6개) 실행 시 12MP 기준 합산 피크 증가량 약 350~380MiB

결론적으로 파일 크기 상한(20MiB)은 이 위험을 전혀 통제하지 못하며, 배포 인스턴스가 6GB ARM 공유 인스턴스(prod·dev 컨테이너 동시 운영, cgroup 메모리 제한 없음)라는 점을 고려하면 실제 위험 요인입니다.

✅ Tasks

  • 해상도 상한을 어떻게 통제할지 결정 — (a) PHOTO-02/03에서 width×height 상한 검증 추가, 또는 (b) ThumbnailImageProcessor가 원본을 풀 해상도로 디코딩하지 않도록 ImageReadParam 서브샘플링 등으로 다운샘플 디코딩 방식 변경
  • 선택한 방식에 대해 다양한 해상도·파일 크기 조합으로 메모리 사용량 재측정
  • 검증/변경 사항을 docs/apidoc/07-photo-management.md, 의사결정 로그에 반영

📎 ETC

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions