디자인(UI) · 타입을 맡은 사람

한 파일에, 모든 굵기를 담습니다.

예전엔 Light·Regular·Bold를 쓰려면 폰트 파일을 세 개 받아야 했습니다. 가변 폰트는 그걸 한 파일로 끝냅니다. 그것도 100과 900 사이를 1단위로 자유롭게요. 이 글은 읽기보다 만져보는 글입니다. 아래 슬라이더를 움직여 보세요 — 폰트 파일은 그대로인데 글자만 바뀝니다.

한 줄 직답

가변 폰트는 여러 굵기·축을 한 파일에 담아 네트워크 요청과 총 용량을 줄이는 OpenType 폰트입니다. 굵기를 4종 이상 쓴다면 가변 폰트 1개가 유리하고, font-variation-settings로 축을 제어하며, size-adjust로 폴백 글자의 흔들림(CLS)을 줄입니다. 한글은 파일이 크니 서브셋·WOFF2가 함께 가야 합니다.

요약

  • 가변 폰트 = 한 파일에 여러 굵기·축(axis). 100~900을 연속 범위로 — 브라우저 지원 97%+(2025).
  • 굵기 4종 이상이면 파일 4개 대신 가변 1개 → 요청·용량 절감. 단, 가변 1파일은 단일 굵기보다 무겁다.
  • font-variation-settings로 축 제어. 굵기는 가능하면 표준 font-weight 우선.
  • size-adjust·ascent-override로 폴백을 웹폰트에 맞춰 글자 흔들림(CLS)을 줄인다.
  • 한글 가변 폰트는 파일이 커서 서브셋 + WOFF2가 핵심. 제목만 가변, 본문은 시스템 폰트 절충도 유효.

제가 타입을 처음 맡았을 때, 디자이너가 “여기는 660 굵기로”라고 했습니다. 660? 폰트에는 Regular(400)랑 Semibold(600)밖에 없는데요. 그래서 600으로 욱여넣었고, 그게 어쩐지 어색했습니다. 가변 폰트를 만나고 나서야 알았습니다. 굵기는 계단이 아니라 다이얼이라는 걸요. 400과 700 사이의 모든 숫자가, 진짜로 존재합니다.

그래서, 직접 만져보세요

말보다 빠릅니다. 아래 슬라이더를 움직여 보세요. 폰트 파일은 단 하나인데, 굵기도 크기도 자간도 즉시 바뀝니다. 이게 가변 폰트입니다.

Live · 타입 플레이그라운드

굵기·크기를 자유롭게

가변 폰트는 한 파일로 모든 굵기를 — 슬라이더로 만져보세요.

검색과 AI 답변에 찾아지는 홈페이지.

슬라이더를 움직이기 전에, 한 파일에서 굵기 축(wght)만 바꾸면 같은 문구가 어디까지 변하는지 단계별로 펼쳐 둡니다. 전부 폰트 하나에서 나오는 값입니다.

Variable · wght 축 한 파일
wght 300찾아지는 홈페이지
wght 400찾아지는 홈페이지
wght 540찾아지는 홈페이지
wght 700찾아지는 홈페이지
wght 800찾아지는 홈페이지

400과 700 사이의 540 같은 ‘중간 굵기’가 진짜로 존재한다는 것 — 앞에서 말한 ‘굵기는 계단이 아니라 다이얼’이 이 다섯 줄입니다.

가변 폰트가 정확히 뭐길래?

가변 폰트(variable font)는 OpenType 포맷의 확장입니다. 보통 폰트 하나에 굵기 하나가 들어 있다면, 가변 폰트는 한 파일 안에 ‘축(axis)’이라는 다이얼을 여러 개 넣어 둡니다. 가장 흔한 게 굵기(wght)이고, 너비(wdth), 기울기(slnt), 광학 크기(opsz) 같은 축도 있습니다. 한 축을 100에서 900까지 연속으로 움직일 수 있으니, 폰트 하나로 사실상 무한한 변형을 씁니다.

그럼 페이지가 정말 빨라지나요?

