๐Ÿ”
โ† ๊ฐ€์ด๋“œ ๋ชฉ๋ก์œผ๋กœ

์ด๋ฏธ์ง€๋ฅผ Base64 ๋ฐ์ดํ„ฐ URL๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•

ยท ํƒœ๊ทธ: image-to-base64, base64, data-url, image-embedding, web-performance, html, css

Base64 ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ URL์ด๋ž€?

Base64 ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ URL์€ ์ „์ฒด ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ํ…์ŠคํŠธ ๋ฌธ์ž์—ด๋กœ ์›น ๋ฌธ์„œ์— ์ง์ ‘ ์ž„๋ฒ ๋”ฉํ•˜์—ฌ, ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•œ ๋ณ„๋„์˜ HTTP ์š”์ฒญ์ด ํ•„์š” ์—†๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์™ธ๋ถ€ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋Œ€์‹ , ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๊ฐ€ HTML ๋˜๋Š” CSS์— ์ด๋ฏธ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==

๊ตฌ๋ถ„ํ•ด ๋ณด๋ฉด:

  • data: โ€” ๋ฐ์ดํ„ฐ URI ์Šคํ‚ด ์ ‘๋‘์‚ฌ
  • image/png โ€” ์ž„๋ฒ ๋”ฉ๋œ ์ด๋ฏธ์ง€์˜ MIME ์œ ํ˜•
  • ;base64 โ€” Base64 ์ธ์ฝ”๋”ฉ์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค
  • ,iVBORw0... โ€” ์‹ค์ œ Base64๋กœ ์ธ์ฝ”๋”ฉ๋œ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ

์™œ ์ด๋ฏธ์ง€๋ฅผ Base64๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ• ๊นŒ์š”?

์ด๋ฏธ์ง€๋ฅผ Base64๋กœ ์ž„๋ฒ ๋”ฉํ•˜๋Š” ๊ฒƒ์€ ์—ฌ๋Ÿฌ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค:

HTTP ์š”์ฒญ ๊ฐ์†Œ

๊ฐ ์™ธ๋ถ€ ์ด๋ฏธ์ง€ ํŒŒ์ผ์€ ๋ณ„๋„์˜ HTTP ์š”์ฒญ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Base64 ๋ฐ์ดํ„ฐ URL์€ ์ด๋Ÿฌํ•œ ์š”์ฒญ์„ ์ œ๊ฑฐํ•˜์—ฌ, ํŠนํžˆ ์ง€์—ฐ์ด ๋†’์€ ์—ฐ๊ฒฐ์ด๋‚˜ ์ž‘์€ ์• ์…‹์ด ๋งŽ์€ ํŽ˜์ด์ง€์˜ ๊ฒฝ์šฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ๊ฐ„์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์ฒด ํฌํ•จ๋œ ๋ฌธ์„œ

Base64 ์ด๋ฏธ์ง€๋Š” HTML ํŒŒ์ผ์„ ์™„์ „ํžˆ ์ด์‹ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Base64 ์ด๋ฏธ์ง€๊ฐ€ ํฌํ•จ๋œ ์ด๋ฉ”์ผ ํ…œํ”Œ๋ฆฟ์€ ์ˆ˜์‹ ์ž์˜ ์ด๋ฉ”์ผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐจ๋‹จํ•ด๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์ž„๋ฒ ๋”ฉ๋œ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๋Š” HTML ๋ฌธ์„œ๋Š” ๊นจ์ง„ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๋ฅผ ๊ฑฑ์ •ํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ผ ํŒŒ์ผ๋กœ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ํŽ˜์ด์ง€

์ตœ์ƒ๋‹จ ํžˆ์–ด๋กœ ์ด๋ฏธ์ง€์™€ ์ค‘์š”ํ•œ UI ์š”์†Œ์˜ ๊ฒฝ์šฐ, ์ถ”๊ฐ€ ์™•๋ณต์„ ์ œ๊ฑฐํ•˜๋ฉด LCP(Largest Contentful Paint)์™€ ๊ฐ™์€ ์ง€ํ‘œ๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ์ž‘์€ ์ด๋ฏธ์ง€์—๋งŒ ์œ ์šฉํ•˜๋ฉฐ, ํฐ ์ด๋ฏธ์ง€์˜ ๊ฒฝ์šฐ ์ธ๋ผ์ธํ™”๊ฐ€ ์˜คํžˆ๋ ค ์—ญํšจ๊ณผ๋ฅผ ๋ƒ…๋‹ˆ๋‹ค.

