우리가 오랫동안 사용해온 HEX, RGB, HSL은 모니터를 위한 색상 모델입니다. 하지만 사람의 눈이 색을 인식하는 방식과는 차이가 있어서 "지각적으로 균일하지 않다"는 문제가 있습니다. OKLCH는 이 문제를 해결하는 현대적인 CSS 색상 함수입니다.

기존 색상 모델의 문제점

HSL은 색상(Hue), 채도(Saturation), 명도(Lightness)로 색을 표현합니다. 얼핏 직관적으로 보이지만, 실제로 동일한 L 값이라도 색조에 따라 밝기가 다르게 느껴집니다.

예를 들어 노란색 hsl(60, 100%, 50%)과 파란색 hsl(240, 100%, 50%)는 L값이 같아도 노란색이 훨씬 밝게 보입니다.

이런 불균일함은 버튼 hover 상태, 다크모드 색상 팔레트 설계 시 예측 불가능한 결과를 낳습니다.

OKLCH란?

OKLCH는 L(밝기, Lightness), C(채도, Chroma), H(색조, Hue) 세 가지 축으로 색을 표현합니다. OKLab 색상 공간을 기반으로 하며, 사람의 시각적 인식과 수학적 값의 변화가 일치하도록 설계되었습니다.

/* oklch(밝기 채도 색조) */
.button {
  background-color: oklch(65% 0.25 290); /* 보라색 계열 */
  color: oklch(99% 0 0);                 /* 거의 흰색 */
}
항목HSLOKLCH
지각 균일성❌ 낮음✅ 높음
밝기 예측성❌ 색조마다 다름✅ 항상 일관
다크모드 설계😓 어려움😊 쉬움
브라우저 지원✅ 전부✅ 모던 브라우저

다크모드 색상 시스템에 적용하기

OKLCH의 진가는 CSS 변수와 함께 쓸 때 드러납니다. L 값만 조정하면 자동으로 밝기가 일관되게 바뀝니다.

:root {
  --primary:    oklch(65% 0.25 290);
  --bg:         oklch(98% 0.01 240);
  --text:       oklch(25% 0.05 240);
  --surface:    oklch(99% 0.005 240);
}

[data-theme="dark"] {
  /* L 값만 뒤집으면 됩니다 */
  --primary:    oklch(70% 0.25 290);  /* 조금 더 밝게 */
  --bg:         oklch(15% 0.01 240);
  --text:       oklch(88% 0.03 240);
  --surface:    oklch(22% 0.01 240);
}

HSL로 같은 작업을 하면 각 색조별로 다른 L 값을 실험해가며 맞춰야 하지만, OKLCH는 수학적으로 균일하기 때문에 공식처럼 적용할 수 있습니다.

채도(Chroma) 다루기

OKLCH의 C(Chroma)는 색의 선명함을 나타냅니다. 0에 가까울수록 무채색, 높을수록 선명합니다. 단, 채도의 최대값은 색조마다 다릅니다 — 이 점이 HSL의 S와 다릅니다.

/* 같은 보라색 계열에서 채도 변화 */
.muted   { color: oklch(65% 0.05 290); } /* 흐린 보라 */
.normal  { color: oklch(65% 0.15 290); } /* 보통 보라 */
.vivid   { color: oklch(65% 0.30 290); } /* 선명한 보라 */

실전 팁: 색상 팔레트 한 줄로 만들기

OKLCH와 CSS calc()를 조합하면 반복 없는 팔레트를 만들 수 있습니다.

:root {
  --hue: 290;  /* 이것만 바꾸면 전체 팔레트 색조 변경 */

  --color-100: oklch(95% 0.05 var(--hue));
  --color-300: oklch(80% 0.15 var(--hue));
  --color-500: oklch(65% 0.25 var(--hue));
  --color-700: oklch(45% 0.20 var(--hue));
  --color-900: oklch(25% 0.10 var(--hue));
}
핵심 정리
OKLCH는 사람의 시각과 일치하는 지각 균일 색상 모델입니다. CSS 변수와 함께 사용하면 다크모드 설계, 팔레트 시스템 구축이 훨씬 예측 가능하고 쉬워집니다. 모던 브라우저는 모두 지원합니다.