여기가 사람들이 가장 궁금해하는 지점입니다. 정답은 “쓰는 굵기 수에 달렸다”입니다. Light·Regular·Medium·Bold·Black을 다 쓴다면, 예전 방식은 파일을 다섯 개 받아야 합니다. 가변 폰트는 단 한 개를 받아 그 안에서 다섯 굵기를 모두 꺼냅니다. 네트워크 요청과 총 전송량이 줄죠. 다만 솔직히 적자면, 가변 파일 하나의 용량은 단일 굵기 파일보다 큽니다. 그래서 굵기를 한두 개만 쓰는 사이트라면 단일 폰트가 더 가벼울 수 있습니다. 손익 분기점은 보통 ‘굵기 4종 이상’입니다.

코드로는 어떻게 굵기를 부르나요?

표준 굵기는 그냥 font-weight: 540처럼 줘도 됩니다. 가변 폰트의 매력은 정수를 자유롭게 쓸 수 있다는 거죠. 그 외의 축은 font-variation-settings로 제어합니다.

코드 · font-variation-settings

축은 네 글자 이름으로

등록 축(wght·wdth)은 소문자, 폰트 제작자의 커스텀 축은 대문자입니다.

.title {
  font-weight: 540;                /* 표준 속성 우선 */
  font-variation-settings:
    "wght" 540,                    /* 굵기 */
    "wdth" 92,                     /* 너비(살짝 좁게) */
    "opsz" 28;                     /* 광학 크기(제목용) */
}

// 주의: font-variation-settings에 명시하지 않은 축은 기본값으로 되돌아갑니다(상속 안 됨).

실무 팁 하나. 굵기는 가능하면 font-weight로 주는 게 안전합니다. font-variation-settings만으로 굵기를 주면 다른 축을 새로 쓸 때 굵기가 기본값으로 리셋되는 사고가 납니다. 표준 속성과 축 제어를 섞어 쓸 때 가장 많이 나오는 버그입니다.

폰트가 늦게 뜨면 글자가 ‘툭’ 밀리던데요?

맞습니다. 웹폰트가 도착하기 전에는 브라우저가 시스템 폴백 폰트로 글자를 먼저 그립니다. 그런데 폴백 폰트와 웹폰트의 글자 크기·높이가 다르면, 웹폰트로 교체되는 순간 줄이 밀리며 레이아웃이 흔들립니다. 이게 Core Web Vitals의 CLS(누적 레이아웃 이동) 점수를 깎습니다.

코드 · size-adjust로 흔들림 잡기

폴백을 웹폰트 치수에 맞춥니다

폴백 폰트가 웹폰트와 같은 공간을 차지하게 만들면 교체 순간의 reflow가 사라집니다.

/* 폴백 전용 @font-face — 시스템 폰트의 치수를 웹폰트에 맞춤 */
@font-face {
  font-family: "Body-fallback";
  src: local("Apple SD Gothic Neo"), local("Malgun Gothic");
  size-adjust: 103%;        /* 평균 글자폭 맞춤 */
  ascent-override: 88%;     /* 윗선 높이 맞춤 */
  descent-override: 22%;    /* 아랫선 높이 맞춤 */
}
body { font-family: "Pretendard", "Body-fallback", sans-serif; }

// size-adjust·ascent-override·descent-override를 맞추면 폰트 교체 시 CLS를 줄이거나 없앨 수 있습니다.

여기에 font-display: swap으로 “폰트 오기 전엔 폴백이라도 일단 보여줘”를 지시하고, 폰트는 WOFF2로 압축해 전송량을 줄입니다. 이 세 가지(가변 폰트 + size-adjust 폴백 + WOFF2)가 제가 거의 모든 사이트에서 함께 쓰는 조합입니다.

그래서 한글은요? 여기가 진짜 함정입니다

가장 솔직하게 적습니다. 한글 가변 폰트도 분명히 있고, 잘 만든 것도 많습니다. 그런데 한글은 글자 수가 라틴(수십 자)과 비교가 안 되게 많아서(수천~수만 자), 파일 자체가 무겁습니다. ‘한 파일’이라는 가변 폰트의 장점이, 한글에서는 ‘한 무거운 파일’이 될 수도 있다는 뜻입니다.

그래서 한글에서는 가변이냐 아니냐보다 서브셋(subset)과 압축이 더 중요합니다. 사이트에 실제로 쓰는 글자만 추려 내고(자주 안 쓰는 한자·기호 제거), unicode-range로 쪼개 필요한 조각만 받게 하고, WOFF2로 압축합니다. 또 하나 자주 쓰는 절충은 본문은 시스템 폰트, 제목·로고만 가변 웹폰트로 가는 방식입니다. 모바일에서 CJK 본문을 시스템 폰트로 두는 건 성능상 합리적인 선택입니다.

