이 글은 누구를 위한 것인가
- 구글의 서드파티 쿠키 폐지로 광고 타겟팅이 어려워진 팀
- 고객 동의 기반으로 개인화 데이터를 수집하고 싶은 마케팅 팀
- GDPR, 개인정보보호법을 준수하면서 개인화를 유지하고 싶은 팀
들어가며
서드파티 쿠키 없이 개인화를 어떻게 유지할까? 답은 고객이 자발적으로 제공하는 데이터 — 제로 파티 데이터다. 신뢰를 기반으로 수집한 데이터는 쿠키 데이터보다 정확하고, 법적 리스크도 없다.
이 글은 bluefoxdev.kr의 쿠키리스 마케팅 전략 을 참고하여 작성했습니다.
1. 데이터 유형별 전략
[고객 데이터 4가지 유형]
제로 파티 (Zero-Party):
정의: 고객이 의도적으로 공유한 데이터
예: 선호 카테고리, 사이즈, 생일, 관심사 퀴즈
특징: 동의 명확, 정확도 높음
퍼스트 파티 (First-Party):
정의: 자체 플랫폼에서 수집한 행동 데이터
예: 구매 이력, 클릭, 검색어, 장바구니
특징: 동의 기반, 활용 범위 넓음
세컨드 파티 (Second-Party):
정의: 파트너사와 교환한 데이터
예: 제휴 쇼핑몰 구매 데이터
특징: 계약 기반
서드 파티 (Third-Party):
정의: 외부 데이터 브로커로부터 구매
예: DMP 데이터
특징: ⚠️ 쿠키 종료로 급감 중
[전략: 제로 + 퍼스트 파티 중심으로 전환]
2. 선호 센터 구현
interface UserPreferences {
userId: string;
categories: string[]; // 관심 카테고리
brands: string[]; // 선호 브랜드
priceRange: { min: number; max: number };
sizes: { clothing?: string; shoe?: string };
birthday?: string;
gender?: string;
notificationChannels: {
email: boolean;
sms: boolean;
push: boolean;
};
emailFrequency: 'daily' | 'weekly' | 'monthly';
interests: string[]; // 라이프스타일 태그
updatedAt: string;
}
// 선호 센터 페이지 컴포넌트
function PreferenceCenter({ userId }: { userId: string }) {
const [prefs, setPrefs] = useState<UserPreferences | null>(null);
const [saved, setSaved] = useState(false);
const savePreferences = async (newPrefs: Partial<UserPreferences>) => {
const updated = { ...prefs, ...newPrefs, userId, updatedAt: new Date().toISOString() };
await fetch('/api/preferences', {
method: 'PUT',
body: JSON.stringify(updated),
});
setPrefs(updated as UserPreferences);
setSaved(true);
// 선호 업데이트 이벤트 발행 (추천 엔진 업데이트)
analytics.track('preferences_updated', { categories: newPrefs.categories });
};
return (
<div className="preference-center">
<h1>내 취향 설정</h1>
<p>설정한 정보는 맞춤 추천과 이메일에 활용됩니다.</p>
<CategorySelector
selected={prefs?.categories || []}
onChange={(cats) => savePreferences({ categories: cats })}
/>
<PriceRangeSelector
value={prefs?.priceRange}
onChange={(range) => savePreferences({ priceRange: range })}
/>
<SizeSelector
value={prefs?.sizes}
onChange={(sizes) => savePreferences({ sizes })}
/>
<NotificationSettings
value={prefs?.notificationChannels}
onChange={(channels) => savePreferences({ notificationChannels: channels })}
/>
{saved && <p className="text-green-600">저장되었습니다 ✓</p>}
</div>
);
}
3. 퀴즈 기반 온보딩
const STYLE_QUIZ = [
{
id: "occasion",
question: "주로 어떤 상황에 쇼핑하시나요?",
type: "multiple",
options: ["일상/캐주얼", "직장/비즈니스", "운동/스포츠", "특별한 날"],
maps_to: "interests",
},
{
id: "price_sensitivity",
question: "평균 상품 예산은 어느 정도인가요?",
type: "single",
options: ["3만원 미만", "3~7만원", "7~15만원", "15만원 이상"],
maps_to: "priceRange",
},
{
id: "brand_preference",
question: "선호하는 스타일은?",
type: "multiple",
options: ["미니멀", "스트릿", "클래식", "스포티", "빈티지"],
maps_to: "interests",
},
];
function mapQuizToPreferences(answers: Record<string, string[]>): Partial<UserPreferences> {
const priceMap: Record<string, { min: number; max: number }> = {
"3만원 미만": { min: 0, max: 30000 },
"3~7만원": { min: 30000, max: 70000 },
"7~15만원": { min: 70000, max: 150000 },
"15만원 이상": { min: 150000, max: 10000000 },
};
return {
interests: [
...(answers.occasion || []),
...(answers.brand_preference || []),
],
priceRange: priceMap[answers.price_sensitivity?.[0]] || { min: 0, max: 10000000 },
};
}
마무리
제로 파티 데이터는 "받는 것"이 아니라 "교환하는 것"이다. 고객이 취향을 알려주면, 그것에 맞는 추천을 돌려준다는 명확한 가치 교환이 있어야 한다. 선호 센터를 만들되, 입력한 데이터가 실제로 추천에 반영되지 않으면 신뢰를 잃는다. 데이터 수집과 활용이 연결되어야 한다.