GA 입문 2편 — 데이터 모델 깊이 · User ID · Session · Custom Dimension

2026-05-17Google Analytics 입문에서 운영까지

GA 입문 2편. GA4 데이터 모델 깊이 — User 식별 3 layer (Client ID · User ID · Google Signal · cross-device 추적), Session 정의 변화 (UA 와 차이 · 30분 timeout · engaged session), Event Parameter 한도 (event 당 25 · name 40자 · value 100자), Custom Dimension/Metric 의 3 scope (event · user · item), Cardinality 함정 · PII 정책 · Consent Mode (cookieless 미래) 까지 풀어쓴 학습 노트.

📚 Google Analytics 입문에서 운영까지 · 2편 — 데이터 모델 깊이 · User ID · Session · Custom Dimension

이 글은 Google Analytics 입문에서 운영까지 시리즈 2편이에요. 1편 의 큰 그림 다음 — 데이터 단위까지의 깊이. 1편에서 event 기반 모델 · 4 측정 방법 봤다면, 2편은 어떻게 사용자를 식별하고 · 세션을 정의하고 · custom 데이터를 박는지.

이번 글의 범위

1편에서 "같은 사용자가 web + iOS + Android 통합 추적" 이 GA4 의 큰 강점이라 했어요. 어떻게 그게 되는지의 깊이가 2편. 한 마디로 — 식별 + 한도 + privacy 의 3 축.

GA4 데이터 모델 — 큰 그림

[사용자] (정체 식별)
   ↓
   Client ID + User ID + Google Signal
   ↓
[Session] (활동 시간 단위)
   ↓
   30분 timeout · engaged session
   ↓
[Event] (각 행동)
   ↓
   event_name + event_params
   ↓
[Parameters · User Properties]
   ↓
   한도 + cardinality 통제
   ↓
[Custom Dimension / Metric] (보고서·분석 단위)

각 layer 의 함정 이 다음 layer 에 영향. 처음부터 잘 잡는 게 6개월 후의 모든 분석 품질을 결정. 여기서 cardinality (한 dimension 의 unique 값 개수) 라는 단어가 계속 나오는데, 뒤에서 다시 풀어요.

User 식별 — 3 Layer

GA4 의 사용자 식별3 layer 의 결합. 각 layer 가 다른 신뢰도 · 다른 cross-device 범위.

Layer 1: Client ID — 자동 부여

Client ID = 브라우저 · 디바이스 별 unique ID. cookie 또는 localStorage 에 저장.

사용자 첫 방문 → Client ID 자동 생성 (UUID 형식)
  → cookie `_ga=GA1.1.xxx.xxx` 에 저장
  → 같은 브라우저 다음 방문 = 같은 Client ID

UUID (Universally Unique Identifier, 충돌 거의 없는 ID 표준) 형식으로 발급되는 게 포인트.

한계cookie 삭제 하면 새 Client ID 가 발급돼 다른 사용자로 인식되고, Incognito · Private 모드 도 매번 새로 발급돼요. 다른 디바이스 (PC ↔ 모바일) 끼리는 당연히 다른 ID 고, 같은 디바이스라도 다른 브라우저 면 역시 다른 ID. → Client ID 만으로는 cross-device 추적 어려움.

Layer 2: User ID — 로그인 사용자

User ID 를 GA 로 전송 = 여러 세션 · 기기 · 플랫폼에서 사용자 행동 연결. — 공식 docs

User ID = 우리 시스템의 로그인 사용자 ID. 우리가 명시 박음.

// 사용자 로그인 시점
gtag('config', 'G-XXXXXXXX', {
  user_id: 'user-12345'    // 우리 DB user.id
});

// 또는 이미 초기화 된 후
gtag('set', { user_id: 'user-12345' });

효과 — 같은 user_id 가 여러 디바이스 에서 로그인 시 → cross-device 통합 추적.

