<!-- canonical: https://docs.axelabs.ai/partner/handoff -->
<!-- source: content/partner/handoff.mdx -->

---
title: 운영자에게 넘길 값
description: JSON pack (Option A 출력물) 또는 8 개 값 (Option B 수작업) 회신 + 안전 채널.
---

# 운영자에게 넘길 값

[Microsoft Entra ID 앱 등록](/partner/registration) + [DNS 준비](/partner/domain-prep) 완료 후, **귀사 IT 가 채택한 옵션에 따라** 운영자 (`ai@axellc.com`) 에게 전달합니다.

| 옵션 | 회신 형식 | 채널 |
|---|---|---|
| **Option A (CLI 1줄, 권장)** | `axelabs-bootstrap-{customer}.json` 파일 1 개 | 1Password Send / Bitwarden Send (view-once) |
| **Option B (portal 수작업)** | 아래 [텍스트 템플릿](#option-b--텍스트-템플릿) 8 개 값 | 동일 안전 채널 (한 메시지에 통합) |

운영자가 ingest 완료 후 알림 보내드리면, 안전 채널 메시지를 즉시 삭제해 주세요.

## ⚠️ 구 docs 폐기 안내

이전 버전 (`realchoice_entra_id_setup_v2.md` 등) 은 **Mobile/desktop platform + `http://localhost` + secret 없음** 모델 기반이었습니다. 본 가이드 (registration.mdx 신모델) 가 정본 — **Web platform + 도메인 검증된 App ID URI + `mcp.access` scope + client_secret 발급**.

구 docs 가 검색에 잡히면 무시하시고 본 페이지 + [registration](/partner/registration) + [domain-prep](/partner/domain-prep) 만 따라주세요.

---

## Option A — JSON pack 회신 (권장)

[registration §Option A](/partner/registration#option-a--cli-1-줄-권장) 의 `axelabs-bootstrap.sh` 가 만든 파일:

```
axelabs-bootstrap-<customer_id>.json
```

이 파일을 **수정하지 말고 그대로** 첨부 (1Password Send / Bitwarden Send 의 file attachment). 안에 8 개 값 + scope/redirect_uri/application_id_uri 모두 포함되어 운영자가 `axe customer ingest <customer> <file>` 으로 1 줄에 vault push + customers.yaml 갱신.

스키마 (`axelabs-bootstrap/v1`) 예시:

```json
{
  "schema": "axelabs-bootstrap/v1",
  "customer": "realchoice",
  "public_domain": "realchoice.axelabs.ai",
  "tenant_id": "00000000-0000-0000-0000-000000000000",
  "generated_by": "it.admin@realchoice.co.kr",
  "apps": {
    "blueprint":   { "client_id": "...", "client_secret": "..." },
    "vaultwarden": { "client_id": "...", "client_secret": "..." },
    "frame_mcp": {
      "client_id": "...",
      "client_secret": "...",
      "application_id_uri": "https://realchoice.axelabs.ai/frame/mcp",
      "scope": "mcp.access",
      "redirect_uris": [
        "https://claude.ai/api/mcp/auth_callback",
        "https://claude.com/api/mcp/auth_callback"
      ]
    }
  }
}
```

추가로 한 줄 회신 (메일 본문 — secret 없음):

```
Option A 로 axelabs-bootstrap-realchoice.json 생성 완료.
첨부는 [Bitwarden Send link, view-once 1 회 + 24h 만료] 입니다.
ADMIN_EMAIL:  admin@realchoice.co.kr
SENDER_EMAIL: it.admin@realchoice.co.kr
— 리얼초이스 IT
```

`ADMIN_EMAIL` (첫 Blueprint admin) 과 `SENDER_EMAIL` (회신자) 은 JSON pack 에 없는 메타 — 메일 본문에 추가.

---

## Option B — 텍스트 템플릿 (수작업 시)

```
TENANT_ID:                  <Directory (tenant) ID>

BLUEPRINT_CLIENT_ID:        <App #1 Application (client) ID>
BLUEPRINT_CLIENT_SECRET:    <App #1 Client secret VALUE>

VAULTWARDEN_CLIENT_ID:      <App #2 Application (client) ID>
VAULTWARDEN_CLIENT_SECRET:  <App #2 Client secret VALUE>

FRAME_MCP_CLIENT_ID:        <App #3 Application (client) ID>
FRAME_MCP_CLIENT_SECRET:    <App #3 Client secret VALUE>

ADMIN_EMAIL:                <첫 Blueprint admin 으로 지정할 사용자 메일>
SENDER_EMAIL:               <회신 보낸 분 메일 (확인 회신용)>
```

## 안전 채널 권장 (필수)

`*_CLIENT_SECRET` 평문은 다음 경로 **금지**:

- ❌ 일반 이메일 (백업·archiving 영구 보관)
- ❌ Slack/Teams 채팅 (스레드 영구)
- ❌ 첨부 파일 (메일 서버 캐시)

권장:

- ✅ **1Password Send** (view-once 옵션 활성화)
- ✅ **Bitwarden Send** (만료 + view-once)
- ✅ 회사 SSO 보호된 보안 메신저
- ✅ 직접 대면 / 음성 통화

운영자가 Keychain push 완료 통지를 보낸 직후, 안전 채널 메시지를 삭제하시기 바랍니다.

## CLIENT_ID 는 평문 무방

`*_CLIENT_ID` 는 GUID 식별자로 비밀이 아닙니다. 이메일 평문 전송 가능. SECRET 만 안전 채널.

## 운영자 측 처리

운영자가 회신 받은 후 ([customer-onboarding D-day TLDR](/ops/runbook/customer-onboarding#d-day-tldr--운영자-수동-touchpoints) 참조):

| 작업 | 명령 (2026-05-23 시점) | 시점 |
|---|---|---|
| 1. customers.yaml 에 client_id + tenant_id 채워넣기 + services 슬롯 등재 | 현재 수동 ([B-onboard-customers-add](/ops/backlog) 자동화 예정) | 회신 즉시 |
| 2. 3 개 client_secret → Vaultwarden push | `axe secret push AZURE_..._CLIENT_SECRET --service {svc} --customer {customer}` × 3 | 회신 즉시 |
| 3. Cloudflare tunnel + frame stack 부트 | `axe onboard {customer} --apply` | 회신 당일 |
| 4. Blueprint stack 부트 | `axe deploy blueprint {customer} --apply` | 회신 당일 |
| 5. 첫 로그인 검증 + admin 권한 부여 | Blueprint 첫 SSO 로그인 후 `UPDATE User SET role='admin' WHERE email='...'` | 1일 내 |
| 6. 직원 onboarding 가이드 전달 | [신규 직원 onboarding](/onboard) URL | 1일 내 |

## 기존 Vaultwarden 운영 중인 경우

귀사가 이미 Vaultwarden / Timshel fork 를 운영 중이고 그것을 유지하기로 결정 시 — axec stack 의 신규 `axe-vaultwarden` 신설을 skip 하고 기존 vault 에 OIDC SSO 만 추가합니다. 절차는 [배포 협의 §Vault OIDC SSO 통합](/partner/deploy#vault-oidc-sso-통합--기존-vaultwarden-운영-중인-customer-용) 참조 (11 key env + 4-block + view-once secret 전달).

## 만료·회전 정책

| Secret | 기본 만료 | 회전 시점 |
|---|---|---|
| Blueprint | 180일 | 만료 30일 전 |
| Vaultwarden | 180일 | 만료 30일 전 |
| Frame MCP | 24개월 | 만료 60일 전 |

만료 30일 전 운영자가 귀사 IT 에게 새 secret 요청 → 받아서 swap. 직원 측은 영향 없음 (claude.ai 측 캐시 자동 갱신).

## 신규 직원 추가 시

배포 후 신규 직원 (entity 권한) 추가:

1. 귀사 측 Microsoft 365 에서 회사 메일 발급 + tenant 활성 사용자 등록
2. 운영자에게 알림:
   ```
   신규 직원: firstname.lastname@{customer}.com
   업무: 회계
   필요 권한: axec read+write
   ```
3. 운영자가 `customers.yaml > user_entity_map` 에 추가 + 컨테이너 재기동

추가 후 직원은 [신규 직원 온보딩](/onboard) 따라 본인 setup.

## 퇴사 시

1. 귀사 측 Microsoft 365 에서 사용자 비활성 (그것만으로도 모든 access 차단됨 — Entra ID 측 검증 통과 못 함)
2. 운영자에게 알림 → `user_entity_map` 에서 제거 + 마지막 활동 audit log 보관
