CTKCLIP 웹사이트 해부: K-Beauty OEM/ODM 플랫폼의 디자인 토큰 & 인터랙션 전략
참고 안내 — 이 글은 외부에서 관찰 가능한 정보(DOM 구조, HTTP 응답, 공개 에셋 등)를 기반으로 작성된 개인적인 기술 분석이며, 학습과 참고 목적으로 제공됩니다. 내부 소스 코드에 직접 접근한 것이 아니므로 실제 구현 구조와 다를 수 있습니다. 분석 대상 사이트의 공식 입장과는 무관합니다.
- 한국 스타트업 감성의 커스텀 SPA — Next.js/Nuxt 없이 자체 번들러로 구축, Wanted Sans + 정교한 CSS 변수 10레벨 그레이 스케일이 특징
- GA4×2 · TikTok Pixel×2 · Mixpanel · Bigin · Groobee까지 6종 분석 도구 — 글로벌 B2B K-beauty 마켓의 멀티 어트리뷰션 전략이 읽힌다
- Swiper 카루셀 + 제품 호버 이미지 스왑이 핵심 인터랙션, 별도 애니메이션 라이브러리 없이 CSS 트랜지션(0.15s~0.6s 다중 duration)만으로 처리
첫인상: CTKCLIP.COM을 처음 열었을 때
페이지를 열면 흰 배경에 하늘색 그라데이션 히어로 섹션이 펼쳐진다. “Your Idea Today / Becomes Tomorrow’s Beauty Brand With CTKCLIP.COM” — 영어 헤드라인이 중앙 정렬로 크게 자리를 잡는다. 한국 화장품 OEM/ODM 플랫폼이지만 글로벌 고객을 1순위로 상정한 구성이다.
스크롤을 내리면 sec1 → sec2 → sec3.contents-swiper → sec4 → sec5.easy-simple-section → sec6 순서로 섹션이 이어진다. 섹션마다 네비게이션 바가 sticky하게 붙어 있어, 풀페이지 스크린샷에서도 네비게이션이 여러 번 반복 노출된다. 이 sticky 전략은 CTK가 네비게이션 클릭을 핵심 전환 경로로 보고 있다는 신호다.
기술 스택 해부
프레임워크 & 번들링 전략
__NEXT_DATA__, __NUXT__, /_astro/ 중 어떤 시그니처도 감지되지 않았다. 스크립트 경로가 /static/js/app.js?v=1773201249354 형태로, 버전 쿼리스트링(v=타임스탬프)으로 캐시 버스팅을 직접 구현하는 자체 빌드 파이프라인이다.
body 클래스가 desktop no-touch body--light로 설정된다. JS가 UA 감지 또는 pointer event 지원 여부를 판단해서 desktop/mobile, touch/no-touch 클래스를 동적으로 주입하는 패턴이다. 프레임워크 내장 반응형 대신 CSS 클래스 분기로 레이아웃을 제어한다는 뜻이다.
// 추정 구현 — body 클래스 주입 패턴
const isTouch = window.matchMedia('(pointer: coarse)').matches;
const isMobile = window.innerWidth < 768;
document.body.classList.add(isMobile ? 'mobile' : 'desktop');
document.body.classList.add(isTouch ? 'touch' : 'no-touch');
document.body.classList.add('body--light'); // 기본 라이트 테마Froala Editor CSS(froala-editor@latest)가 로드되는 것으로 보아 CMS 에디터를 내장하고 있다. 인사이트 포스트나 공지 등 콘텐츠 편집 기능이 플랫폼 내부에 있을 가능성이 높다.
CDN & 호스팅
미디어 자산 전체가 d18khqjaxnxujq.cloudfront.net에서 서빙된다. AWS CloudFront를 글로벌 미디어 CDN으로 사용하는 전형적인 K-startup 아키텍처다. 한국 → 동남아 → 미국 고객을 상대하는 글로벌 B2B 플랫폼답게 레이턴시 최적화를 CDN으로 해결했다.
정적 에셋(/static/css/, /static/js/)은 동일 오리진 서버에서 직접 서빙한다. 이미지/동영상 같은 대용량만 CloudFront, 코드 번들은 오리진 — 비용과 복잡도 균형을 맞춘 결정이다.
분석 도구 스택 — 6종 멀티 어트리뷰션
| 도구 | 목적 | 특이점 |
|---|---|---|
| Google Analytics 4 (×2) | 웹 행동 분석 | GA4 2개 프로퍼티 — 한국/글로벌 분리 가능성 |
| TikTok Pixel (×2) | 유입 어트리뷰션 | 2개 Pixel ID — 국가별 캠페인 분리 |
| Facebook Pixel | Meta 광고 전환 추적 | 리타게팅 용도 |
| Mixpanel | 제품 행동 분석 | 퍼널·리텐션 분석 |
| Bigin CRM SDK | 세일즈 CRM 연동 | Zoho Bigin — B2B 리드 트래킹 |
| Groobee | 한국형 AI 추천 엔진 | 제품 추천 개인화 |
Groobee(groobee.io)는 국내 이커머스에서 쓰이는 AI 상품 추천 SDK다. 이걸 B2B OEM 플랫폼에 도입했다는 건, 플랫폼 내 제품 탐색 경험을 개인화하겠다는 의도다. 소량 MOQ 특성상 여러 제품을 비교 탐색하는 바이어 패턴에 적합한 선택이다.
추정 프로젝트 구조
graph TD
ROOT["ctkclip.com/"] --> STATIC["static/"]
ROOT --> PAGES["페이지 라우트"]
ROOT --> CDN["CloudFront CDN"]
STATIC --> CSS["css/ — reset.css, app.css"]
STATIC --> JS["js/ — app.js, vendors"]
STATIC --> IMAGES["images/ — 로고, 히어로 이미지"]
PAGES --> HOME["/ — 메인"]
PAGES --> PLP["plp/ — 제품 목록"]
PAGES --> SOLUTION["solution/ — 클립 솔루션"]
PAGES --> INSIGHTS["insights/ — 인사이트"]
PAGES --> WITH_YOU["with-you/ — 가이드"]
PAGES --> AUTH["login/ join/ — 인증"]
PAGES --> MYPAGE["mypage/ — 마이페이지"]
CDN --> PRODUCTS["productTrans/ — 제품 이미지"]
CDN --> CONTENTS["link_content/ — 콘텐츠 썸네일"]
CDN --> FAVICON["user/favicon/ — 파비콘 세트"]
style ROOT fill:#067EFB,stroke:#0558c9,color:#fff
style STATIC fill:#7048E8,stroke:#5c39c0,color:#fff
style CDN fill:#0AAFC9,stroke:#089ab3,color:#fff
⚠️ 외부 관찰 기반 추정 — 실제 내부 구조와 다를 수 있음
인터랙션 레이어 해부
GSAP, Framer Motion, Lottie — 없다. CTKCLIP은 별도 JS 애니메이션 라이브러리 없이 순수 CSS 트랜지션으로 인터랙션 전체를 처리한다. 이건 절제된 선택이다. B2B 플랫폼에서 시선을 끄는 인터랙션보다 로딩 속도와 안정성이 우선이기 때문이다.
CSS 트랜지션 duration 체계
6가지 duration이 구체적으로 감지됐다:
| Duration | 용도 추정 |
|---|---|
| 0.15s | 네비게이션 호버, 폼 border 변화 |
| 0.2s | 버튼 배경색 전환 |
| 0.3s | 드롭다운, 팝업 등장 |
| 0.4s | 카드 hover 리프트 |
| 0.5s | 섹션 요소 fade-in |
| 0.6s | 히어로 텍스트 등장 |
transition-property로 감지된 항목: background-color, transform, opacity, height, border-color, color, width, background, bottom, top, left — 레이아웃 관련 프로퍼티(height, width, top, left)가 포함된 점이 눈에 띈다. Accordion이나 사이드 패널 같은 레이아웃 전환 인터랙션이 있다는 방증이다.
제품 호버 이미지 스왑
이 사이트의 핵심 인터랙션은 제품 카드 hover 시 이미지가 교체되는 패턴이다. DOM을 보면 각 제품마다 두 개의 이미지 URL이 존재한다:
main_0_1997c4e1— 기본 제품 이미지over_0_061143380— 호버 시 노출 이미지 (다른 각도 또는 사용 예시)
/* 제품 카드 호버 이미지 스왑 패턴 (추정) */
.product .img-default { opacity: 1; transition: opacity 0.4s; }
.product .img-hover { opacity: 0; position: absolute; inset: 0; transition: opacity 0.4s; }
.product:hover .img-default { opacity: 0; }
.product:hover .img-hover { opacity: 1; }이커머스 표준 패턴이지만, OEM/ODM 플랫폼에 적용한 이유가 있다. 바이어가 제품을 탐색할 때 용기 형태와 실제 제형 텍스처를 한 번에 비교하게 하려는 의도다.
Swiper 카루셀
sec3.contents-swiper와 sec5.easy-simple-section 두 섹션에서 Swiper가 쓰인다. 자동 추출된 사이트 유형이 scroll(일반 스크롤)로 나온 걸 보면, 전체 페이지를 Swiper 수직 슬라이드로 제어하지는 않는다. 섹션 내부의 수평 카루셀에만 국한해서 Swiper를 사용하는 절제된 구성이다.
디자인 시스템 분석
컬러 팔레트
CSS 변수에서 추출한 브랜드 컬러와 토큰 체계:
CSS 변수 네이밍이 두 레이어로 나뉜다. --color-blue, --color-purple 같은 의미 토큰과 --color-gray-10 ~ --color-gray-98 같은 스케일 토큰이 공존한다. 스케일 숫자가 10, 25, 35, 50, 65, 75, 85, 90, 92, 95, 98 — 10단계가 아닌 명도 기반 불규칙 간격으로 정의되어 있다. 실무에서 디자이너가 “이 회색이 약간 더 밝았으면” 같은 피드백을 수용하면서 토큰이 추가되는 과정에서 나온 형태다.
타이포그래피
Wanted Sans — wanteddev/wanted-sans@v1.0.3
원티드랩이 만든 한국어 최적화 기하학적 산세리프. Pretendard보다 좀 더 굵은 획과 각진 처리가 특징. jsDelivr CDN(GitHub 리포 직접 서빙)으로 로드하며, 폰트 CSS가 두 번 로드되는 중복이 관찰된다.
Wanted Sans를 선택한 이유는 맥락이 있다. 원티드랩의 HR 플랫폼과 유사한 B2B SaaS 느낌을 연출하면서, 한국어-영어 혼용 텍스트에서 모두 자연스러운 웨이트 분포를 보여준다. 화장품 브랜드지만 CTKCLIP은 뷰티보다 테크 플랫폼 정체성을 강조하는 방향을 택했고, 폰트 선택이 그 방향을 반영한다.
레이아웃 & 반응형
sec1 ~ sec6의 섹션 명명 규칙이 의도적이다. 컴포넌트 이름이 아니라 순서 번호로 섹션을 구분하는 건, 랜딩 페이지 특성상 섹션 재배치 빈도가 높아서 숫자 ID가 더 실용적이라는 판단으로 보인다.
모바일에서 body 클래스가 mobile touch로 전환되고, viewport에 user-scalable=no가 적용된다. 핀치 줌을 막는 한국 모바일 앱식 처리다. 접근성 측면에서는 논쟁 여지가 있지만, 제품 이미지 스왑 같은 터치 이벤트 처리가 핀치 줌과 충돌하는 걸 막는 현실적 선택이다.
UX 패턴 깊이 파기
네비게이션
4개 메인 메뉴: CREATE YOUR PRODUCT · CLIP SOLUTIONS · INSIGHTS · CTKCLIP WITH YOU. 각 메뉴가 플랫폼의 핵심 기능 흐름을 반영한다. 제품 만들기 → 솔루션 탐색 → 인사이트 학습 → 커뮤니티 참여 — 바이어가 브랜드를 론칭하기까지의 여정 순서다.
우측 상단에 위시리스트(하트), 언어/지역 전환(글로브 아이콘), 로그인 버튼이 배치된다. 글로브 아이콘의 존재가 다국어 지원을 암시하며, 제목 태그의 한국어-영어 병기도 같은 맥락이다.
정보 구조
/ (랜딩)
├── /plp/formula → 제품 목록 (포뮬라 기준)
├── /solution/main → CLIP 솔루션
├── /insights/ → 인사이트 & 블로그
│ └── /inspiration
├── /with-you/guide → 가이드 & 커뮤니티
└── /mypage/wishlist → 위시리스트 (로그인 필요)
/plp/formula — PLP(Product List Page)에 formula라는 패싯이 URL에 노출된다. 포뮬라 외에도 패키지, 카테고리 등 다른 패싯이 있을 가능성이 높다. URL 구조만으로 제품 필터링 아키텍처를 역설계할 수 있다.
SEO & 웹 표준
squirrel audit 기준 전체 점수 40점(F등급). 카테고리별로 보면 편차가 크다:
| 카테고리 | 점수 | 비고 |
|---|---|---|
| Analytics | 100 | GA4, TikTok, Facebook, Mixpanel 모두 정상 |
| Links | 94 | 깨진 링크 없음 |
| Crawlability | 91 | robots.txt는 양호, 단 사이트맵 형식 오류 |
| Content | 82 | 본문 품질 OK |
| Images | 75 | alt 속성 일부 누락 |
| Accessibility | 74 | 시맨틱 마크업 부분 보완 필요 |
| Core SEO | 67 | 제목·설명 과장 길이, H1 태그 비어 있음 |
| Mobile | 63 | user-scalable=no 감점 요인 |
| Performance | 65 | 6개 분석 스크립트 로딩 비용 |
| Security | 52 | CSP 헤더 등 미설정 |
| E-E-A-T | 53 | 저자·전문성 신호 부족 |
| Legal Compliance | 44 | 쿠키 동의, 개인정보 처리방침 연결 미흡 |
현재 title 태그: “CTKCLIP - K-Beauty OEM/ODM & Private Label Manufacturer | CTKCLIP - 화장품 OEM/ODM 플랫폼 | 소량생산 & 제조 솔루션” (99자)
구글 권장 상한은 60자. 한국어·영어 두 버전을 파이프(|)로 이어 붙인 구조가 CTR을 분산시키고 크롤러의 주제 판단을 흐린다. hreflang 속성을 사용해 언어별 페이지를 분리하거나, 단일 언어로 짧게 유지하는 것이 낫다.
H1 태그가 비어있는 문제도 있다. 시각적으로 크게 보이는 “Becomes Tomorrow’s Beauty Brand” 텍스트가 실제로는 h2로 마크업되어 있다. 검색 엔진이 페이지 주제를 파악하는 주요 시그널 중 하나를 놓치고 있다.
배울 점 & 아쉬운 점
참조할 만한 기술
1. 정교한 CSS 변수 스케일 시스템
--color-gray-10부터 --color-gray-98까지 숫자를 밝기 기준으로 설계한 방식은 실무에서 바로 쓸 수 있다. 색상 이름이 아닌 밝기 수치로 토큰을 정의하면 디자이너-개발자 간 커뮤니케이션이 단순해진다.
/* 참조 패턴: 밝기 기준 그레이 스케일 토큰 */
:root {
--color-gray-10: #121212; /* 거의 검정 */
--color-gray-50: #707070; /* 중간 회색 */
--color-gray-95: #EFEFEF; /* 거의 흰색 */
--color-gray-98: #F7F7F7; /* 배경용 */
}
2. body 클래스 기반 디바이스 분기
Tailwind의 반응형 접두사(md:, lg:) 대신 body.desktop/body.mobile 클래스로 CSS를 분기하는 방식은 복잡한 터치/비터치 인터랙션 차이를 처리할 때 유효하다. 단, JS 로드 전 깜빡임(FOUC)을 막으려면 SSR 또는 <head> 인라인 스크립트로 초기값을 설정해야 한다.
3. 제품 이미지 이중화 패턴
main_0 + over_0 URL 컨벤션으로 이미지를 서버에 저장하고, CSS로 호버 스왑을 처리하는 방식. 별도 JS 없이 구현 가능하고, 스크린 리더가 대체 이미지를 alt로 인식할 수 있어 접근성 친화적이다.
개선 여지
- SEO: H1 비어있음 — 히어로 헤드라인을
h1으로 올리고 제목 태그를 60자 이내로 정리하는 것만으로도 Core SEO 점수를 크게 올릴 수 있다 - 폰트 중복 로딩 — Wanted Sans CSS가 두 번
<link>로 삽입되어 있다. 번들 설정 점검이 필요하다 - 6개 분석 도구 → 초기 로딩 페이지 — TikTok Pixel 2개를 포함한 분석 스크립트들이 메인 스레드를 점유한다.
async/defer또는 GTM으로 통합 관리하면 Performance 점수를 개선할 수 있다 - Legal Compliance 44점 — GDPR/개인정보보호법 기준 쿠키 동의 UX 보완이 필요하다. 특히 EU 고객 대상 K-beauty 플랫폼이라면 우선순위를 높여야 한다
배울 점: 개발자가 가져갈 기술적 인사이트
B2B 플랫폼의 인터랙션 절제 원칙 — GSAP·Framer Motion 없이 CSS 트랜지션만으로 인터랙션을 처리한 건 의도된 절제다. 바이어가 제품 정보를 탐색하는 맥락에서 화려한 애니메이션은 오히려 집중을 방해한다. 애니메이션 라이브러리를 추가하기 전에 CSS 트랜지션으로 충분한지 먼저 물어볼 것.
분석 도구를 제품 전략 신호로 읽는 법 — Mixpanel(퍼널 분석) + Groobee(AI 추천) 조합은 이 팀이 바이어의 제품 탐색 흐름을 데이터로 개선하고 있다는 신호다. 어떤 분석 도구를 선택했는지가 곧 팀의 성장 전략을 보여준다.
CloudFront CDN 분리 전략 — 코드 번들은 오리진, 미디어만 CloudFront로 분리하는 패턴은 CDN 비용을 최적화하면서 글로벌 레이턴시를 관리하는 현실적 선택이다. 이미지 많은 이커머스 플랫폼에서 바로 적용할 수 있는 아키텍처 패턴이다.
자주 묻는 질문 (FAQ)
Q. CTKCLIP이 Next.js 같은 SSR 프레임워크를 쓰지 않은 이유는?
외부 관찰만으로 확정할 수는 없지만, /static/ 경로의 커스텀 번들과 body 클래스 JS 주입 패턴을 보면 자체 빌드 파이프라인을 오랫동안 유지해온 레거시일 가능성이 높다. 초기 MVP를 커스텀 스택으로 빠르게 런칭한 뒤, 리팩토링 비용이 커져 현재 구조를 유지하는 흔한 패턴이다.
Q. Wanted Sans vs Pretendard — 왜 Wanted Sans를 선택했을까?
두 폰트 모두 한국어-영어 혼용에 강하다. Pretendard가 더 얇고 중립적인 느낌이라면, Wanted Sans는 획이 굵고 테크 스타트업 정체성이 뚜렷하다. CTKCLIP이 화장품 제조 플랫폼임에도 불구하고 B2B SaaS 이미지를 구축하려 한다면, Wanted Sans가 더 적합한 선택이다.
Q. 분석 도구가 6개인데 성능에 영향은 없을까?
영향이 있다. Performance 점수가 65점인 원인 중 하나다. TikTok Pixel 2개는 각각 main.js를 동기 로딩한다. 이를 GTM 하나로 통합하고 async 로딩으로 전환하면 초기 렌더 블로킹을 줄일 수 있다.
참고 안내 — 이 글은 외부에서 관찰 가능한 정보(DOM 구조, HTTP 응답, 공개 에셋 등)를 기반으로 작성된 개인적인 기술 분석이며, 학습과 참고 목적으로 제공됩니다. 내부 소스 코드에 직접 접근한 것이 아니므로 실제 구현 구조와 다를 수 있습니다. 분석 대상 사이트의 공식 입장과는 무관합니다.