์˜คํ”„๋ผ์ธ์—์„œ ์ž‘๋™

์ด๋ฏธ์ง€๊ฐ€ ๋ฐ์ดํ„ฐ URL๋กœ ์ž„๋ฒ ๋”ฉ๋˜๋ฉด ๋„คํŠธ์›Œํฌ ์ ‘๊ทผ ์—†์ด๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์˜คํ”„๋ผ์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ PWA(Progressive Web App)์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€๋ฅผ Base64๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ฐฉ๋ฒ• 1: ์˜จ๋ผ์ธ ๋„๊ตฌ ์‚ฌ์šฉํ•˜๊ธฐ (๊ฐ€์žฅ ์‰ฌ์›€)

์ด๋ฏธ์ง€๋ฅผ Base64๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์€ ์ „์šฉ ์˜จ๋ผ์ธ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌด๋ฃŒ ์˜จ๋ผ์ธ Base64 ์ธ์ฝ”๋”์— ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญํ•˜๋ฉด, ์ฝ”๋“œ์— ๋ถ™์—ฌ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์™„์ „ํ•œ ๋ฐ์ดํ„ฐ URL์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๋ฒ• 2: ๋ธŒ๋ผ์šฐ์ €์—์„œ JavaScript ์‚ฌ์šฉํ•˜๊ธฐ

FileReader API๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ์ด๋ฏธ์ง€๋ฅผ Base64๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

function imageToBase64(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = () => resolve(reader.result);
    reader.onerror = () => reject(new Error('Failed to read file'));
    reader.readAsDataURL(file);
  });
}

// Usage with a file input
document.getElementById('imageInput').addEventListener('change', async (event) => {
  const file = event.target.files[0];
  if (!file) return;

  const dataUrl = await imageToBase64(file);
  console.log(dataUrl);
  // Output: data:image/jpeg;base64,/9j/4AAQ...
});

๋ฐฉ๋ฒ• 3: Canvas API ์‚ฌ์šฉํ•˜๊ธฐ

Base64๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์ „์— ์ด๋ฏธ์ง€๋ฅผ ํฌ๊ธฐ ์กฐ์ •, ์ž๋ฅด๊ธฐ ๋˜๋Š” ์••์ถ•ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ Canvas API๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”:

function canvasToBase64(canvas, format = 'image/webp', quality = 0.8) {
  return canvas.toDataURL(format, quality);
}

// Example: Resize an image before converting
async function resizeImageToBase64(file, maxWidth = 800) {
  const bitmap = await createImageBitmap(file);
  const canvas = document.createElement('canvas');
  const ratio = Math.min(maxWidth / bitmap.width, 1);
  canvas.width = bitmap.width * ratio;
  canvas.height = bitmap.height * ratio;
  const ctx = canvas.getContext('2d');
  ctx.drawImage(bitmap, 0, 0, canvas.width, canvas.height);
  return canvas.toBase64('image/jpeg', 0.85);
}

๋ฐฉ๋ฒ• 4: Node.js ์‚ฌ์šฉํ•˜๊ธฐ

์„œ๋ฒ„ ์ธก์—์„œ๋Š” fs ๋ชจ๋“ˆ๊ณผ Buffer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ Base64๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค:

const fs = require('fs');
const path = require('path');

function encodeImageToBase64(filePath) {
  const buffer = fs.readFileSync(filePath);
  const base64 = buffer.toString('base64');

  // Detect MIME type from extension
  const ext = path.extname(filePath).toLowerCase();
  const mimeTypes = {
    '.png': 'image/png',
    '.jpg': 'image/jpeg',
    '.jpeg': 'image/jpeg',
    '.gif': 'image/gif',
    '.webp': 'image/webp',
    '.svg': 'image/svg+xml',
    '.ico': 'image/x-icon',
  };
  const mimeType = mimeTypes[ext] || 'image/png';

  return `data:${mimeType};base64,${base64}`;
}

