UiPlatform의 중앙 로그인 위임 접근
UiPlatform는 공통 UI 릴리스·포털 배포 현황을 표시하고 승인·적용 요청을 실행하는 독립 관리 화면이다. 이 기능은 PortalConsole가 소유한 배포 원장에 접근하지만, UiPlatform 배포 런타임에 포털 API Key를 장기 보관하지 않는다.
책임과 인증 흐름
| 구간 | 주체 | 책임 | 인증 방식 |
|---|---|---|---|
| 포털 등록과 관리자 지정 | PortalConsole 관리자 설정 | ui-center의 허용 callback URL과 UiPlatform 관리자를 등록한다. | 중앙 관리자 설정 |
| 사용자 로그인 | PortalConsole | UiPlatform에 로그인한 사용자가 ui-center 포털 관리자임을 확인한다. | PKCE 기반 중앙 로그인 |
| 상태 조회와 변경 요청 | UiPlatform 서버 | 로그인 세션에 결속된 짧은 수명의 위임 토큰을 PortalConsole에 전달한다. | 사용자 위임 JWT |
| 권한 최종 판정 | PortalConsole | 위임 토큰의 포털 ID, 관리자 claim, ui:read·ui:write scope를 검증한다. | PortalConsole 권한 미들웨어 |
UiPlatform는 PortalConsole가 발급한 사용자 위임 토큰을 사용자 세션 동안에만 서버 측에서 전달한다. 배포 환경 변수에 장기
PORTAL_CONSOLE_PORTAL_API_KEY를 넣지 않으며, 토큰 원문을 클라이언트나 로그에 노출하지 않는다.
운영 절차
PortalConsole 관리자 화면의 포털 연동 설정에서 ui-center의 기본 URL과 callback URL을 등록하고, 사용자 관리 → 사용자 선택 → 포털 관리자 매핑에서 UiPlatform를 사용할 운영자를 해당 포털의 관리자로 지정한다. 이후 운영자는 UiPlatform의 중앙 로그인으로 접근하며, 등록과 권한 변경은 PortalConsole 관리자 설정에서만 수행한다. UiPlatform의 운영 배포 상태나 개별 배포 환경 변수 변경은 이 접근 권한의 등록·회수 절차에 포함되지 않는다.
| 관리 항목 | 중앙 관리 위치 | 적용 규칙 |
|---|---|---|
| 서비스 URL·callback URL | 포털 연동 설정 | portalId와 clientId는 모두 ui-center, 운영 callback은 https://ui-center.배포 도메인/auth/callback이다. |
| 운영자 위임 정책 | 사용자 관리의 포털 관리자 매핑 | UiPlatform로 체크된 사용자에게만 로그인 토큰의 portalAdmin claim이 부여된다. |
| 허용 scope | PortalConsole 권한 정책 | UiPlatform 관리자 토큰은 고정된 최소 권한 ui:read, ui:write만 받는다. 관리자가 임의 scope를 입력하거나 확대할 수 없다. |
| 배포 대상 | UiPlatform의 포털 적용 작업대 | 중앙 로그인 후 승인된 운영자가 구독된 포털만 선택해 적용 요청을 만든다. |
이전의
PORTAL_CONSOLE_PORTAL_API_KEY전달 방식은 폐기됐다. 관리형 클라우드에 해당 값을 저장하거나 PortalConsole의 자격 증명 배포 화면에서 UiPlatform용 장기 키를 발급하지 않는다. 기존GITHUB_PACKAGES_TOKEN은 GitHub 비공개 패키지 메타데이터 조회 용도이므로 PortalConsole 위임 권한과는 별개다.
GitHub Packages 메타데이터는 별도의 GitHub 조회 자격증명에 의해 보호될 수 있다. 본 전환은 PortalConsole 릴리스·배포 원장에 접근하기 위한 PORTAL_CONSOLE_PORTAL_API_KEY 의존성을 제거하는 범위이며, GitHub 비공개 패키지 접근 정책은 별도 중앙화 대상으로 관리한다.
공유 세션(SSO)
UiPlatform는 자체 세션 쿠키 ui_center_directory_session을 유지하면서, PortalConsole가 남기는 공유 쿠키 directory.sso.session을 함께 사용한다. 쿠키 스코프에는 포트가 없으므로 같은 호스트의 다른 포트에서 실행되는 앱은 이 쿠키를 서버에서 그대로 읽는다.
| 동작 | 구현 | 결과 |
|---|---|---|
| 중앙 로그인 시작 | GET /api/auth/login → PortalConsole /connect/authorize | 공유 세션이 남아 있으면 PortalConsole가 비밀번호 폼 없이 인가 코드를 발급한다 |
| 앱 세션 | /auth/callback → ui_center_directory_session (8시간, HttpOnly) | 이후 화면과 tRPC는 이 세션만 사용한다 |
| 단일 로그아웃 수신 | GET /auth/end-session | PortalConsole 콘솔이 로그아웃할 때 브라우저가 호출해 UiPlatform 세션을 지운다 |
| 앱 로그아웃 | auth.logout | UiPlatform 세션과 공유 세션을 함께 지워, 로그아웃 직후 자동 로그인으로 되돌아가지 않게 한다 |
공유 세션은 PortalConsole 오리진의 쿠키이므로, 호스트가 다른 배포에서는 UiPlatform 로그아웃이 그 쿠키를 지울 수 없다. 이때는 PortalConsole 콘솔의 로그아웃(공유 쿠키 삭제 + 등록된 포털의
/auth/end-session호출)이 단일 로그아웃의 기준이다. 호스트를 공유하는 로컬 개발 스택에서는 양쪽 모두 즉시 동작한다.