사용자 김철수:
  - 노트북 (Client ID A) + 로그인 → user_id="user-123"
  - 회사 PC (Client ID B) + 로그인 → user_id="user-123"
  - iPhone 앱 (App Instance ID C) + 로그인 → user_id="user-123"
  → GA4 가 *한 사용자* 로 통합

User ID 의 함정 — 4가지

함정 1: User ID 를 Custom Dimension 으로 박지 X

User ID 기반으로 Custom Dimension 설정 X. 고유 값 너무 많아져 데이터 정확성 손상. — 공식 docs

— Custom Dimension 은 cardinality 통제 가 필수. user_id 박으면 값이 사용자 수만큼 → 폭증.

해결 — User ID 는 GA 표준 식별자. 별도 dimension X.

함정 2: 로그아웃 시 null 정확히

// ✓ 로그아웃 시 정확
gtag('set', { user_id: null });

// ✗ 잘못된 값
gtag('set', { user_id: '' });          // 빈 문자열
gtag('set', { user_id: 'null' });      // 문자열 "null"
gtag('set', { user_id: undefined });   // undefined

null 만 명시 권장. 다른 값 = User ID 가 그 값 으로 박힘 (모든 익명 사용자가 같은 ID = 한 사용자로 인식).

함정 3: PII 박지 X

✗ user_id: "user@example.com"       (이메일 = PII)
✗ user_id: "010-1234-5678"          (전화 = PII)
✗ user_id: "주민번호..."              (절대 금지)

✓ user_id: "user-12345"              (DB 의 unique ID)
✓ user_id: "550e8400-e29b-41d4..."   (UUID)
✓ user_id: sha256("user@email.com") (hash)

여기서 PII (Personally Identifiable Information, 개인식별정보) 가 처음 나오는데, 뒤 PII 정책 절에서 깊이 봐요.

Braze 3편 External ID 보안 · Statsig 의 user identifier 와 같은 원칙.

함정 4: 일관성 — 모든 환경 같은 ID

Web 에서:    user_id = "user-12345"
iOS 에서:    user_id = "user_12345"   (언더바)
Android:    user_id = "12345"        (prefix 없음)
→ 3 명의 다른 사용자로 인식

Braze 3편 user factory 함수 와 같은 패턴 — user ID normalization 통일.

Layer 3: Google Signal — Google 로그인 활용

Google Signal = Google 계정 로그인 + 광고 개인 맞춤 활성화 사용자의 cross-device 자동 추적.

사용자가 Chrome · Google 검색 · YouTube · Gmail 등에서
  Google 계정 로그인 상태
  + "광고 개인 맞춤" 동의함
  → Google 이 이 사용자 cross-device 통합 인식
  → GA4 에 통합 데이터 제공

효과User ID 없이도 (anonymous user) cross-device 통합이 가능하고, 광고 ROI 정확도가 올라가요. 거기에 demographic 데이터 (연령 · 성별 · 관심사) 까지 같이 들어옵니다.

활성 방법:

GA4 console → Admin → Property settings → Data settings → Data collection
→ "Google signals data collection" 활성화

3 Layer 의 결합

가장 강력한 cross-device 추적:
  Client ID (브라우저 단위) +
  User ID (로그인 사용자) +
  Google Signal (Google 로그인) +
  Device ID (Firebase, 앱)
  ↓
  GA4 의 통합 user identity

대부분 큰 회사 = 3 layer 모두 활성. 적절한 cross-device 추적 + 사용자 분석.

Session — UA 와 큰 차이

여기서 UA (Universal Analytics, GA4 이전 세대 GA) 가 처음 나와요. 이후로는 UA 로만 표기.

Session 정의

Session = 사용자가 사이트 · 앱에 active 한 시간 단위. 연속 활동 의 묶음.

기본 규칙

1. session_start event 가 새 session 시작
2. 30분 동안 활동 없으면 session 자동 종료
3. 자정 (timezone 기준) 에 강제 종료
4. UTM 파라미터 변경 = 새 session (옵션)

