/ 우리는 이렇게 합니다 / 이미지 최신 — AVIF·fetchpriority·반응형
개발·인터랙션 · 이미지를 맡은 사람

같은 사진을, 절반 무게로.

사진을 바꾸지 않고도 페이지를 두 배 빠르게 만들 수 있습니다. 비결은 화려한 게 아니라 포맷·크기·로딩 순서 세 가지를 정확히 맞추는 일입니다. 2025~2026 기준으로 무엇이 바뀌었는지, 그리고 제가 매번 챙기는 것을 적었습니다. 아래는 읽는 글이 아니라 눌러보는 글입니다.

한 줄 직답

2026년의 이미지 최적화는 ① AVIF·webp 같은 최신 포맷으로 용량을 줄이고, ② srcset/sizes로 화면에 맞는 크기만 내려보내고, ③ 히어로엔 fetchpriority=high, 나머지엔 loading=lazy로 로딩 순서를 잡는 것입니다. 여기에 width·height를 명시해 CLS를 막으면 같은 사진이 절반 무게로, 더 빠르게 도착합니다.

요약

  • AVIF는 2026 초 기준 약 94% 지원(Chrome 85+·FF 93+·Safari 16.4+). picture로 AVIF→webp→jpg 폴백을 둔다.
  • srcset(w)에는 sizes를 항상 짝지어, 화면 너비에 맞는 이미지만 내려보낸다.
  • 히어로(LCP 이미지) 하나에만 fetchpriority=high, 화면 밖은 loading=lazy.
  • 모든 img에 width·height를 명시해 CLS(레이아웃 덜컹임)를 0에 가깝게.

한 클라이언트 사이트가 “사진이 무거워서 느리다”고 했습니다. 사진을 줄이자는 말이 나왔죠. 그런데 사진은 그 페이지의 얼굴이었습니다. 줄이면 안 됐습니다. 제가 한 건 화질을 거의 그대로 둔 채 포맷을 AVIF로 바꾸고, 화면 크기별로 잘라 내보내고, 로딩 순서만 손본 것이었습니다. 같은 사진이 보기엔 똑같은데 무게는 절반 아래로 떨어졌습니다. 이미지 최적화는 ‘사진을 포기하는 일’이 아니라 ‘같은 사진을 더 똑똑하게 전달하는 일’입니다.

먼저, 직접 느껴보세요

좋은 이미지 로딩은 ‘텅 빈 화면에서 갑자기 쿵’이 아니라 ‘흐릿하게 먼저, 또렷하게 나중에’입니다. 아래에서 ‘다시 불러오기’를 눌러보세요. 저용량 미리보기가 먼저 깔리고 원본이 채워지는 흐름입니다.

Live · 블러업 로딩

흐릿하게 먼저, 또렷하게 나중에

'다시 불러오기'로 저용량 미리보기→원본. avif·webp·반응형으로 더 가볍게.

팁: avif·webp + 적정 사이즈로 보통 절반 이하 용량

왜 AVIF를, 그것도 picture로 쓰나요?

AVIF는 같은 화질에서 jpg·png보다, 보통은 webp보다도 더 작습니다. 라이브로 확인한 지원 현황은 이렇습니다. Chrome 85+, Firefox 93+, Safari 16.4+가 동작하고, caniuse 기준 전 세계 약 94% 브라우저가 AVIF를 읽습니다(2026 초 기준, ‘Baseline 2024’). 남는 몇 %는 iOS 15 이하나 일부 인앱·사내 락다운 브라우저입니다. 그래서 단독으로 쓰지 않고 picture로 폴백 사다리를 만듭니다. 브라우저가 읽을 수 있는 첫 줄을 자동으로 고릅니다.

<picture>
  <source type="image/avif" srcset="hero.avif">
  <source type="image/webp" srcset="hero.webp">
  <img src="hero.jpg" alt="..." width="1200" height="800">
</picture>

이러면 최신 브라우저는 가장 가벼운 AVIF를, 구형은 webp나 jpg를 받습니다. ‘가장 가벼움’과 ‘가장 넓은 호환성’을 동시에 챙기는 방법입니다.

