Base64 인코딩과 성능

dev | 2017-02-20

언제부턴가 아이콘이나 자잘한 이미지들은 base64로 인코딩해서 CSS에 data-uri로 넣는 방법을 즐겨쓰고 있었다. 성능 측면에서 좋은 방법이 아니라는 것은 알지만 장단점을 저울질 해 볼때 내가 만드는 결과물에서는 장점이 더 크다고 생각했기 때문에 약간은 조심하면서 사용하고 있었다.

오늘 base64의 문제점에 대해서 자세히 다룬 글을 봤다. 단점을 좀 극단적으로 부각하기는 했지만 알아두면 좋은 내용들이 잘 정리되어 있다. 두번째 글에서는 데이터를 실측해서 어느정도의 차이가 있는지 더 다양한 관점으로 설명하고 있다.

  • 기본적으로 CSS가 수백KB가 되는 것은 문제가 있다.
  • Base64로 인코딩된 이미지를 포함한 CSS는 gzip압축률도 더 떨어진다(75% vs 90%).
  • 이미지는 랜더링을 막지 않지만 CSS는 랜더링을 막는다. 이미지를 CSS에 넣는 것은 전반적인 랜더링 속도를 늦춘다.
  • 브라우저는 점점 똑똑해지고 필요하지 않은 자원을 알아서 걸러내지만 CSS에 합쳐진 이미지는 무조건 다 다운받게 된다.
  • 폰트 빨리 뜨게 하려고도 많이 하는데 결국 전체적인 랜더링이 느러진다.
  • 폰트나 이미지는 잘 변경되지 않는데 CSS에 포함됨으로써 캐시 가능성도 떨어뜨린다.
  • DOMContentLoaded 이벤트는 크게 차이 없지만 그 이후 발생하는 이벤트들은 전반적으로 CSS에 이미지가 포함될 경우 현저히 떨어진다.
  • 이미지를 분리해서 프리로드 시킬경우 훨씬 빨리 디코딩 된다.

내가 언제부터 base64 이미지를 사용하기 시작했는지 곰곰히 생각해봤다. 이미지를 수동으로 FTP를 이용해서 배포해야했던 적이 있었는데 그때 하도 짜증이 나서 그때부터 CSS에 이미지를 포함시키기 시작했었다. 그 이후로도 회사이름에 걸맞지 않게 그 행태는 계속 지속됐고 이미지를 자동으로 압축해서 base64로 인코딩하는 스크립트도 만들고 이게 더 편해져서 계속 써왔던 것 같다.

Base64로 인코딩하면 기본적으로 용량이 늘어나기 때문에 큰이미지에는 적용하면 오히려 손해다. HTTP 요청 헤더 크기를 크게 넘어가지 않게 대략 1000 바이트 미만의 이미지들에만 적용해왔다. 크기가 아주 작은 반투명 배경 이미지 같은 경우는 이미지 파일보다 base64 인코딩해서 CSS에 포함시키는게 더 좋다고 생각한다.

스프라이트 이미지 관리 측면에서도 덩치큰 한장짜리 복잡한 스프라이트 이미지보다 base64로 인코딩 하는 것이 삭제나 수정이 수월하다. 보통 오래된 스프라이트 이미지는 각 이미지의 사용처가 불분명해서 삭제는 거의 못하고 추가만 하는 경우를 흔치 않게 볼 수 있다. CSS에 넣게되면 셀렉터 정보가 있기 때문에 사용처를 보다 명확하게 알 수 있다.

하지만 스프라이트 이미지 보다 base64로 인코딩하는 것이 일반적으로 좋다는 말은 아니다. 대부분의 경우에는 스프라이트 이미지가 성능 측면에서 확실한 강점을 가지고 있기 때문에 base64를 선택해야 하는 경우는 소규모 사이트나 스프라이트 할 수 없는 작은 배경 이미지 같이 특수한 경우에 해당한다. 스프라이트 이미지 관리가 문제가 된다면 다양한 스프라이트 이미지 관리 툴을 도입하는 것이 우선일 것이다(정봉겸님 지적 감사합니다).

어느 기술이든 과유불급이다. 저 글에서는 base64는 절대 쓰면 안되는 것 처럼 표현되어 있는데 너무 과하게 쓰면 그렇겠지만 장단점을 잘 파악하고 적재적소에 잘 사용한다면 base64 인코딩도 그렇게 나쁜 것만은 아니다.

Comments

  • yser 2017-07-15

    흥미로운 주제네요. 언젠가부터 data-uri로 이미지를 인코딩해서 넣는 방식이 유행하던데 직접 써보니 괜찮은 듯하면서도 정말 이대로 써도 될까 걱정이 되긴 하더군요. 지원하지 않는 브라우저 문제도 있고 또 그걸 위한 fallback 처리를 해주려니 왠지 배꼽이 더 큰 것 같기도 하고요. 그 이전에 나온 트릭인 자잘한 아이콘 이미지들을 png 하나에 합쳐서 배치하고 css에서 좌표 지정으로 표시하는 방식은 꽤 유용하더군요. 이미지 하나만 다운로드되면 마우스 오버 이벤트에 쓰기도 편하고 관리하기에도 괜찮아 보였네요. 표시되지 않는 구역에 이미지에 대한 설명을 넣어둘 수도 있고요. Daum이 일부 서비스에서 이런 방식을 쓰더군요.

Post a comment

:

: 공개 되지 않습니다. Gravatar를 표시 합니다.

:

: HTML 태그를 사용할 수 없습니다.