# 금고 — 키·서류를 넣어 두고 꺼낼 때 승인하기

Android 업로드 키, APNs 키, FCM 서비스 계정, 사업 서류처럼 내 컴퓨터로 꺼내 써야 하는 것은 웹 메뉴 **금고**에 넣어 둬요. 에이전트가 꺼내 쓸 때마다 브라우저나 폰으로 승인 요청이 오고, 내가 승인해야만 꺼내져요. 꺼낸 파일은 명령이 끝나면 바로 지워져요.

**금고** 화면엔 위에서부터 승인을 기다리는 요청(있을 때만), **키·서류**, **승인 방법**(패스키·PIN·복구 코드·폰 알림), **에이전트가 하기 전에 나한테 물을 일**이 있어요. allob 이 내 대신 쓰는 [외부 서비스 연결](/docs/connections)은 메뉴 **연결**에 따로 있어요. 제품에만 쓰는 키(예: "Android 업로드 키")는 제품의 **연결** 탭에서, 사업 서류는 **내 사업**의 등록 서류에서도 바로 넣어요.

![금고 화면 — 승인을 기다리는 요청, 넣어 둔 키(제품·사업 공용)와 사업 서류, 승인 방법(패스키·PIN·복구 코드·폰 알림), 에이전트가 하기 전에 물을 일](/docs/img/vault.png)

## 에이전트에게 맡기기

:::prompt
이 프로젝트에서 서명 키·APNs 키 같은 비밀 파일은 allob 금고로만 써 줘.
필요할 때는 allob vault use <항목> -- <명령> 으로 꺼내 쓰고, 종료 코드 75가 나오면(마지막 줄이 "allob: waiting for approval") 나에게 주소와 짝 글자를 보여 준 뒤 멈추지 말고 바로 --approval 로 다시 실행해 줘(다시 실행하면 내가 승인할 때까지 또 기다려).
새로 만든 키는 바로 allob vault add 로 넣고, 원본 파일을 지울지는 나에게 먼저 물어봐 줘. 꺼낸 값이나 임시 파일은 출력하거나 복사하지 마.
:::

## 금고 만들기

처음 키·서류를 넣기 전에 한 번, **금고**(또는 제품 연결 탭·내 사업의 등록 서류)에서 "금고 만들기"를 눌러요. PIN 과 패스키로 금고를 잠가요.

1. PIN 6자리를 두 번 입력해요.
2. 복구 코드 25자가 한 번만 보여요. 안전한 곳에 적어 두세요. PIN 과 패스키를 모두 잃었을 때 이 코드로만 열 수 있어요.
3. "Touch ID 등록"을 누르면 다음부터 PIN 대신 지문·얼굴로 확인해요. 단추 이름은 기기에 맞게 나와요(아이폰·아이패드는 Face ID, 맥은 Touch ID, 윈도는 Windows Hello, 안드로이드는 지문·얼굴). 패스키로 금고를 열 수 없는 기기라면 PIN 으로 확인해요.

금고 만들기는 이 브라우저에서 해요. allob 서버에는 공개 키와, PIN·패스키·복구 코드로 감싼 열쇠만 가요.

## 넣기

**금고**의 키·서류에서 "추가"를 누르거나, 내 사업의 등록 서류에서 "올리기"를 눌러요(그 종류가 골라져 있어요). 종류·파일·비밀번호를 넣거나, 터미널에서 넣어요.

```sh
allob vault add android.upload-keystore --file upload-keystore.jks --product diary
```

키 비밀번호 같은 값은 터미널이 가려서 물어봐요. 넣는 값은 그 자리(브라우저나 내 컴퓨터)에서 암호화해서 올려요. 넣을 때는 PIN 이 필요 없어요.

목록에 없는 사업 서류(예: 위치기반서비스사업 신고확인증)는 **기타 사업 서류**로 골라 서류 이름을 붙여 넣어요. 여러 개 넣어도 이름으로 구분돼요.

