본문으로 건너뛰기

CrossDomainSsoUser

일반 사용자용 다도메인 SSO를 broker/client 구조로 제공하는 플러그인입니다. 엄격한 subject 계약, 명시적 사전 연결, fail-closed 준비도 게이트를 적용합니다.

상태​

항목값
Layercore
TierL1
Statuswip
Version0.4.0
가격Free
카테고리Security & Auth

P0 producer 보안 강화는 완료됐습니다. 그러나 소비 프로젝트 wiring, 지정 migration, secret 배치, identity pre-link, runtime 활성화와 운영 smoke test는 아직 실행하지 않았으며 별도 Gate C 승인이 필요합니다. 기본 상태는 OFF입니다.

역할 구분​

CrossDomainSsoUser는 여러 MSK 서비스의 일반 사용자 로그인을 연결합니다.

  • ExternalSsoModule: MSK에서 외부 OSS로 진입하는 SSO 어댑터
  • ADR-040 Cross-Domain SSO: Platform Admin의 관리 도메인 이동
  • CrossDomainSsoUser: broker가 외부 subject를 증명하고 각 client가 자기 로컬 계정을 결정하는 일반 사용자 흐름

broker는 SSO 운영 데이터만 보유합니다. 사용자 마스터와 권한은 각 client SaaS가 계속 소유하며, broker의 사용자 ID나 권한을 client 계정으로 신뢰하지 않습니다.

P0 wire contract​

broker의 token 응답은 아래 다섯 필드만 허용합니다. 누락 필드뿐 아니라 추가 필드도 거부합니다.

{
"contract_version": 1,
"provider_key": "opaque-provider-key",
"subject": "opaque-provider-subject",
"client_id": 42,
"issued_at": 1700000000
}
  • provider_key는 provider 생성 후 변경할 수 없는 안정 키입니다.
  • subject는 provider가 부여한 불투명 식별자이며 로그와 진단 출력에는 원문을 남기지 않습니다.
  • broker DB의 user ID, email, name, role, level, permission은 전송하지 않습니다.
  • client는 미리 명시적으로 연결한 active (provider_key, subject) 1건만 로컬 사용자로 투영합니다.
  • email 일치, prompt link, JIT 계정 생성, 숫자 provider fallback은 P0 callback 경로에서 사용하지 않습니다.

인증 흐름​

  1. client /sso/start가 256-bit client state를 생성합니다.
  2. broker /sso/authorize가 등록된 callback과 정확히 일치하는지 확인하고 별도의 upstream state를 생성합니다.
  3. provider callback이 upstream state를 한 번 소비하고 v1 assertion을 담은 1회용 authorization code를 발급합니다.
  4. client callback이 자기 client state를 한 번 소비합니다.
  5. server-to-server token 교환이 32-byte 이상 client secret을 검증한 뒤 code를 소비합니다.
  6. client가 stable pre-link와 로컬 사용자 활성 상태, Tenant/SaaS 경계를 검증한 후 세션을 재생성합니다.

client state와 broker upstream state는 서로 대체할 수 없습니다. 각 state/code는 payload 삭제 동작에 의존하지 않는 consumed marker로 단 한 요청만 성공하도록 처리합니다.

보안 기본값​

항목정책
Callback등록된 HTTPS 절대 URL과 exact match; prefix, wildcard, userinfo, fragment 거부
Client secretbroker/client 모두 32-byte 이상 필수; 빈 값과 짧은 값은 fail-closed
계정 연결운영자가 dry-run 결과를 확인한 뒤 명시적으로 pre-link
준비도sso:doctor와 HTTP runtime이 같은 read-only 정책 사용
원격 probe기본 OFF; 별도 승인으로 양쪽에서 켠 경우 HMAC probe만 허용
정보 최소화assertion, 진단, 로그에 PII·로컬 user ID·권한·secret 미노출

준비 조건이 하나라도 충족되지 않으면 doctor가 실패하고 SSO HTTP 경로도 503으로 닫힙니다. 설정 화면의 enabled 저장만으로는 활성화되지 않습니다.

운영 활성화 개요​

Gate C 승인 후에도 다음 순서를 지켜 단계적으로 활성화해야 합니다.

  1. broker/client wiring과 pending migration 범위를 다시 확인합니다.
  2. additive migration을 지정 경로로 검토하고 적용합니다.
  3. 양쪽 secret store에 같은 32-byte 이상 secret을 배치합니다.
  4. sso:identity:link dry-run 결과를 검토한 뒤 승인된 계정 1건만 --confirm합니다.
  5. broker와 client에서 php artisan sso:doctor를 통과시킵니다.
  6. broker만 먼저 ON하고, 필요 시 별도 opt-in HMAC probe를 확인합니다.
  7. client를 ON한 뒤 정상·오류·replay 시나리오와 기존 비밀번호 로그인을 검증합니다.

문제가 있으면 client와 broker를 다시 OFF합니다. additive schema와 pre-link row를 즉시 삭제할 필요는 없으며 기존 비밀번호 로그인은 유지됩니다.

선택 provider adapter​

Internal provider는 기본 계약을 제공합니다. SAML, OIDC, Social OAuth adapter는 선택 사항이며 관련 package는 기본 배포 의존성이 아닙니다. 설치가 필요하면 소스·전이 의존성·라이선스를 먼저 점검하고 운영자 승인을 받아야 합니다. P0 보안 강화에서는 새 외부 package를 설치하지 않았습니다.

라이선스​

MIT


🛒 Plugin Store에서 보기: store.codebase.how/plugins/cross-domain-sso-user