웹에 날개를 달아주는 웹 성능 최적화 기법
- 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다.
Chapter 4. 이미지 최적화
디지털 이미지의 종류와 특성
- 이미지를 잘 사용하려면 우선 이미지의 종류와 특성을 잘 파악하고, 사용될 기기 타입과 용도에 맞춰 적절한 이미지를 선택해야 함
- PNG 파일
- 알파 채널이라는 이미지 변환 기법 사용
- 알파 채널은 핵심 이미지 레이어를 제외한 배경 이미지 레이어를 제거하여 전체 이미지를 투명하게 만들어 사용한다는 장점 존재
- 같은 품질의 JPEG 대비 파일 사이즈가 커진다는 단점 존재
- 투명 기능이 필요하지 않다면 JPEG 타입으로 변환하여 사용하는 것이 사이트 성능을 위해 더 나은 선택
래스터 이미지 vs 벡터 이미지
- 래스터 이미지
- 우리가 사용하는 대부분의 이미지 유형
- 작은 픽셀에 표현하고자 하는 색상 정보를 입력해 컴퓨터로 표현하는 방식
- 사이즈가 크거나 품질이 좋은 이미지를 만들기 위해서는 그만큼의 정보를 담은 픽셀들을 추가해야만 컴퓨터가 정상적으로 표현 가능
- 확장성은 떨어짐
- 백터 이미지
- 그리고자 하는 대상의 수학적인 정보 제공
- 그림이 위치할 좌표, 원 또는 사각형 등의 형상, 크기, 색상 등의 정보를 제공하여 컴퓨터가 그림을 그리듯 화면에 표현
- SVG 파일이 W3C 표준 포맷으로 가장 많이 사용
- 메타 정보를 가지고 있어 화면 스케일에 상관 없이 항상 선명한 이미지 표현 가능
- 그림이 복잡해지면 표현하기 위한 정보가 기하급수적으로 늘어나 수학적으로 표현하는 데 많은 제약
무손실 이미지 vs 손실 이미지
- 무손실 이미지: 원본 이미지의 정보 손실을 허용하지 않는 이미지
- GIF
- 가장 처음으로 등장한 이동식 이미지 형식
- 몇 개의 이미지를 묶어 짧은 움직임을 표현하는 애니메이션 기능
- 초창기 형식이기 때문에 사용할 수 있는 색이 256 컬러 (8 bit)로 매우 제한적
- PNG
- 256 컬러만 사용할 수 있는 GIF의 단점과 특허 문제를 해결하기 위해 개발된 형식
- 24 bit 색상을 사용
- 알파 채널로 이미지 백그라운드 투명도를 조절해 하나의 이미지에 여러 배경을 바꾸어 이미지를 다양하게 조합 가능
- GIF
- 손실 이미지: 필요에 따라 이동할 수 있는 형태를 만들기 위해 정보 손실을 어느 정도 허용하는 이미지
- JPEG
- 사람의 눈으로 인식할 수 있는 색상만 남기고 나머지를 제거하는 기술로 이미지를 표현하는 데 필요한 정보를 줄임
- 사용자가 품질 값 결정 가능
- JPEG 2000
- JPEG 압축 방식과 달리 새로운 방식을 사용하여 이미지 압축률을 높임
- 무손실 압축 및 투명 기능, 애니메이션 기능 지원
- 사파리 계열 브라우저와 사파리 라이브러리를 사용해 만들어진 iOS용 크롬에서도 지원
- JPEG XR
- JPEG에 비해 R/G/B에 해당하는 색상 채널당 더 많은 수의 채색을 허용해 표현할 수 있는 색상 범위 확장
- JPEG 2000이나 WebP와 마찬가지로 무손실 압축 및 투명 기능을 지원하고 점진적 데이터 전송 기능도 지원
- 점진적 데이터 전송 기능 지원
- 현재 마이크로소프트사의 인터넷 익스플로러와 엣지에서만 지원
- WebP
- 구글에서 개발하고 배포한 이미지 형식
- JPEG 보다 개선된 공격적인 압축 방식으로 파일 크기를 25~35% 작게 만들 수 있음
- 무손실 압축 및 투명 기능, 애니메이션 기능 지원
- 이미지 품질을 많이 낮추면 화질에 약간의 손실이 발생하며 JPEG의 점진적 데이터 전송 기능은 갖추지 못함
- JPEG
- | GIF | PNG | JPEG | JPEG 2000 | JPEG XR | WebP |
---|---|---|---|---|---|---|
압축률 | 보통 | 보통 | 높음 | 매우 높음 | 매우 높음 | 매우 높음 |
압축 방식 | 무손실 | 무손실 | 손실 | 손실/무손실 | 손실/무손실 | 손실/무손실 |
애니메이션 | 지원 | 미지원 | 미지원 | 지원 | 지원 | 지원 |
투명 | 미지원 | 지원 | 미지원 | 지원 | 지원 | 지원 |
점진적 전송 | 지원 | 지원 | 지원 | 지원 | 지원 | 미지원 |
지원 브라우저 | 모든 브라우저 | 모든 브라우저 | 모든 브라우저 | 사파리 | 크롬 오페라 안드로이드 파이어폭스(v65+) 사파리(v14+) |
인터넷 익스플로러 엣지 |
이미지 변환 기법
무손실 압축
- 무손실 압축을 하려면 각 이미지 유형을 다르게 처리해야 하나, 대체로 스크립트를 통해 압축을 자동화할 수 있다는 장점 존재
- 무료로 배포되는 라이브러리의 명령어들을 이용해 자동화하는 방법을 알아둬야 함
- GIF
- 앞서 언급했던 내용처럼 256 색상만으로 만들어지므로 애니메이션이 포함되지 않다면 압축률이 더 높은 PNG8이나 브라우저에 특화된 이미지 형식으로 변경하는 것 추천
- PNG
- 구분자인 첫 8바이트의 서명을 제외하고 청크 형태로 이미지 정보 저장
- 이미지 정보를 저장하는 것은 핵심 청크
- JPEG
- 다음과 같은 메타 데이터들이 포함됨
- 주석 및 공백
- 어도비 포토샵 같은 편집 애플리케이션 정보
- 카메라 제조사 및 모델, 촬영 날짜, 사진 위치 정보, 축소판 또는 오디오와 같은 EXIF 정보
- 메타 데이터를 삭제하면 이미지 품질 손실 없이 파일 크기 축소 가능
- 다음과 같은 메타 데이터들이 포함됨
손실 압축
- 특정 이미지 정보 누락, 손실시켜 파일 크기를 줄이는 방법
- 손실 압축은 원하는 만큼의 화질을 얻지 못하는 위험이 있으므로 고화질 사진을 저장해 감상하고자 하면 손실 압축은 피해야 함
- 하지만 웹 상에 게시하고자 한다면 성능과 화질 사이에 득실을 따져야 함
- 주로 80~85% 정도 품질의 이미지 손실 압축 권장
- 손실 압축 하려면 기존 이미지 형식을 디코딩한 후 알고리즘에 따라 원하는 화질로 저하시켜 다시 원래 이미지 형식으로 인코딩해야 함
시각적 인지 능력을 고려한 자동 최적화 도구
- Akamai 같은 CDN 서비스 제공 업체에선 이미지 트래픽 관련 자동 최적화 기능 제공
- 개별 사용자의 화면 크기, DPI 등의 정보를 고려하여 적절한 SSIM 값에 따라 손실 압축 수행하고 사용 브라우저에 적합한 이미지 형태로 변환
- Cloudinary에서는 클라우드상에서 이미지나 비디오를 관리하는 솔루션 제공
- JPEGmini 라는 오프라인 최적화 도구 존재
브라우저 특화 이미지로 변환
- WebP
- libwebp 라는 구글에서 제공하는 C 라이브러리
- Linux, Windows, macOS 에서 WebP를 인코딩, 디코딩하는 기능 제공
- JPEG 2000
- OpenJPEG 프로젝트에서 JPEG 2000 이미지를 인코딩, 디코딩하기 위한 C 라이브러리 및 관련 도구 제공
- JPEG XR
- 마이크로소프트에서 jxrlib 라는 라이브러리와 도구 제공
반응형 웹에서의 이미지 배치 전략
반응형 웹의 문제점
- 모바일 환경은 데스크탑 환경에 비해 열악하여 페이지 로딩 시간이 느려짐
- 모바일 기기의 GPU, 메모리 등의 사양이 좋지 않아 모바일 환경에서 페이지 로딩 시간은 더 길어짐
원인은 이미지
- 웹 환경에 따라 변하지 않는 이미지의 크기가 원인
- 화면이 작아졌는데도 필요 이상의 웹 리소스를 과하게 내려받는 현상을 세 가지 유형으로 구분할 수 있음
- 내려받아 줄이기 (download and shrink)
- 반응형 웹에서는 화면 크기가 변할 때마다 나타나는 이미지 가로세로 크기가 달라짐
- 고정값 대신 전체 화면 대비 이미지 영역의 비율 값 사용
- 그러나 화면의 이미지 크기가 작아진다고 해서 실제 이미지가 작아지지 않기 때문에 문제 발생
- 브라우저에서 큰 이미지를 다운로드해 축소 처리를 하면서 실시간으로 계산하는 추가 과정이 필요
- 내려받아 숨기기 (download and hide)
- 데스크탑 환경에는 모바일 환경에서 불필요한 리소스들이 존재함
- 모바일 환경에서 CSS로 인해 숨겨진 이미지들도 모두 다운로드해 필요 이상으로 네트워크 자원을 소모하며 로딩 시간 지연
- 화면 바깥 부분 (below the fold)
- 화면 바깥 부분의 이미지들은 화면에 보이지 않지만 내려받아 숨기기처럼 모두 다운로드 됨
- 화면 안쪽 부분이 비즈니스 목표 달성에 있어 가장 중요한 역할을 하지만 바깥쪽 이미지들을 다운로드하기 위해 안쪽 부분의 로딩 시간에도 영향
반응형 이미지
- 사용자의 환경에 따라 환경에 적합한 이미지를 전송하면 해결
반응형 이미지 구현 방법
- 프론트엔드 측면에서의 구현
- 미디어 쿼리를 사용해 클라이언트 환경을 파악한 후 그 환경에 맞는 이미지 파일을 호출하도록 웹 페이지 구현
<img>
태그의srcset
속성이나<picture>
태그를 사용해서 표준 방식으로 비교적 쉽게 구현 가능- 과도하게 사용할 경우 프론트엔드 코드가 무거워져 성능에 영향을 줄 수 있음
<!--
1x, 2x는 이미지의 화소 밀도
고해상도 화면 기기에서는
-->
<img src="small.jpg"
srcset="pic-normal.jpg 1x,
pic-retin.jpg 2x">
<!--
size 속성으로 브레이크 포인트에 따른 이미지 크기 지정
srcset에 width 정보 정의
-->
<img src="small.jpg"
srcset="pic-200.jpg 200w,
pic-400.jpg 400w"
size="(max-width: 400px) 100vw, (max-width: 800px) 30vw, 300px">
<!--
내부적으로 source 태그를 사용해 다양한 이미지 URL 설정
조건에 맞는 이미지만 사용하도록 브라우저를 강제할 수 있음
모든 브라우저가 picture 태그를 지원하지 않는다는 단점
-->
<picture>
<source media="(min-width: 45em" srcset="large.jpg, large-hd.jpg 2x">
<source media="(min-width: 18em" srcset="med.jpg, md-hd.jpg 2x">
<source srcset="small.jpg, small-hd.jpg 2x">
<img src="small-1.jpg">
</picture>
- 백엔드 측면에서의 구현
- 서버에서 클라이언트의 환경에 맞는 이미지를 선택하여 전송하는 방법
- 클라이언트 환경을 정확히 어떻게 판단할 것인가 고민거리가 남아있음
- 서버 측 프로그램이 추가되어야 하는 번거로움
- 정확한 클라이언트 환경을 전달하기 위해 Client Hints 를 이용하는 방안 존재
- Client Hints 동작
- 브라우저에서 최초 서버로 HTTP 요청
- 서버는 응답 헤더에 Accept-CH를 추가해 Client Hints를 지원하고 있음을 브라우저에 알림, 동시에 필요한 정보를 보내줄 것을 요청
Accept-CH: DPR, Width, Viewport-Width
- 위의 예제는 다음 요청으로부터 DPR, Width, Viewport-Width 정보를 함께 보내줄 것을 브라우저에 요청
- 브라우저에서는 다음 하위 리소스에 대한 요청부터 아래와 같은 정보를 헤더에 추가해 보냄
-
DRP: 2.0 Width: 320 Viewport-Width: 320
-
- 서버는 최적화된 이미지를 전송한 후 사용한 DPR 정보를 마지막 응답 메시지로 보냄
Content-DPR: 1.0
- 해당 DPR 정보는 브라우저가 서버로부터 받은 이미지를 처리할 때 사용
적응형 이미지 전략
적응형 이미지 아키텍처
- 다음 두 부분에서 기존 웹 아키텍처와 다름
- 요청 클라이언트 정보 감지
- 클라이언트 맞춤형 데이터를 로딩하는 서버 로직 추가
- 적응형 이미지 아키텍처에서 가장 근본적이고 중요한 부분은 “클라이언트 정보를 어떻게 감지하느냐.”
- Client Hints를 지원하는 브라우저가 적어 실제로는 HTTP 요청의 User-Agent 헤더를 통해 클라이언트 정보를 알 수 있음
- User-Agent에는 브라우저 정보와 버전, 플랫폼, 시스템, 기타 사용자 정보 등이 담김
-
# User-Agent 형식 일반적인 형식 User-Agent: <product> / <product-version> <comment> 브라우저 형식 User-Agent: Mozilla/<version> (<system-information>) <platform> (<platform-details>) <extensions> 예시 Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like macOS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B40S
- User-Agent 값을 기반으로 필요한 정보들을 수집해 사용자 정의 헤더나 쿠키에 넣어 서버로 전달 가능
- 기기 검출 솔루션은 대표적으로 DeviceAtlas, ScientiaMobile/Wurf, 51degree 등이 존재
웹에 날개를 달아주는 웹 성능 최적화 기법, 강상진, 윤호성 저, 루비페이퍼 출판