> ## Documentation Index
> Fetch the complete documentation index at: https://docs.marketplace.bsggo.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 관리자 콘솔

> 포털 브랜딩, 인증 방식, 사용자, 라이센스, 커스텀 도메인을 관리합니다.

## 개요

관리자 콘솔은 포털(뷰어 SPA)의 설정을 AWS 콘솔 없이 웹 UI로 관리할 수 있는 별도의 SPA입니다.
포털 헤더 우측의 **"관리자"** 링크를 통해 접근하며, 경로는 `/admin` 입니다.

## 접근 권한

* 설치 시 입력한 **관리자 이메일**이 Cognito `admin` 그룹에 자동으로 등록되어 있습니다.
* 관리자 콘솔은 **이메일/비밀번호 로그인 고정**입니다 (Google OAuth, SSO는 뷰어 로그인에만 적용됩니다).
* 다른 사용자를 관리자로 추가하는 기능은 현재 제공되지 않습니다 (초기 1명).

<Info>
  관리자 이메일 외 사용자가 `/admin`에 접근하면 **접근 거부** 화면이 표시됩니다.
</Info>

## 메뉴

관리자 콘솔 사이드바에는 5개 메뉴가 있습니다.

### 1. 브랜딩

| 항목       | 설명                                                   |
| -------- | ---------------------------------------------------- |
| 로고 업로드   | PNG / JPG / SVG, 최대 1MB. 업로드 즉시 포털 헤더에 반영            |
| 제품 표시 이름 | 헤더와 로그인 화면에 표시되는 이름 (예: `ACME Compliance Dashboard`) |

업로드한 로고와 표시 이름은 포털을 여는 모든 사용자에게 공통 적용됩니다.

### 2. 인증 설정

**포털 뷰어(`/`)** 로그인 방식을 설정합니다. 관리자 콘솔(`/admin`)에는 영향을 주지 않습니다.

#### 이메일 / 비밀번호 (기본 활성)

| 항목           | 설명                                                                    |
| ------------ | --------------------------------------------------------------------- |
| 신규 이메일 가입 허용 | 해제 시 신규 self-signup만 차단되며, 기존 사용자 로그인과 관리자 초대(AdminCreateUser)는 영향 없음 |
| 허용 이메일 도메인   | 비워두면 모든 도메인 허용. 쉼표로 여러 개 지정 가능 (예: `customer.com, partner.com`)       |

#### Google 로그인

Client ID와 Client Secret을 모두 저장하면 포털 로그인 화면에 **"Google로 로그인"** 버튼이 추가됩니다.

**사전 준비:**

1. [Google Cloud Console](https://console.cloud.google.com/) → Google Auth Platform → 앱 정보 입력 (대상: **내부**)
2. OAuth 2.0 클라이언트 ID 생성 (애플리케이션 유형: **웹 애플리케이션**)
3. 관리자 콘솔 화면에 안내되는 **승인된 리디렉션 URI**를 복사하여 OAuth 클라이언트에 등록
4. 발급받은 Client ID / Client Secret을 관리자 콘솔에 입력 → 저장

<Tip>
  Google Workspace 계정만 허용하려면 OAuth 동의 화면을 **내부**로 설정하세요.
</Tip>

### 3. 사용자

Cognito 기준 포털 사용자 목록을 관리합니다.

| 컬럼    | 설명                                                      |
| ----- | ------------------------------------------------------- |
| 이메일   | 사용자 이메일 (본인은 `(본인)` 표시)                                 |
| 그룹    | `admin` 또는 `viewer`                                     |
| QS 연결 | QuickSight Reader 등록 여부 (✓ / —)                         |
| 가입일   | Cognito 등록일                                             |
| 상태    | Cognito 사용자 상태 (`CONFIRMED`, `FORCE_CHANGE_PASSWORD` 등) |

**삭제** 버튼으로 사용자를 제거할 수 있습니다 (본인 제외). 삭제 시 Cognito 계정과 QuickSight Reader 등록이 함께 정리됩니다.

### 4. 라이센스

AWS Marketplace 라이센스 상태와 제품 버전을 확인합니다.

| 항목      | 설명                                      |
| ------- | --------------------------------------- |
| 라이센스 상태 | `정상`, `활성화 대기`, `만료`, `일시 정지` 등         |
| 자동 갱신   | Marketplace 구독의 자동 갱신 설정 (`ON` / `OFF`) |
| 만료일     | 만료 예정일과 남은 일수                           |
| 제품 버전   | 현재 배포된 제품 버전 (예: `v0.4.0`)              |

<Warning>
  라이센스가 만료되면 포털 접근이 차단됩니다. 만료 전에 AWS Marketplace에서 구독 상태를 확인하세요.
</Warning>

### 5. 커스텀 도메인

포털 접속용 자체 도메인(예: `dashboard.customer.com`)을 등록합니다. 등록 전까지는 기본 CloudFront 엔드포인트(`https://xxxxx.cloudfront.net`)로 접속합니다.

#### 등록 절차

1. 관리자 콘솔 → 커스텀 도메인 → 도메인 입력 → **등록 시작**
2. 화면에 표시되는 **CNAME 3개**를 자체 DNS에 추가
   * **ACM 인증서 검증용 CNAME 2개** (영구 유지 필요)
   * **사이트 접속용 CNAME 1개**
3. ACM이 자동으로 DNS 검증을 수행 (보통 5\~10분)
4. 검증 완료 후 상태가 `ISSUED`로 바뀌고 HTTPS 접속 가능

#### 상태 표시

| 상태                            | 의미                                 |
| ----------------------------- | ---------------------------------- |
| `검증 대기` (PENDING\_VALIDATION) | DNS CNAME 등록 후 ACM 검증 대기 중         |
| `발급 완료` (ISSUED)              | 인증서 발급 + CloudFront 부착 완료 — 접속 가능  |
| `실패` / `만료`                   | 도메인 제거 후 재등록하거나 AWS 콘솔에서 ACM 점검 필요 |

<Info>
  **상태 새로고침** 버튼으로 검증 진행 상태를 확인할 수 있습니다.
  도메인을 변경하려면 기존 도메인을 제거한 뒤 새로 등록하세요.
</Info>

## 변경 사항 적용 시점

| 항목              | 적용 시점                          |
| --------------- | ------------------------------ |
| 브랜딩 (로고, 표시 이름) | 즉시 (CloudFront 캐시 max-age 60초) |
| 인증 설정           | 즉시                             |
| 사용자 삭제          | 즉시                             |
| 커스텀 도메인         | DNS 검증 완료 후 (보통 5\~10분)        |