한 장을 모두에게 보내지 마세요 — srcset·sizes

1920px 사진을 360px 휴대폰에 그대로 보내는 건 낭비입니다. 같은 사진을 여러 크기로 준비해두고, 화면에 맞는 것만 내려보냅니다. 이때 너비(w) 서술자를 쓰면 sizes가 사실상 필수입니다. 화면에서 이미지가 차지할 너비를 알려줘야 브라우저가 옳게 고릅니다. 실무에서 자주 쓰는 후보 너비는 640·768·1024·1280·1920px 정도, 최대 2560px이면 레티나까지 충분합니다.

<img
  src="photo-1024.jpg"
  srcset="photo-640.jpg 640w, photo-1024.jpg 1024w, photo-1920.jpg 1920w"
  sizes="(max-width: 768px) 100vw, 768px"
  width="1920" height="1280" alt="...">

한 가지 주의. srcset에 적은 너비(예: 1024w)는 실제 파일의 가로 픽셀과 일치해야 합니다. 어긋나면 브라우저가 잘못된 후보를 고릅니다. 그리고 구형 대비 기본 src는 항상 넣습니다.

히어로엔 fetchpriority=high, 나머진 lazy

브라우저는 처음엔 화면 안 이미지조차 ‘낮은 우선순위’로 봅니다. 레이아웃이 끝나야 ‘아, 이게 화면에 있네’ 하고 뒤늦게 우선순위를 올립니다. 그 사이 히어로 이미지(LCP가 될 그 한 장)가 늦게 뜹니다. 그래서 마크업에서 미리 fetchpriority="high"로 ‘이건 최우선’이라고 알려줍니다.

<!-- 첫 화면 히어로: 단 한 장에만 -->
<img src="hero-1024.avif" fetchpriority="high"
     width="1200" height="800" alt="...">

<!-- 화면 밖 이미지: 나중에 -->
<img src="card.avif" loading="lazy"
     width="600" height="400" alt="...">

라이브로 확인한 지원은 Chrome 102+, Safari 17.2+, Firefox 132+입니다. 미지원 브라우저는 속성을 그냥 무시하므로 위험이 전혀 없는 ‘점진적 향상’입니다. 핵심 규칙 둘. ① high는 첫 화면 한 장에만(전부 high면 우선순위가 사라집니다). ② 히어로엔 lazy를 쓰지 않습니다(첫 화면을 일부러 늦추는 셈이 됩니다). 화면 밖 카드·갤러리 이미지에만 lazy를 붙입니다.

가장 흔한 함정 — 덜컹거리는 레이아웃(CLS)

이미지가 뜨는 순간 아래 글이 밀려 내려간 경험, 있죠. img에 width·height(또는 CSS aspect-ratio)를 안 줘서 브라우저가 자리를 못 비워둔 탓입니다. 크기를 명시하면 이미지가 오기 전에 자리를 잡아둬 CLS가 0에 가깝게 떨어집니다. 위 블러업 데모에서 미리보기와 원본이 ‘같은 자리’를 차지하는 것도 같은 이유입니다.

항목원본 jpg 그대로AVIF·반응형·priority
용량크게 한 장을 모두에게포맷·크기 최적화로 보통 절반 이하
LCP(첫 화면 속도)히어로가 뒤늦게 로드fetchpriority=high로 더 일찍
데이터(모바일)360px에 1920px 전송srcset/sizes로 맞는 크기만
CLS(덜컹임)크기 미지정 → 밀림width·height로 0에 가깝게

제가 히어로 이미지 하나에 실제로 붙이는 마크업은 이렇게 한 덩어리입니다. 포맷 폴백·반응형 후보·우선 로딩·자리 확보를 한 번에 챙깁니다.

HTML · 2026 히어로 이미지 한 덩어리
<picture>
  <source type="image/avif"
          srcset="hero-640.avif 640w, hero-1280.avif 1280w, hero-1920.avif 1920w"
          sizes="(max-width: 768px) 100vw, 1200px">
  <source type="image/webp"
          srcset="hero-640.webp 640w, hero-1280.webp 1280w"
          sizes="(max-width: 768px) 100vw, 1200px">
  <img src="hero-1280.jpg" alt="단지 전경"
       width="1200" height="800"
       fetchpriority="high" decoding="async">
