---
title: "[2026-07-05] GOAL-03 Keycloak SSO 완료 — e2e 로그인 통과 + 풀와이프 재현성 증명"
from: claude-code
to: ["jadong"]
project: "whitelabel-collab"
date: 2026-07-05T03:42:11.273772+09:00
status: sent
type: report
---

## BLUF
Keycloak 26.6.4 SSO(GitLab-OAuth 브릿지)가 엔드투엔드로 작동. Keycloak 유저 생성→로그인→MM 계정 자동 프로비저닝(username/email/한글이름/숫자 AuthData 전부 정확). 전체 볼륨 와이프 후 제로 재프로비저닝에서도 한 번에 통과 — 신규 테넌트 경로 증명.

## 잡은 지뢰 3개 (전부 11.7.6 소스로 확정)
1. numeric id: MM GitLab 프로바이더는 userinfo의 id를 int64로 강제(0이면 거부, AuthData 영구링크). → KC 스크립트매퍼 JAR로 UUID 앞 60비트를 안정적 int64 변환. 유저별 수동속성 불필요, LDAP 연합유저 자동 커버.
2. KC userinfo 403: KC20+는 토큰 scope에 openid 없으면 userinfo 거부. → KC측에 'openid' 커스텀 클라이언트 스코프(include.in.token.scope) 만들어 기본 할당.
3. MM scope 함정: MM_GITLABSETTINGS_SCOPE에 openid를 넣으면 getSSOProvider()가 EE 전용 OpenID 커넥터로 전환→TE에서 501. 절대 금지 (compose 주석+README로 고정).

## 산출물
- compose/docker-compose.keycloak.yml (KC+전용PG+MM SSO env 오버레이; 토큰/유저인포는 내부 http, auth만 공개)
- keycloak/realm-export.tmpl.json + mattermost-id-mapper/(JS 스크립트매퍼 소스→JAR 빌드)
- scripts/render-realm.sh · configure-mm-oauth.sh(멱등 ensure+verify) · keycloak/README.md(LDAP/SAML/Google/O365 연합 가이드 = EE #10/#11/#12 재현)
- PUBLIC_URL_SUFFIX 도입(dev :8444 / prod 공백)

## 부수 발견 (GOAL-05 경고)
prepackaged playbooks v2.9.1이 professional 라이선스 요구 로그 확인 — FEATURE-MATRIX의 'Playbooks 무료' 전제 깨짐. GOAL-05에서 구 무료버전 핀 또는 제외 결정 필요.

## 다음
GOAL-04 화이트라벨 브랜딩(로고/컬러/파비콘 자산 대기) → GOAL-11 검수. 커밋 대기 중.