UA 와 다른 자리 — 함정

UA 시대의 session 정의 와 GA4 가 조금씩 다름:

항목 UA GA4
timeout 30분 (default) 30분 (변경 가능)
자정 reset 자동 자동
UTM 변경 = 새 session 자동 옵션 (off 가능)
Direct traffic 우선 마지막 source 첫 source 또는 마지막
Cross-domain 별도 설정 필요 통합 추적 가능

UA 시대 보고서 와 GA4 보고서의 session 수가 다를 수밖에. 추세만 비교, 절대 수 비교 X.

Engaged Session — GA4 신규

Engaged Session = 진짜 의미 있는 session 만 카운트:

조건 (다음 중 하나 이상):
  - 세션이 10초 이상 지속
  - conversion event 발생
  - 2개+ 페이지뷰

이유 — UA 시대 bounce rate"1 페이지만 보고 떠난 사용자" 정의가 단순했어요. GA4 의 engaged session = 진짜 engagement 측정 위한 더 엄격한 정의.

Bounce Rate 정의 변화

UA 의 bounce rate:
  = 1 페이지만 본 세션 비율

GA4 의 bounce rate:
  = (전체 session - engaged session) / 전체 session
  = engaged session 의 반대 비율

UA 의 bounce rate 30% 가 GA4 에서 보면 다를 수 있음. 정의 자체가 다름.

Cross-domain Session

사용자가 site-a.com 에서 site-b.com 로 이동
  → UA: 별도 session (다른 사이트 인식)
  → GA4 + cross-domain 설정: 같은 session 유지

설정 = console → Data Streams → web stream → Configure cross-domain measurement도메인 list 추가.

대표 사용은 마케팅 사이트 + 본 서비스 (다른 도메인) 조합, 결제 partner 의 redirect 사이트, 그리고 subdomain (보통 자동, 다른 도메인은 명시 필요) 정도예요.

Event Parameter 한도

각 event 의 parameter (속성) 한도가 있어요. 운영 환경에서 모르면 사고.

한도 정리

이벤트 1개당:
  - parameter 최대: 25개
  - parameter name 길이: 40 자 (영문)
  - parameter value 길이: 100 자 (영문)

User Property:
  - property 최대: 25개
  - property name 길이: 24 자
  - property value 길이: 36 자

Event Name:
  - 최대 길이: 40 자
  - 영문 + 숫자 + 언더바 (snake_case)

여기서 시험 함정이 하나 있어요 — 값 길이 초과 시 자동 절단. 100자 초과 = 처음 100자만 박힘. 긴 URL · 메시지 박으면 예상 못한 잘림.

자동 수집 Parameter

GA4 가 모든 event 에 자동 부여:

모든 event 자동:
  - language       (브라우저 언어)
  - page_location  (URL)
  - page_referrer  (referrer URL)
  - page_title     (페이지 타이틀)
  - screen_resolution

수동 박을 필요 없음. 우리 custom parameter 만 박기.

Recommended Event 의 표준 Parameter

// purchase event 의 표준 parameter
gtag('event', 'purchase', {
  transaction_id: 'T-12345',
  value: 50000,
  currency: 'KRW',
  tax: 5000,
  shipping: 3000,
  items: [
    {
      item_id: 'P-1',
      item_name: '여름 원피스',
      category: 'dress',
      price: 50000,
      quantity: 1
    }
  ]
});

업종별 권장 parameter 사용 = 자동 보고서 풍부. 표준 e-commerce funnel 자동 생성.

Custom Dimension / Metric — 깊이

정의

  • Custom Dimension = 문자 분류 (값이 카테고리)
  • Custom Metric = 숫자 측정 (값이 정량)
Custom Dimension 예:
  - user_tier ("free" / "premium" / "enterprise")
  - article_category ("tech" / "lifestyle" / "news")
  - login_method ("email" / "kakao" / "google")

Custom Metric 예:
  - cart_value (결제 금액)
  - page_load_time (성능)
  - article_word_count