</picture>

이 한 덩어리면 최신 브라우저는 가장 가벼운 AVIF를, 구형은 webp나 jpg를 받고, 첫 화면은 빨리 뜨면서 레이아웃은 흔들리지 않습니다.

이미지 하나를 이렇게 보는 사람이, 사이트 전체를 만듭니다

이미지는 대부분의 페이지에서 가장 무거운 자원입니다. 그 한 장의 포맷·크기·순서를 진지하게 다루는 사람이라면 폼도, 카피도, 속도도 같은 태도로 다룹니다. Findable에서는 이런 디테일이 기본값입니다. 당신의 사이트, 사진을 포기하지 않고 더 빠르게 만들어 드릴까요?

AVIF, 지금 실무에 써도 되나요?
네. AVIF는 Chrome 85+, Firefox 93+, Safari 16.4+에서 동작하고 caniuse 기준 전 세계 약 94% 브라우저가 지원합니다(2026 초 기준). 다만 iOS 15 이하·일부 인앱 브라우저 같은 long tail이 남아 있으므로 picture 요소로 webp·jpg 폴백을 함께 둬서 어떤 환경에서도 깨지지 않게 합니다.
AVIF와 webp 중 무엇을 써야 하나요?
보통 AVIF가 같은 화질에서 더 작지만, 인코딩이 느리고 일부 구형 환경이 못 읽습니다. 그래서 우리는 picture 안에 AVIF를 1순위, webp를 2순위, jpg/png를 최종 폴백으로 둡니다. 브라우저가 읽을 수 있는 첫 포맷을 자동으로 고르므로 가장 가벼운 이미지가 가장 넓은 호환성과 함께 전달됩니다.
fetchpriority=high는 모든 이미지에 붙이면 좋나요?
아닙니다. 화면 첫 화면에서 가장 큰 이미지(LCP가 될 히어로) 단 하나에만 붙입니다. 전부 high로 주면 우선순위가 사라져 효과가 없어집니다. 나머지 화면 밖 이미지는 loading=lazy로 미루는 게 정석입니다. 지원은 Chrome 102+, Safari 17.2+, Firefox 132+이고 미지원 브라우저는 속성을 그냥 무시하므로 위험이 없습니다.
srcset과 sizes는 꼭 같이 써야 하나요?
w(너비) 서술자를 쓰는 srcset이라면 sizes가 사실상 필수입니다. sizes가 화면에서 이미지가 차지할 너비를 알려줘야 브라우저가 올바른 후보를 고를 수 있습니다. 또 srcset에 적은 너비(예: 800w)는 실제 파일 너비와 일치해야 합니다. 어긋나면 브라우저가 잘못 고릅니다. 구형 대비 기본 src도 항상 넣습니다.
이미지 때문에 레이아웃이 덜컹거립니다(CLS). 왜 그런가요?
img에 width·height(또는 aspect-ratio)를 지정하지 않으면 브라우저가 이미지가 도착할 때까지 차지할 자리를 모릅니다. 그래서 이미지가 뜨는 순간 아래 내용이 밀립니다. width·height를 명시하면 브라우저가 미리 자리를 비워둬서 CLS가 0에 가깝게 잡힙니다. 블러업 미리보기도 같은 자리를 차지하게 해서 흔들림을 막습니다.

같은 사진을, 더 가볍고 빠르게

이미지 한 장까지 이렇게 다루는 팀이 당신의 홈페이지를 만들면 어떨까요. 무료 진단으로 시작하세요.

무료 진단 받기

브라우저 지원 수치(AVIF 약 94%, fetchpriority Chrome 102+·Safari 17.2+·Firefox 132+ 등)는 작성일(2026.06.24) 기준 라이브 리서치로 확인한 값이며, 시간이 지나면 변동될 수 있습니다(출처: caniuse, web.dev, MDN). ‘용량 절반 이하’ 등 수치는 일반 원칙이며 콘텐츠·설정에 따라 달라지고 특정 성과를 보장하지 않습니다. 날조된 사례·수치는 사용하지 않았습니다.