```sh
allob vault add biz.other --file lbs-report.pdf --field name="위치기반서비스사업 신고확인증"
```

사업 서류는 암호화하기 전에 파일 이름과 글자에서 주민등록번호 모양을 찾고, 찾으면 넣지 않아요. 다만 모든 PDF 의 글자를 읽지는 못해요. 발급할 때 주민번호 뒷자리를 비공개로 받아 주세요. 그림 파일은 사람이 "신분증이 아니에요"를 확인해야 넣을 수 있어요(화면, 또는 터미널에서 직접). 신분증은 넣을 수 없어요.

## 값 바꾸기

키를 새로 발급받았거나 서류를 다시 떼었으면 지우고 다시 넣지 않고 바꿔요. **금고**의 키·서류에서 그 항목의 "바꾸기"(사업 서류는 등록 서류의 "바꾸기")를 눌러 새 파일을 넣어요. 같은 항목에 새 버전으로 들어가서, 그 키를 쓰던 할 일·제품은 그대로예요.

```bash
allob vault replace android.upload-keystore --file new-upload-keystore.jks
```

바꾸면 지금 값은 지워지고 되돌릴 수 없어요. 그래서 터미널에서 바꿀 땐 지울 때처럼 브라우저에서 내가 한 번 승인해야 해요. 승인한 뒤에 새 파일을 암호화해서 올려요. 금고를 열어 둔 동안이면 바꾼 항목은 그 열어 둔 금고로 다시 꺼내지 못해요. 새로 꺼낼 때 다시 확인해요.

## 꺼내 쓰기

```sh
allob vault use android.upload-keystore -- ./gradlew bundleRelease
```

1. 터미널이 브라우저로 승인 화면을 열고, 짝 글자 6자를 보여 줘요. allob 폰 앱에서 알림을 켜 뒀으면 폰으로도 와요.
2. 화면에서 누가·무엇을·왜·얼마나 꺼내는지 보고, 짝 글자가 터미널과 같으면 "꺼내 주기"를 눌러요. Touch ID(없으면 PIN)로 확인해요. 폰 앱에서 승인할 수도 있어요(아래 "폰 앱에서 승인하기").
3. 명령이 도는 동안만 파일이 있어요. 파일 경로는 `ALLOB_ANDROID_UPLOAD_KEYSTORE_FILE`, 비밀번호는 `ALLOB_ANDROID_UPLOAD_KEYSTORE_STORE_PASSWORD` 같은 환경 변수로 넘어가요. 명령이 끝나면(실패나 Ctrl+C 도) 파일을 지워요.

명령 출력에 비밀번호와 같은 글자가 나오면 `[allob:hidden]` 으로 가려요. 다만 바꿔 쓴 값까지 잡지는 못해요. Gradle 처럼 데몬을 띄우는 명령은 `./gradlew --no-daemon bundleRelease` 로 실행해 주세요. 데몬이 남아 있으면 출력이 끝나지 않아서 allob 이 2초 뒤에 출력 보내기를 멈춰요.

확인을 기다리다 시간이 지나면 종료 코드 75로 끝나고, 마지막 줄은 늘 `allob: waiting for approval` 로 시작해요. 같은 명령에 `--approval <요청 ID>` 를 붙여 다시 실행하면 승인을 또 기다렸다가, 승인되는 대로 바로 실행해요. 그래서 에이전트는 주소를 보여 준 뒤 멈추지 않고 바로 다시 실행해요. MCP 로 쓰는 에이전트도 같아요 — `use_vault_items` 를 `approval` 과 함께 다시 부르면 기다렸다가 실행해요. 확인 요청은 한 번에 다섯 개까지 기다릴 수 있고, 꺼낸 항목은 요청마다 한 번만 쓸 수 있어요.

## 금고 열어 두기

출시처럼 오래 걸리는 일은 한 번 승인하고 정해 둔 시간 동안 다시 묻지 않게 금고를 열어 둬요.