Scope 3 종 — 가장 중요한 자리

여기가 시험 함정 자리. Custom Dimension/Metric 은 3 scope 중 하나 선택. 잘못 선택 = 회복 어려움:

Scope 의미
Event 해당 event 에만 적용 article_category (page_view event 별)
User 사용자 단위, 모든 event 에 user_tier (premium 사용자의 모든 행동)
Item e-commerce item 단위 brand · color · size

Event scope — 한 사용자가 여러 article 조회 하면 각 event 의 article_category 다름. 보고서 = article 별 group by.

User scope사용자 tier해당 사용자의 모든 event 에 적용. tier 가 바뀌면 future event 만 새 tier (과거 event 의 tier 변경 X).

Item scope — e-commerce 의 상품 array 안 dimension. 한 결제에 여러 상품각자 다른 brand.

Scope 결정 가이드

"한 사용자가 시간에 따라 값이 바뀌는 attribute?"
  Yes → User scope (tier · subscription_state)

"같은 사용자도 event 마다 값이 다른 attribute?"
  Yes → Event scope (article_id · search_query)

"상품 array 안의 attribute?"
  Yes → Item scope

Cardinality 함정 — 가장 큰 위험

Cardinality = 한 dimension 의 unique 값 개수. GA4 의 한도:

한 property 안:
  - Custom Dimension 최대: 50개 (Event scope) + 25개 (User scope) + 10개 (Item scope)
  - 각 dimension 의 unique 값: 권장 50,000 미만

고 cardinality 의 위험:

✗ user_id 를 dimension 으로            (값 = 사용자 수, 수백만+)
✗ session_id 를 dimension 으로         (값 = 세션 수, 무한)
✗ product_id 를 user-scope dimension (값 = 상품 × 사용자)
✗ search_query 를 dimension          (자유 입력, 무한)

Cardinality 초과 시 GA4 동작:

값이 50K 초과:
  → 상위 N 만 명시 표시
  → 나머지 = "(other)" 로 통합
  → 분석 정확도 ↓

분류 가능한 카테고리만 dimension. 고유 값은 Event parameter 로만 (BigQuery 에서 raw 조회).

Statsig · Braze 의 cardinality 통제 원칙 과 같음. 모든 analytics 도구의 공통 원칙.

활용 예제

// User scope — 로그인 시
gtag('set', 'user_properties', {
  user_tier: 'premium',
  signup_year: 2025,
  country: 'KR'
});

// Event scope — 페이지뷰 시
gtag('event', 'page_view', {
  article_category: 'tech',
  article_author: 'Kim'
});

// Item scope — 결제 시
gtag('event', 'purchase', {
  transaction_id: 'T-1',
  value: 50000,
  items: [
    {
      item_id: 'P-1',
      item_name: '...',
      // Item scope dimension
      brand: 'Nike',
      color: 'red',
      size: 'L'
    }
  ]
});

PII 정책 — 절대 박으면 안 되는 것

GA4 의 PII (개인식별정보) 금지 정책. 위반 = property 정지 위험.

절대 X

- 이메일 (full email)
- 전화번호
- 주민등록번호 · SSN
- 실명 · 주소 · 신용카드번호
- 정확한 위도/경도
- IP 주소 (anonymize_ip 자동 처리 — 단 수동 박지 X)

박는다면 — Hash 필수

// 이메일 hash
const hashedEmail = sha256(user.email);
gtag('set', { user_id: hashedEmail });

PII 의 raw 박지 말고 hash. 단 진짜 hash 가 unique 식별 가능 하면 PII 여전 → PII 의 한계는 회피 어려움.

Anonymize IP

GA4 = IP anonymization 자동 (UA 시대 명시 옵션이었던 게 기본 활성).

실제 IP: 1.2.3.4
GA4 처리: 1.2.3.0 (마지막 옥텟 0)

위반 시 처벌

