Show GN: smol-image-processor – EXIF/메타데이터 제거 후 WebP로 정규화하는 마이크로서비스 (Bun/Elysia)
요약
Bun과 Elysia를 사용하여 이미지의 EXIF/메타데이터를 제거하고 WebP 형식으로 정규화하는 마이크로서비스입니다. Sharp 라이브러리를 활용해 이미지 방향을 보존하며, 압축 폭탄 및 DoS 공격을 방지하는 보안 레이어를 포함합니다.
핵심 포인트
- EXIF 및 메타데이터를 제거하여 개인정보 보호 및 용량 최적화
- 모든 입력 이미지를 표준 WebP 형식으로 일괄 변환
- 픽셀 및 프레임 수 제한을 통한 보안 방어 레이어 구축
- Bun과 Elysia 스택을 활용한 고성능 마이크로서비스 구현
백엔드에서 사용자 이미지 업로드를 받을 때 조용히 따라오는 문제들이 있습니다.
- JPEG에는 GPS 좌표, 기기 모델명, 촬영 시각이 EXIF로 담겨 있을 수 있다
- ICC 프로파일 같은 색상 메타데이터도 그대로 저장·배포될 수 있다
- JPEG, PNG, GIF, WebP가 뒤섞여 들어오면 저장/CDN/렌더링 파이프라인이 복잡해진다
- EXIF orientation만 잘못 처리해도 이미지가 90° 돌아간 채로 저장된다
smol-image-processor는 이 문제들을 일괄 처리하는 단일 역할 마이크로서비스입니다.
동작 방식
POST /process
에 multipart/form-data로 이미지를 올리면 항상 WebP가 응답으로
돌아옵니다. Sharp의 기본 출력 동작이 소스 EXIF, ICC 프로파일 등 메타데이터를
버리는 특성을 그대로 활용합니다. 단, EXIF orientation은 메타데이터를 제거하기
전에 .rotate()
로 픽셀에 먼저 적용해 이미지 방향이 보존됩니다.
방어 레이어는 두 가지입니다.
픽셀 수 제한(MAX_PIXELS): 파일 크기는 작아도 디코딩 시 수억 픽셀로
팽창하는 이미지(decompression bomb)를 Sharp의limitInputPixels
로 차단합니다.프레임 수 제한(MAX_PAGES): 수백~수천 프레임짜리 애니메이션 GIF/WebP로
메모리·CPU를 고갈시키는 DoS를 막습니다.
애니메이션 GIF/WebP는 animated WebP로 변환되며 프레임 딜레이와 루프 횟수가
보존됩니다. PNG의 알파 채널도 그대로 유지됩니다.
응답 헤더에 처리된 이미지의 width, height, size, animated 여부, 페이지 수가
담겨 있어 별도 메타데이터 추출 단계 없이 DB에 바로 저장할 수 있습니다.
스택
- Runtime: Bun, HTTP 프레임워크: Elysia
- 이미지 처리: Sharp (libvips 래퍼)
- Docker 이미지 제공 (GHCR)
빠른 시작
docker run --rm -p 6701:6701 ghcr.io/levish0/smol-image-processor
curl -F file=@photo.jpg http://localhost:6701/process -o clean.webp
AI 자동 생성 콘텐츠
본 콘텐츠는 GeekNews의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기