```sh
allob vault open --items android.upload-keystore,apple.apns-key --for 2h --reason "1.4.0 출시"
allob vault status
allob vault close
```

열린 동안 웹 화면 위에 "금고 열림 · 남은 시간"이 보이고, 거기서 바로 닫을 수 있어요. 닫으면 서버가 바로 거절해서 터미널은 더 꺼내지 못해요. 열어 둔 금고의 열쇠는 macOS 는 키체인, Windows 는 자격 증명 관리자에 두고, 리눅스에서는 설정 폴더의 내 사용자만 읽는 파일에 둬요.

## 폰 앱에서 승인하기

컴퓨터 앞이 아니어도 allob 폰 앱(iPhone·Android)에서 금고 요청을 승인할 수 있어요. 알림을 누르거나 **할 일**에서 요청을 열어요.

1. 승인 화면에서 무엇을·왜·누가·언제 요청했는지와 **짝 글자** 6자, 남은 시간을 봐요. 짝 글자가 터미널에 보이는 글자와 같은지 확인해요. 터미널을 볼 수 없으면 요청한 곳과 시각으로 확인해요.
2. 처음엔 "PIN으로 승인"을 눌러 PIN 6자리를 넣어요(PIN 을 꺼 뒀으면 복구 코드). Face ID·지문으로 한 번 더 확인해요(생체 인증이 없거나 안 되면 폰 잠금 PIN·패턴·암호로).
3. 승인하고 나면 "다음부터 이 폰은 Face ID로 승인할까요?"를 물어요(지문 폰은 "지문으로"). 켜면 그다음부터는 금고 PIN 없이 Face ID·지문 한 번으로 승인해요. 폰 잠금 PIN 으로는 금고를 열 수 없어요 — Face ID·지문이 안 되면 "PIN으로 승인"을 눌러 금고 PIN 을 넣어요. 생체 인증이 없는 폰은 이 질문 없이 늘 금고 PIN 으로 승인해요.

- 폰 승인은 그 폰의 그 로그인에만 묶여요. 폰에서 로그아웃하거나, 다른 기기에서 그 폰의 로그인을 끊거나, **금고**의 승인 방법에서 그 폰 줄을 끄면 바로 꺼져요. 그다음엔 다시 PIN 으로 승인해요.
- 폰 잠금(PIN·패턴·암호)이 꺼진 폰에서는 승인할 수 없어요. 폰 잠금을 켜면 바로 승인할 수 있어요. 폰 잠금을 끄면 그 폰의 승인 정보가 지워져 다시 로그인해야 해요.
- 금고를 여는 계산은 폰 안에서 해요. PIN·복구 코드·폰의 승인 열쇠는 allob 서버로 가지 않아요.

## 승인 방법

- **패스키(Face ID·Touch ID·Windows Hello·지문)** — 기본 승인 방법이에요. 여러 개 등록할 수 있어요.
- **PIN** — 패스키가 없는 기기에서 써요. 연달아 5번 틀리면 15분 동안 잠기고, 10번 틀리면 패스키나 복구 코드로만 풀려요. 잠기면 계정 주인에게 메일이 가요.
- **복구 코드** — PIN·패스키를 모두 잃었을 때 써요. 연달아 5번 틀리면 15분 쉬었다가 다시 할 수 있어요. 화면에서 새 코드로 바꿀 수 있어요.
- **폰 앱 생체 인증** — 폰 앱에서 PIN 으로 승인한 뒤 켜요. 생체 인증(Face ID·지문)으로만 열려요 — 생체 등록이 바뀌면 꺼지고 다시 금고 PIN 으로 승인해요(위 "폰 앱에서 승인하기"). 폰마다 하나씩 생기고, **금고**의 승인 방법에서 보고 끌 수 있어요. 연달아 5번 틀리면 15분 쉬었다가 다시 할 수 있어요.
- **PIN 끄기** — **금고**의 승인 방법에서 끌 수 있어요. 끄면 패스키와 복구 코드로만 확인해요. 패스키가 하나 이상 있어야 끌 수 있어요.