GA 가 PII 추적을 잡아내면 경고 또는 정지가 떨어지고, 사용자가 GDPR (EU 개인정보보호 규정) 위반으로 신고하면 큰 벌금 (EU 매출 4%) 까지 갈 수 있어요. 거기에 신뢰 손실까지. → PII 추적 안 하는 게 기본 원칙. 의도하지 않은 누설도 검토.

Consent Mode — Cookieless 미래

Cookie 의 종말

Safari · Firefox: 이미 third-party cookie 차단
Chrome: 2024 ~ 진행 중 (Privacy Sandbox)
EU/UK: GDPR · ePrivacy 강화

여기 Privacy Sandbox (Chrome 의 cookie 대체 광고 측정 프레임워크) 와 ePrivacy (EU 의 전자통신 사생활 지침) 가 함께 나와요. Cookie 의존 의 GA4 가 어떻게 대응 하는가의 자리.

Consent Mode 의 의미

Consent Mode = 사용자 동의 상태를 GA4 에 명시 전달. 동의 거부 시도 cookieless 측정 활성.

// 기본 — 동의 안 받은 상태 (default)
gtag('consent', 'default', {
  'ad_storage': 'denied',
  'analytics_storage': 'denied',
  'ad_user_data': 'denied',
  'ad_personalization': 'denied'
});

// 사용자가 동의 후
gtag('consent', 'update', {
  'analytics_storage': 'granted',
  'ad_storage': 'denied'   // analytics 만 동의
});

Consent Mode 의 효과

[동의 받음]: 일반 GA4 추적 (cookie 기반)
[동의 거부]: cookieless ping
  → User ID 없는 hit
  → Google 의 *modeling* 으로 일부 데이터 추정
  → Conversion 보고서는 어느 정도 정확도 유지

modeling 의 의미동의 거부 사용자의 행동동의 받은 사용자의 패턴 기반 으로 통계적 추정. 100% 정확 X but 보고서가 비어 보이지 않음.

통합 — Cookie Banner

[사용자 진입]
   ↓
[Consent Mode default 설정] (모든 거부)
   ↓
[Cookie Banner 표시] (Cookiebot · OneTrust 등)
   ↓
[사용자 선택]:
   동의 → consent update (granted)
   거부 → consent 유지 (denied · cookieless)

대부분 큰 회사 = Cookie Banner + Consent Mode 결합. GDPR 준수 + 가능한 데이터 수집 최대화.

자주 만나는 사고 — 데이터 모델

사고 1: User ID 부정확

원인 — Web 에서는 user.id, iOS 에서는 user.email 박음.

해결모든 환경 같은 normalization. 우리 DB 의 표준 ID 통일.

사고 2: User ID 를 Custom Dimension 으로

원인 — "사용자별 분석 하고 싶어서" User ID 를 Dimension 으로 설정.

해결공식 user_id 만. 별도 Custom Dimension 절대 X (cardinality 폭증).

사고 3: Logout 시 user_id 빈 문자열

원인gtag('set', { user_id: '' }).

해결null 정확히 명시. 빈 문자열 = "" 사용자로 인식.

사고 4: Custom Dimension scope 잘못

원인user_tierEvent scope 로 설정. 사용자 tier 가 event 마다 박혀야 보고서 정확.

해결User scope 사용. tier 변경 시 future event 만 영향.

사고 5: Cardinality 폭증

원인search_query 를 dimension 으로 → 자유 입력 = 무한 unique.

해결카테고리 dimension 만. 자유 입력 = parameter 로만 (BigQuery query 용).

사고 6: PII 누설

원인user_email 을 user property 로.

해결 — 절대 X. 이메일은 hash 또는 별도 시스템.

사고 7: Consent Mode 빠뜨림

원인 — GDPR/KISA (한국 인터넷진흥원) 환경 + Consent Mode 미설정 → 동의 안 받은 사용자도 raw cookie 추적.

해결default = denied 설정 + cookie banner 통합.

사고 8: Cross-domain 미설정