const dataUrl = encodeImageToBase64('logo.png');
console.log(dataUrl);

๋ฐฉ๋ฒ• 5: ๋ช…๋ น์ค„ ์‚ฌ์šฉํ•˜๊ธฐ

Linux์™€ macOS์—์„œ๋Š” ๋‚ด์žฅ base64 ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

# Encode to Base64 and wrap as a data URL
echo "data:image/png;base64,$(base64 -w 0 image.png)"

HTML์—์„œ Base64 ์ด๋ฏธ์ง€ ์‚ฌ์šฉํ•˜๊ธฐ

<img> ํƒœ๊ทธ์— ์ง์ ‘ ์‚ฌ์šฉ:

<img
  src="data:image/webp;base64,UklGRpYCAABXRUJQVlA4WAoAAAA..."
  alt="Inline Logo"
  width="200"
  height="100"
/>

CSS์—์„œ Base64 ์ด๋ฏธ์ง€ ์‚ฌ์šฉํ•˜๊ธฐ

๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๋กœ ์‚ฌ์šฉ:

.icon-warning {
  background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIi8+PGxpbmUgeDE9IjEyIiB5MT0iMTYiIHgyPSIxMiIgeTI9IjEyIi8+PGxpbmUgeDE9IjEyIiB5MT0iOCIgeDI9IjEyLjAxIiB5Mj0iOCIvPjwvc3ZnPg==');
  width: 24px;
  height: 24px;
}

์„ฑ๋Šฅ ๊ณ ๋ ค ์‚ฌํ•ญ ๋ฐ ๋ชจ๋ฒ” ์‚ฌ๋ก€

Base64 ์ด๋ฏธ์ง€๊ฐ€ ๋„์›€์ด ๋˜๋Š” ๊ฒฝ์šฐ

  • 10KB ๋ฏธ๋งŒ์˜ ์ž‘์€ ์•„์ด์ฝ˜ ๋ฐ UI ์š”์†Œ
  • ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” ์ค‘์š”ํ•œ ์ตœ์ƒ๋‹จ ์ด๋ฏธ์ง€
  • ํŽ˜์ด์ง€ ์ „์ฒด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์Šคํ”„๋ผ์ดํŠธ ๋ฐ SVG ์•„์ด์ฝ˜
  • ์™ธ๋ถ€ ์ด๋ฏธ์ง€๊ฐ€ ์ž์ฃผ ์ฐจ๋‹จ๋˜๋Š” ์ด๋ฉ”์ผ ํ…œํ”Œ๋ฆฟ
  • ์˜คํ”„๋ผ์ธ ์šฐ์„  ์›น ์•ฑ ๋ฐ ์ž์ฒด ํฌํ•จ ๋ฌธ์„œ

Base64 ์ด๋ฏธ์ง€๊ฐ€ ํ•ด๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ

  • ๋Œ€์šฉ๋Ÿ‰ ์‚ฌ์ง„ ๋˜๋Š” ๊ณ ํ•ด์ƒ๋„ ์ด๋ฏธ์ง€ (100KB ์ด์ƒ) โ€” Base64 ์˜ค๋ฒ„ํ—ค๋“œ์™€ ๊ตฌ๋ฌธ ๋ถ„์„ ์ง€์—ฐ์ด ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ต๋‹ˆ๋‹ค
  • ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ์ด๋ฏธ์ง€ โ€” ๋Œ€์šฉ๋Ÿ‰ HTML ํŽ˜์ด๋กœ๋“œ์— ๋Œ€ํ•œ ๋ธŒ๋ผ์šฐ์ € ์บ์‹œ ๋ฌดํšจํ™”๋Š” ๋‚ญ๋น„์ž…๋‹ˆ๋‹ค
  • ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€์—์„œ ๊ณต์œ ๋˜๋Š” ์ด๋ฏธ์ง€ โ€” ์™ธ๋ถ€ ํŒŒ์ผ์€ ๊ณต์œ  ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์˜ ์ด์ ์„ ๋ˆ„๋ฆฝ๋‹ˆ๋‹ค
  • CDN ์ œ๊ณต ์ด๋ฏธ์ง€ โ€” CDN์ด ์ธ๋ผ์ธ ๋ฐ์ดํ„ฐ๋ณด๋‹ค ํŒŒ์ผ ์ „์†ก์„ ๋” ์ž˜ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค

10KB ๊ฒฝํ—˜ ๋ฒ•์น™

๋„๋ฆฌ ์ธ์šฉ๋˜๋Š” ์ง€์นจ: ์ด๋ฏธ์ง€๊ฐ€ 10KB ๋ฏธ๋งŒ์ด๋ฉด Base64๋กœ ์ธ๋ผ์ธํ™”ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์„ธ์š”. ๋” ํฌ๋ฉด ๋ณ„๋„ ํŒŒ์ผ๋กœ ์ œ๊ณตํ•˜์„ธ์š”. ์ด๋Š” HTTP ์š”์ฒญ์˜ ์˜ค๋ฒ„ํ—ค๋“œ์™€ HTML์˜ Base64 ์ธ์ฝ”๋”ฉ ๋ฐ์ดํ„ฐ ์˜ค๋ฒ„ํ—ค๋“œ ๊ฐ„์˜ ๊ท ํ˜•์„ ๋งž์ถฅ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ตœ์ ์˜ ์ž„๊ณ„๊ฐ’์€ ํŠน์ • ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค:

  • HTTP/2 ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ์€ ์—ฌ๋Ÿฌ ์š”์ฒญ์˜ ํŒจ๋„ํ‹ฐ๋ฅผ ์ค„์—ฌ ์™ธ๋ถ€ ํŒŒ์ผ์„ ๋” ๋งค๋ ฅ์ ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค
  • ๋А๋ฆฐ ์—ฐ๊ฒฐ์—์„œ๋Š” ๋” ํฐ ์ด๋ฏธ์ง€๋ผ๋„ ์š”์ฒญ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์น˜ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
  • ์ค‘์š” ๋ Œ๋”๋ง ๊ฒฝ๋กœ ๋ฆฌ์†Œ์Šค์˜ ๊ฒฝ์šฐ, ์™•๋ณต์„ ํ•œ ๋ฒˆ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ํฐ ์ด๋ฏธ์ง€๋„ ์ธ๋ผ์ธํ™”ํ•˜์„ธ์š”

์••์ถ• ๊ณ ๋ ค ์‚ฌํ•ญ

JPEG ๋˜๋Š” PNG ์ด๋ฏธ์ง€๋ฅผ Base64๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ, ๋Œ€์‹  WebP ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•˜์„ธ์š”. WebP๋Š” ๋™์ผํ•œ ํ’ˆ์งˆ ์ˆ˜์ค€์—์„œ ๋” ์šฐ์ˆ˜ํ•œ ์••์ถ•์„ ์ œ๊ณตํ•˜์—ฌ ๋” ์ž‘์€ Base64 ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์˜จ๋ผ์ธ ๋„๊ตฌ์—์„œ Base64๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์ „์— ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์‹œ ์ธ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€๋ฅผ Base64๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

์ฝ”๋“œ์— ์ด๋ฏธ์ง€๋ฅผ ์ง์ ‘ ์ž„๋ฒ ๋”ฉํ•  ์ค€๋น„๊ฐ€ ๋˜์…จ๋‚˜์š”? ๋ฌด๋ฃŒ ์˜จ๋ผ์ธ Base64 ์ธ์ฝ”๋” ๋ฐ ๋””์ฝ”๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  HTML, CSS, JavaScript์šฉ ์™„์ „ํ•œ ๋ฐ์ดํ„ฐ URL์„ ์–ป์œผ์„ธ์š” โ€” ์„ค์น˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€๋ฅผ Base64 ๋ฐ์ดํ„ฐ URL๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ• - CoolTool