## 약속할 수 있는 것과 없는 것

- allob 서버에는 PIN·패스키·복구 코드로 여는 열쇠가 없어요. 데이터베이스만 새어 나가서는 금고 항목을 열 수 없어요.
- 데이터베이스와 금고 서버 몫(PEPPER)이 같이 새면, PIN 은 오프라인 대입으로 알아낼 수 있어요. 6자리는 100만 가지뿐이라서요. 그래도 항목을 열려면 계정 데이터 키(마스터 키)까지 있어야 해요. 서버 비밀을 **모두** 가진 사람이 작정하면 PIN 길로 항목이 열려요. 패스키·복구 코드 길은 대입으로 풀 수 없어요. 이게 걱정이면 PIN 을 꺼 두세요.
- 한 번 내 컴퓨터로 꺼낸 값은 그 컴퓨터의 에이전트가 읽을 수 있어요. allob 은 꺼낸 일을 모두 기록하고, 파일을 곧 지우고, 에이전트가 값을 출력하지 않게 규칙(`allob folder agents`)을 줘요.
- PIN·패스키·복구 코드를 모두 잃으면 금고 항목은 되살릴 수 없어요. 아래 표의 "잃었을 때"대로 다시 만들어요.
- allob 이 대신 쓰는 연결(App Store Connect 키·RevenueCat 키 같은 [외부 서비스 연결](/docs/connections))은 예약 실행 때문에 allob 서버가 풀 수 있어요. 키·서류와 다르게 다뤄요.

## 넣을 수 있는 것

| 종류 | ID | 파일 | 용도 | 잃었을 때 |
|---|---|---|---|---|
| Android 업로드 키 | `android.upload-keystore` | .jks .keystore · 64KB | Google Play 에 올리는 앱 묶음에 서명해요. | Play Console 의 앱 무결성에서 업로드 키 재설정을 요청하고 새 키를 등록해요. |
| APNs 키(.p8) | `apple.apns-key` | .p8 · 8KB | iOS 앱에 푸시 알림을 보내요. | Apple Developer 의 Keys 에서 지우고 새 APNs 키를 만들어요. |
| FCM 서비스 계정(.json) | `google.fcm-service-account` | .json · 16KB | Firebase Cloud Messaging 으로 Android 앱에 푸시 알림을 보내요. | Google Cloud 의 IAM → 서비스 계정에서 키를 지우고 새 JSON 키를 만들어요. |
| 사업자등록증명(국문) | `biz.registration-cert-ko` | .pdf .png .jpg .jpeg · 5MB | 스토어·광고·은행이 사업 서류를 달라고 할 때 내요. | 홈택스·정부24 같은 발급처에서 다시 발급받아요. |
| 사업자등록증명(영문) | `biz.registration-cert-en` | .pdf .png .jpg .jpeg · 5MB | 스토어·광고·은행이 사업 서류를 달라고 할 때 내요. | 홈택스·정부24 같은 발급처에서 다시 발급받아요. |
| 통신판매업 신고증 | `biz.mail-order-report` | .pdf .png .jpg .jpeg · 5MB | 스토어·광고·은행이 사업 서류를 달라고 할 때 내요. | 홈택스·정부24 같은 발급처에서 다시 발급받아요. |
| 중소기업 확인서 | `biz.sme-confirmation` | .pdf .png .jpg .jpeg · 5MB | 스토어·광고·은행이 사업 서류를 달라고 할 때 내요. | 중소기업현황정보시스템(sminfo.mss.go.kr)에서 다시 발급받아요. |
| 기타 사업 서류 | `biz.other` | .pdf .png .jpg .jpeg · 5MB | 목록에 없는 사업 서류(예: 위치기반서비스사업 신고확인증)를 이름을 붙여 넣어요. | 그 서류를 발급한 곳에서 다시 발급받아요. |