원인 — site-a.com → site-b.com 이동 = 다른 session 인식.

해결Data Stream → cross-domain 에 도메인 list 추가.

사고 9: Session timeout 부적절

원인 — 30분 default 가 우리 비즈니스 와 안 맞음 (예: 긴 video 사이트).

해결Data Stream 설정 에서 timeout 변경 (1~480분).

운영 권장 패턴

Pattern 1: User Identity 표준 설정

// utils/ga.js
export function syncUserToGA(user) {
  // User ID 박기 (PII 아닌 ID)
  gtag('set', { user_id: user.id });

  // User Property 일관
  gtag('set', 'user_properties', {
    user_tier: user.tier,           // 분류 가능 (cardinality 낮음)
    signup_year: user.signupYear,    // 분류 가능
    country: user.country,           // 분류 가능
    language: user.language          // 분류 가능
  });

  // PII 절대 X
  // ✗ gtag('set', 'user_properties', { user_email: user.email });
}

export function clearUserFromGA() {
  gtag('set', { user_id: null });
}

Braze user factory · Statsig user object 와 같은 일관성 패턴.

Pattern 2: Custom Dimension 설계 표준

custom_dimensions:
  user_scope:
    - user_tier         # free / premium / enterprise
    - signup_year       # 2024 / 2025 / 2026
    - country           # KR / JP / US / ...
    - language          # ko / en / ja

  event_scope:
    - article_category  # tech / lifestyle / news
    - article_author    # author name (limited)
    - source_campaign   # marketing campaign ID (controlled)

  item_scope:
    - brand
    - color
    - size

cardinality_rules:
  - 각 dimension 의 unique 값 < 1,000 권장 (50K 한도이지만 안전 마진)
  - 자유 입력 (search query 등) = parameter 로만, dimension X
  - User ID · Session ID · Product ID 절대 dimension X

Pattern 3: Consent Mode 통합

<!-- 1. 페이지 로드 시 default = denied -->
<script>
  gtag('consent', 'default', {
    ad_storage: 'denied',
    analytics_storage: 'denied',
    ad_user_data: 'denied',
    ad_personalization: 'denied'
  });
</script>

<!-- 2. Cookie banner 표시 (Cookiebot 등) -->
<script
  src="https://consent.cookiebot.com/uc.js"
  data-cbid="YOUR-ID"
  type="text/javascript"
  async>
</script>

<!-- 3. 사용자 동의 시 update -->
<script>
  window.addEventListener('CookiebotOnAccept', function() {
    gtag('consent', 'update', {
      analytics_storage: Cookiebot.consent.statistics ? 'granted' : 'denied',
      ad_storage: Cookiebot.consent.marketing ? 'granted' : 'denied'
    });
  });
</script>

GDPR · KISA 준수 + 데이터 수집 최대화.

Pattern 4: 환경별 Property 분리

const PROPERTY_ID = process.env.NODE_ENV === 'production'
  ? 'G-PROD-XXXXX'
  : 'G-DEV-YYYYY';

gtag('config', PROPERTY_ID);

dev/staging/prod 별 별도 GA4 property. production 데이터 오염 방지.

Pattern 5: BigQuery → 깊은 분석

-- High cardinality 데이터 분석 (search query · product_id)
SELECT
    event_name,
    -- raw parameter 직접 조회 (dimension cardinality 제한 회피)
    (SELECT value.string_value FROM UNNEST(event_params)
     WHERE key = 'search_query') AS query,
    COUNT(*) AS searches
