모든 게시글개발

이미지 최적화와 Base64: 언제 사용해야 할까?

Data URI를 사용한 이미지 임베딩의 장단점과 최적의 사용 시나리오를 분석합니다.

19분 읽기

Data URI란?

Data URI는 파일을 외부 리소스로 로드하지 않고 문서 내에 직접 포함하는 방식입니다.

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==" alt="1px 빨간 점">

장점

1. HTTP 요청 감소

작은 이미지 여러 개를 하나의 HTML/CSS 파일에 포함시켜 HTTP 요청 수를 줄일 수 있습니다.

/* CSS에서 Data URI 사용 */ .icon-home { background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0...'); }

2. 캐싱 단순화

이미지가 CSS나 HTML과 함께 캐싱되므로 별도의 캐시 관리가 필요 없습니다.

3. 외부 의존성 제거

이미지 서버가 다운되어도 사이트가 정상적으로 작동합니다.

단점

1. 파일 크기 증가 (약 33%)

Base64 인코딩은 원본보다 약 33% 더 큽니다.

원본 이미지: 3KB
Base64 인코딩: 4KB (+33%)

2. 캐싱 비효율

이미지가 변경되면 전체 CSS/HTML 파일을 다시 다운로드해야 합니다.

<!-- 로고 하나만 변경되어도 전체 HTML 재다운로드 --> <img src="data:image/png;base64,..." alt="로고">

3. 렌더링 지연

브라우저는 전체 Data URI가 로드될 때까지 이미지를 표시하지 않습니다.

언제 사용해야 할까?

✅ 사용 권장

1. 매우 작은 아이콘 (< 5KB)

<!-- 체크마크 아이콘 --> <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD..." alt="완료">

2. 자주 변경되지 않는 로고

.logo { background: url('data:image/png;base64,...') no-repeat; }

3. 크리티컬 CSS의 이미지

첫 화면에 필수적인 작은 이미지는 인라인으로 포함하면 렌더링이 빨라집니다.

4. 이메일 템플릿

이메일 클라이언트에서 외부 이미지가 차단될 수 있으므로 Data URI가 유용합니다.

❌ 사용 비권장

1. 큰 이미지 (> 10KB)

<!-- 나쁜 예: 큰 사진을 Data URI로 --> <img src="data:image/jpeg;base64,/9j/4AAQSkZJRg..." alt="풍경사진"> <!-- 파일 크기가 너무 커져서 성능 저하 -->

2. 여러 페이지에서 공유되는 이미지

/* 나쁜 예: 모든 페이지의 CSS에 포함 */ .common-logo { background: url('data:image/png;base64,...'); } /* → 각 페이지마다 중복 다운로드 */

3. 자주 변경되는 이미지

<!-- 나쁜 예: 자주 업데이트되는 배너 --> <img src="data:image/jpeg;base64,..." alt="이벤트 배너"> <!-- → 배너만 바뀌어도 HTML 전체 재배포 필요 -->

4. 반응형 이미지

<!-- 나쁜 예: srcset이 필요한 경우 --> <img src="data:image/jpeg;base64,..." srcset="data:image/jpeg;base64,... 2x"> <!-- → Data URI가 너무 길어짐 -->

성능 비교

시나리오 1: 작은 아이콘 10개 (각 2KB)

방식총 크기HTTP 요청첫 로드 시간
외부 이미지20KB11개1.2초
Data URI27KB1개0.8초

결론: Data URI가 더 빠름 ✅

시나리오 2: 큰 사진 1개 (50KB)

방식총 크기HTTP 요청첫 로드 시간
외부 이미지50KB2개0.9초
Data URI67KB1개1.3초

결론: 외부 이미지가 더 빠름 ❌

실전 팁

1. 자동화 도구 사용

빌드 타임에 작은 이미지를 자동으로 Data URI로 변환:

// webpack.config.js module.exports = { module: { rules: [ { test: /\.(png|jpg|gif)$/, type: 'asset', parser: { dataUrlCondition: { maxSize: 5 * 1024 // 5KB 미만만 Data URI로 } } } ] } };

2. SVG는 직접 인라인

작은 SVG 아이콘은 Base64 대신 직접 HTML에 포함:

<!-- Base64 대신 이렇게 --> <svg width="24" height="24" viewBox="0 0 24 24"> <path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/> </svg>

이점:

  • 압축 효율이 더 좋음
  • CSS로 색상 변경 가능
  • 더 읽기 쉬움

3. 조건부 로딩

// 작은 이미지만 Data URI로 변환 function shouldUseDataURI(fileSize) { return fileSize < 5 * 1024; // 5KB }

4. 크리티컬 CSS만 인라인

<head> <!-- 크리티컬 CSS: 작은 아이콘만 Data URI --> <style> .icon { background: url('data:image/svg+xml;base64,...'); } </style> <!-- 나머지는 외부 파일 --> <link rel="stylesheet" href="styles.css"> </head>

도구 추천

온라인 변환

  • Base64.kr - 이미지를 Base64로 변환
  • 파일 크기 확인 기능 제공
  • Data URI 형식 자동 생성

빌드 도구

// Vite 설정 예시 export default { build: { assetsInlineLimit: 4096 // 4KB 미만만 인라인 } }

마치며

Data URI는 작은 이미지에 효과적입니다:

  • ✅ 5KB 미만의 아이콘
  • ✅ 자주 변경되지 않는 이미지
  • ✅ 첫 화면에 필수적인 이미지

반대로 큰 이미지는 외부 파일로 유지하는 것이 좋습니다:

  • ❌ 10KB 이상의 사진
  • ❌ 여러 페이지에서 사용되는 이미지
  • ❌ 자주 업데이트되는 이미지

이미지를 Base64로 변환하려면 이미지 변환기를 사용해보세요!

관련 게시글