아티클 · 01

토큰 한 벌로,
라이트와 다크를 동시에.

Tokens는 단일 변수 레이어에서 라이트, 다크, 그리고 브랜드 테마를 동시에 운영하는 개발자 도구입니다. 이 글에서는 그 시스템이 어떻게 구성돼 있는지, 그리고 왜 디자인 토큰이 단순한 색상 변수가 아닌 프로덕트 인터페이스의 계약인지 설명합니다.

정예린 · 디자인 엔지니어 2026년 9월 14일 읽기 12분 디자인 시스템
아티클 읽기 → GitHub에서 보기

디자인 토큰은 단순한 디자인 자산이 아닙니다. 토큰은 프론트엔드와 디자인 도구 사이의 계약이며, 라이트/다크/브랜드 모드를 단일 소스에서 다루기 위한 가장 안정적인 어딘가에 있습니다.

왜 토큰인가

단일 소스, 세 표면

tokens.css · 기본 정의 CSS · 24줄
/* 색상 — 의미 단위로 묶고, 모드는 변수만 덮어쓴다 */
:root {
  --bg:      #FBFAF6;   /* paper-warm */
  --surface: #FFFFFF;
  --fg:      #1A1A1A;
  --muted:   #6B6A66;
  --border:  #E6E3DB;
  --accent:  #3D4F8C;   /* quiet indigo */
}

/* 다크 — 같은 이름, 다른 값. 컴포넌트는 그대로. */
:root[data-theme="dark"] {
  --bg:      #0F1115;
  --surface: #1A1D24;
  --fg:      #E4E6EB;
  --muted:   #8E9099;
  --border:  #2A2E37;
  --accent:  #8C9DD6;   /* 같은 hue, chroma만 낮춤 */
}
라이트와 다크는 같은 토큰 이름에 다른 값만 매핑합니다. 컴포넌트 코드는 한 벌만 유지됩니다.

의미 이름이 곧 인터페이스

세 가지 원칙

Tokens 팀이 모드 전환 시스템을 운영하면서 정착시킨 세 가지 원칙을 공유합니다. 이 원칙들은 토큰을 정의하는 규칙이며, 동시에 컴포넌트가 토큰을 참조하는 규칙이기도 합니다.

토큰은 시각적 외양이 아니라 의미의 단위다. 외양은 모드에 따라 바뀌지만, 의미는 바뀌면 안 된다.

타이포와 스페이싱은 모드를 가로질러야 한다

브랜드와 함께 배포한다

이 구조 덕분에 Tokens는 같은 컴포넌트 라이브러리를 12개 브랜드에 동시에 배포하고 있습니다. 새 브랜드가 추가될 때마다 작성하는 컴포넌트 코드는 단 한 줄도 없습니다 — 토큰 정의만 교체하면 끝입니다. 결국 토큰은 시각적 외양이 아니라, 프로덕트 표면이 어떤 의미 단위로 구성돼 있는지를 코드와 디자인 도구 양쪽에 동시에 선언하는 작업이며, 한 번 잘 정의해두면 라이트/다크/브랜드는 더 이상 별도의 작업이 아니라 같은 시스템 위의 서로 다른 표면이 됩니다.

핵심 원칙

토큰을 정의하는 세 가지 규칙

01

의미로 명명한다

외양이 아니라 역할로 토큰 이름을 붙입니다. --fg, --surface, --accent처럼 그 값이 무엇을 위해 존재하는지를 이름에 담아야, 모드가 바뀌어도 의미는 그대로 남습니다.

02

모드당 토큰은 같다

라이트와 다크는 같은 이름의 토큰을 가져야 합니다. 모드마다 다른 이름이 등장하는 순간, 컴포넌트는 두 표면을 동시에 운영할 수 없게 됩니다. 차이는 값에서만 발생해야 합니다.

03

브랜드는 한 단계 위

라이트/다크는 같은 위계의 모드입니다. 브랜드 테마는 그 위에서 accent와 surface 톤만 교체하는 별도 레이어로 둡니다. 이렇게 분리하면 같은 컴포넌트 라이브러리를 여러 브랜드에 그대로 배포할 수 있습니다.

뉴스레터

디자인 시스템에 관한 메모, 격주.

Tokens 팀이 작업하면서 배운 것, 실수, 그리고 토큰 운영에 도움이 되는 도구들을 격주 금요일 아침에 보내드립니다. 구독은 언제든 해지할 수 있습니다.

이메일을 제출하면 Tokens의 개인정보 처리방침에 동의하는 것으로 간주됩니다.