FROM `project.analytics_XXXXX.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20260501' AND '20260517'
  AND event_name = 'search'
GROUP BY 1, 2
ORDER BY searches DESC
LIMIT 100

GA4 dashboard 의 50K cardinality 한도 회피. raw event 직접 query.

시험 직전 한 번 더 — GA4 데이터 모델 함정 압축 노트

User 식별 3 Layer

  • Client ID — cookie 기반 (브라우저 단위, 자동)
  • User ID — 우리 시스템 로그인 ID (cross-device)
  • Google Signal — Google 계정 로그인 + 광고 동의 (자동 cross-device)
  • 3 layer 결합 = 가장 강력한 통합 추적

User ID 함정 4종

  • Custom Dimension 으로 박지 X (cardinality 폭증)
  • 로그아웃 시 null 정확히 (빈 문자열·"null" 문자열 X)
  • PII 박지 X (이메일·전화 X, hash 만)
  • 모든 환경 같은 normalization (Web · iOS · Android 통일)

Google Signal

  • console → Property settings → Data settings 에서 활성
  • 광고 ROI 정확도 ↑ · demographic 데이터

Session 정의

  • 30분 timeout (변경 가능 1~480분)
  • 자정 reset (timezone 기준)
  • UTM 변경 = 새 session (옵션)
  • Cross-domain = 명시 설정
  • UA 시대 보고서와 직접 비교 X (정의 다름)

Engaged Session

  • 10초+ 지속 OR 2 page+ OR conversion
  • GA4 의 진짜 engagement 측정
  • Bounce rate = (전체 - engaged) / 전체

Event Parameter 한도

  • event 1개 = parameter 최대 25개
  • parameter name 40자 · value 100자
  • User Property = 25개 · name 24자 · value 36자
  • Event Name = 40자
  • 초과 시 자동 절단

Custom Dimension / Metric — 3 Scope

  • Event scope = event 별 (article_category · search_query)
  • User scope = 사용자 전체 (tier · signup_year)
  • Item scope = 상품 array (brand · color · size)
  • 한도 = Event 50 · User 25 · Item 10
  • Scope 잘못 = 회복 어려움 (User → Event 불가)

Cardinality 함정

  • dimension unique 값 < 50K 권장
  • 초과 = "(other)" 통합 · 분석 정확도 ↓
  • user_id · session_id · product_id 절대 dimension X
  • 자유 입력 (search · URL) = parameter 로만
  • BigQuery 에서 raw query 가능

Recommended Event 표준 Parameter

  • e-commerce: transaction_id · value · currency · items[] (brand · color · size)
  • 표준 사용 = 자동 보고서 풍부

PII 정책

  • 절대 X = email · phone · 주민번호 · 신용카드 · 정확 위치 · IP
  • Hash 도 unique 식별 가능 = PII 여전
  • 위반 = property 정지 · GDPR 벌금
  • IP anonymization = GA4 자동 (UA 시대 옵션이었음)

Consent Mode (cookieless 미래)

  • Cookie 의 종말 (Safari · Firefox · Chrome Privacy Sandbox · GDPR)
  • default = denied (page load 즉시)
  • update = granted (cookie banner 동의 후)
  • denied 사용자도 cookieless ping + modeling 추정
  • ad_storage · analytics_storage · ad_user_data · ad_personalization 4 동의

사고

  • User ID 부정확 (normalization 불일치)
  • User ID 를 Custom Dimension 으로 (cardinality 폭증)
  • Logout 시 빈 문자열 (null 정확히)
  • Custom Dimension scope 잘못 (Event vs User vs Item)
  • Cardinality 폭증 (자유 입력 dimension)
  • PII 누설 (이메일 박기)
  • Consent Mode 빠뜨림 (GDPR 위반)
  • Cross-domain 미설정
  • Session timeout 부적절

운영 패턴

  • User Identity 표준 함수 (PII 회피 + 일관)
  • Custom Dimension 설계 표준 (scope · cardinality 룰)
  • Consent Mode 통합 (default denied → 동의 후 update)
  • 환경별 Property 분리 (dev/staging/prod)
  • BigQuery 로 high cardinality raw query

공식 문서: GA4 User ID · Event Parameters 에서 원문을 확인할 수 있어요.

시리즈 다른 편 (앞뒤 글 모음)

이전 글:

다음 글:

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

답글 남기기

error: Content is protected !!