항목굵기마다 폰트 파일가변 폰트 1파일
굵기 5종 쓸 때 요청 수파일 5개 요청파일 1개 요청
총 전송량(굵기 多)굵기마다 누적 → 커짐1파일이라 보통 더 작음
단일 굵기 파일 용량개별 파일은 더 가벼움1파일이 단일 굵기보다 큼
중간 굵기(예: 540)불가 — 600으로 욱여넣기연속 범위로 자유
유연성(너비·기울기)축마다 또 파일 필요한 파일에서 다축 제어

타입을 이렇게 보는 사람이, 사이트 전체의 ‘목소리’를 정합니다

폰트는 사이트가 입을 열기 전부터 말하는 첫 인상입니다. 한 글자의 굵기를 600이냐 540이냐로 고민하는 사람이라면, 줄 간격도 위계도 로딩 흔들림도 같은 태도로 다룹니다. Findable에서는 이런 타이포 디테일이 기본값입니다. 당신의 사이트, 어떤 목소리로 말하게 할까요?

가변 폰트가 정확히 뭔가요?
한 폰트 파일 안에 여러 굵기·너비·기울기 같은 ‘축(axis)’을 담은 OpenType 폰트입니다. Thin부터 Black까지 100~900을 끊어진 값이 아니라 연속 범위로 쓸 수 있어, 굵기마다 따로 파일을 받지 않아도 됩니다. 2025년 기준 브라우저 지원은 97% 이상입니다.
가변 폰트를 쓰면 페이지가 더 빨라지나요?
보통 그렇습니다. 굵기 4종 이상을 쓴다면 파일을 4개 받는 대신 가변 폰트 1개만 받으면 되니 네트워크 요청과 총 용량이 줄어듭니다. 단, 가변 파일 하나의 용량은 단일 굵기보다 큽니다. 그래서 ‘굵기를 몇 개나 쓰느냐’가 손익 분기점입니다.
font-variation-settings는 어떻게 쓰나요?
font-variation-settings로 각 축 값을 지정합니다. 굵기는 ‘wght’, 너비는 ‘wdth’처럼 등록 축은 소문자 네 글자이고, 폰트 제작자가 만든 커스텀 축은 대문자입니다. 다만 굵기는 가능하면 표준 속성인 font-weight를 먼저 쓰는 편이 안전합니다. 명시하지 않은 축은 기본값으로 되돌아가니 주의하세요.
폰트가 늦게 떠서 글자가 흔들리는 건 어떻게 막나요?
폴백 폰트가 웹폰트와 글자 크기·높이가 다르면, 웹폰트로 바뀔 때 줄이 밀려 레이아웃이 흔들립니다(CLS). @font-face에 size-adjust·ascent-override·descent-override를 줘서 폴백이 웹폰트와 같은 공간을 차지하게 맞추면 이 흔들림을 줄이거나 없앨 수 있습니다. WOFF2와 font-display:swap을 함께 씁니다.
한글도 가변 폰트를 쓸 수 있나요?
네, 한글 가변 폰트도 있습니다. 다만 한글은 글자 수가 많아 파일 자체가 라틴 폰트보다 훨씬 큽니다. 그래서 가변이라도 무겁다면 자주 쓰는 글자만 추려 서브셋(subset)하고 WOFF2로 압축하는 작업이 더 중요합니다. 본문은 시스템 폰트, 제목만 가변 웹폰트로 쓰는 절충도 자주 씁니다.

이런 디테일로 사이트를 만듭니다

굵기 하나, 흔들림 하나까지 이렇게 다루는 팀이 당신의 홈페이지를 만들면 어떨까요. 무료 진단으로 시작하세요.

무료 진단 받기

위 플레이그라운드는 이 페이지에서 실제로 동작하는 코드입니다. 가변 폰트·font-variation-settings·size-adjust 설명은 2025년 기준 공개된 웹 표준 문서(MDN·web.dev·Chrome for Developers) 및 HTTP Archive Web Almanac 2025의 일반 원칙을 따랐습니다. 한글 가변 폰트의 용량 부담은 글자 수 특성상 라틴 폰트보다 크니 서브셋·WOFF2가 필요하다는 점을 함께 적었습니다. 특정 제품의 정확한 파일 용량 수치는 폰트마다 달라 단정하지 않았으며, 날조된 사례·수치는 사용하지 않았습니다.