---
title: "앱의 트레이딩 키와 시크릿을 서버의 디스크에 두지 않기"
description: "erpc worker는 앱의 트레이딩 키와 시크릿을 1Password, OS 키체인 또는 암호화된 키스토어에 보관하고, 메모리로 앱에 전달합니다."
canonical: "https://erpc.global/ko/doc/erpc-cli/worker-secrets/"
locale: "ko"
---

# 앱의 트레이딩 키와 시크릿을 서버의 디스크에 두지 않기

`erpc worker`는 앱의 트레이딩 키와 시크릿을 1Password, 키체인 또는 암호화된 키스토어에 보관하고, 메모리로 앱에 전달하며, 서버의 디스크에는 절대 넘기지 않습니다.

이 페이지는 프리릴리스인 ERPC CLI `v0.1.0-rc.4`를 설명합니다.

## 트레이딩 키가 앱에 전달되는 방식

지갑이 있는 앱은 시작할 때 파이프로 키를 받습니다. 서버에는 `wallet.json`도, `.env`도, 사본도 없습니다. erpc는 키를 암호화하지 않은 채로 어떤 디스크에도 쓰지 않습니다. 키를 넣는 유일한 파일은 사용자의 머신에 있는 키스토어의 파일이며, 사용자의 패스프레이즈로 암호화되어 있습니다.

- **보관 위치:** `erpc worker key new`는 `erpc login`이 세션을 1Password에 보관하고 있으면 1Password에, 그렇지 않으면 키체인에, 그것도 아니면 키스토어에 키를 만듭니다. `erpc.toml`에는 키의 참조와 공개 키가 기록됩니다.
- **서버에서:** erpc worker 에이전트는 키를 메모리에만 보관합니다. 자신을 덤프할 수 없게 만들고 메모리를 잠근 뒤, 파일 디스크립터로 앱에 키를 전달합니다. 앱은 키를 읽은 뒤 지웁니다.
- **재부팅 후에는** worker가 잠긴 상태로 돌아옵니다. `erpc worker start`가 키를 다시 보낼 때까지 앱은 실행되지 않습니다. 실패하거나 강제 종료된 에이전트는 systemd가 다시 시작하며, 마찬가지로 잠긴 상태로 돌아옵니다.
- **패키지 업데이트는 worker를 재시작하지 않습니다.** `deploy`는 `needrestart`가 worker 유닛을 건드리지 않도록 지정합니다. 자동 모드에서는 이 유닛들의 재시작을 미루고, 터미널에서 물을 때는 이 유닛들에 대한 기본 응답이 no이므로, 무인 보안 업데이트가 앱을 재시작하지 않습니다. 이 규칙을 작성하지 못하면 배포는 그 사실을 알리고 계속 진행하며, 이때 worker는 이 보호 없이 실행됩니다.

트레이딩 키는 `[wallet]`만이 지정하며, erpc는 터미널 앞에 사람이 있을 때만 키를 읽습니다. AI 도구를 위해서도, 1Password 서비스 계정으로도 읽지 않습니다. `[wallet]` 참조를 지정하는 `[secrets]` 줄이나, `.wallet`으로 끝나는 `keychain:` 또는 `keystore:` 계정은 거부됩니다. 키스토어에서는 키로 보관된 항목을 시크릿으로 열 수 없습니다. 1Password와, 다른 이름의 키체인 계정에서는 키임을 표시하는 것이 없으므로, `[wallet]`이 없는 `erpc.toml`이 `[secrets]` 아래에서 그런 항목을 지정하면 그 항목은 시크릿으로 읽힙니다.

## 값을 보관할 위치 선택하기

1Password는 선택 사항입니다. `erpc worker key new`와 `erpc worker secret put`은 `--store`로 지정하지 않는 한(`--store 1password --vault <id>`, `--store keychain`, `--store keystore`), 받은 값을 다음 중 첫 번째로 해당하는 곳에 보관합니다.

1. **1Password**: `erpc login`이 세션을 1Password에 보관하고 있거나 `--vault`가 주어진 경우.
2. **OS 키체인**: 재부팅 후에도 값이 유지되는 환경, 즉 macOS, Windows, 그리고 로그인한 세션에 데스크톱 키링이 있는 Linux.
3. **erpc의 키스토어**: 그런 키링이 없는 Linux 머신(헤드리스 서버, WSL, SSH 로그인). 이런 머신에서 `--store keychain`은 거부됩니다.

키체인이나 키스토어에서는 키가 그 머신 한 대에만 존재하며, 사본도 동기화도 없습니다. 다른 머신은 `keychain:`이나 `keystore:` 참조를 읽을 수 없습니다.

머신을 잃어버리거나 초기화하면 지갑도 잃게 됩니다. 지갑에는 적은 금액만 두거나, 보관함에 로그인한 모든 머신에서 읽을 수 있는 1Password를 사용하세요. 1Password에는 `erpc login --store 1password-desktop`으로 로그인하고, 데스크톱 앱이 없는 곳에서는 `op signin`으로 로그인하세요.

1Password 서비스 계정은 앱의 시크릿을 보관할 수 있지만, erpc는 서비스 계정으로 트레이딩 키를 읽지 않습니다. 1Password를 사용하면 읽을 때마다 1Password 앱에 승인 요청이 표시될 수 있으며, erpc는 기다리는 동안 스피너를 표시합니다.

## 시크릿 보관하기

API 토큰이나 RPC 키 같은 시크릿도 같은 방식으로 보관되지만, 파이프가 아니라 환경 변수로 앱에 전달됩니다. `erpc worker secret put <NAME>`이 값을 보관하고, `erpc.toml`의 `[secrets]`에는 그 참조만 들어갑니다.

```bash
erpc worker secret put API_TOKEN --generate          # the bot's own API token, made for you and shown to nobody
erpc worker secret put ERPC_API_KEY --from-account   # the account's RPC key, read from your account (or SOLANA_RPC_ENDPOINT in [vars])
```

- **`--generate`는** 값을 만듭니다. 32바이트 난수를 16진수 64자로 나타낸 값입니다.
- **`--from-account`는** 계정의 RPC 키 중 공유 RPC가 받아들이는 첫 번째 키를 보관합니다. 키는 기본 키부터 순서대로 각각 `getHealth` 한 번으로 시도되며, 응답에는 8초가 주어집니다. 401 또는 403 응답을 받은 키는 거부되고 다음 키가 시도되며, RPC가 받아들인 키만 보관됩니다. 명령은 그 키가 계정의 기본 키인지 다른 키인지 알려 줍니다(`--json`에서는 `account_key`).
- 어느 값도 출력되지 않으며, `--json`에서도 마찬가지입니다. 키스토어를 처음 사용할 때나 키스토어가 잠겨 있을 때는 터미널 앞에 사람이 있어야 합니다.
- 키는 이 머신에서 시도되므로, 서버의 주소로 제한된 키는 서버에서는 동작하더라도 여기서는 거부됩니다. 모든 키가 거부되면 `--from-account`는 아무것도 보관하지 않으며, 사용할 키를 화면에 보이지 않게 입력하거나 파이프로 넣어 직접 보관해야 합니다. RPC에 물어볼 수 없었으면 아무것도 보관하지 않고 `erpc.toml`도 그대로입니다. 같은 명령을 다시 실행하세요.

키를 직접 보관하는 방법은 다음과 같습니다.

```bash
erpc worker secret put ERPC_API_KEY        # asks for the value, unseen
```

- `--replace`는 이미 설정된 이름에 새 값을 보관합니다. `erpc worker secret list`는 시크릿 설정을 이름과 각각의 보관 위치로 나열합니다.
- 데이터 회선이 제공하는 설정(`GRPC_ENDPOINT`, `SHREDS_ENDPOINT`, `SOLANA_SEND_RPC_ENDPOINT`)은 절대 시크릿이 아닙니다. `--grpc`, `--shreds`, `--unlimited`가 이 설정을 정합니다.

`[secrets]` 또는 `[wallet]`의 참조는 다음 중 하나입니다.

| 참조 | 값이 있는 곳 |
| --- | --- |
| `op://<vault-id>/<item-id>/<field>` | 1Password(보관함 id와 항목 id로 지정) |
| `keychain:<service>/<account>` | 값을 보관한 머신의 OS 키체인 |
| `keystore:<service>/<account>` | 값을 보관한 머신의 erpc 키스토어 |

## 키스토어

키스토어는 `~/.erpc/keystore` 디렉터리입니다(`ERPC_HOME`이 설정되어 있으면 그 아래의 `keystore`). Linux와 macOS에서는 디렉터리가 `0700`, 파일이 `0600`이며, Windows에서는 erpc가 자체적으로 권한을 설정하지 않습니다.

- `master.json`에는 무작위 32바이트 마스터 키가 들어 있으며, 이 마스터 키는 PBKDF2-HMAC-SHA256(600,000회 반복)이 패스프레이즈로부터 만든 키로 봉인되어 있습니다. 각 항목에는 값 하나가 들어 있으며, 항목마다 고유한 키로 ChaCha20-Poly1305를 사용해 봉인되어 있습니다.
- **패스프레이즈:** 키스토어를 사용하는 첫 `key new` 또는 `secret put`에서 패스프레이즈를 정합니다. 터미널에서 두 번 입력하며, 12자 이상이어야 합니다. erpc는 이 숨겨진 프롬프트에서만 패스프레이즈를 받으며, 인수, 환경 변수, 파이프로는 절대 받지 않습니다.
- **Linux에서의 잠금 해제:** 패스프레이즈로 키스토어를 한 번 열면, 잠금 해제 상태가 커널의 영구 키링에 보관되어 메모리 안에 유지됩니다. 머신이 재시작되거나, 키링이 유휴 만료 시간(시스템이 따로 정하지 않으면 3일) 동안 사용되지 않거나, `erpc worker secret lock`을 실행할 때까지입니다. `erpc worker secret unlock`은 미리 패스프레이즈를 묻고 언제까지 유지되는지 알려 줍니다. 자체 로그인 없이 시작된 셸(`-` 없는 `su`, `sudo -E`)에서는 잠금 해제가 유지되지 않으며, 명령마다 패스프레이즈를 묻습니다.
- **터미널에 아무도 없을 때** 키스토어가 필요한 명령은 잠금 해제 상태가 있으면 그것을 사용하고, 없으면 `erpc worker secret unlock`을 안내하며 실패합니다. 잠금 해제된 키스토어는 시크릿은 넘겨주지만 트레이딩 키는 넘겨주지 않습니다.
- **macOS와 Windows에서는**(`--store keystore`) 잠금 해제가 유지되지 않습니다. 키스토어가 필요한 명령은 각각 패스프레이즈를 한 번 물으므로 터미널이 필요합니다.

### 키스토어가 보호하는 것과 보호하지 않는 것

- **`keystore` 디렉터리를 백업하고 패스프레이즈를 기억해 두세요.** erpc는 어느 쪽도 복구할 수 없으며, 둘 중 하나라도 없으면 키스토어에 보관된 것은 사라집니다.
- 키스토어 파일과 패스프레이즈를 가진 사람은 누구든 키를 가진 것입니다. PBKDF2는 추측을 하나하나 느리게 만들 뿐, 추측하기 쉬운 패스프레이즈를 안전하게 만들지는 않습니다.
- 키스토어가 잠금 해제되어 있는 동안에는 사용자 권한으로 실행되는 모든 프로그램이 커널 키링에서 마스터 키를 읽어(세션에 사용자의 키링이 없는 프로그램도 그 키링을 연결해 넣을 수 있음) 키로 보관된 항목을 포함한 모든 항목을 열 수 있습니다. erpc 자체의 규칙(`[wallet]`이 지정하는 키는 터미널 앞에 사람이 있을 때만 읽고 AI 도구를 위해서는 절대 읽지 않음, 키스토어에 보관된 키는 절대 시크릿으로 열지 않음)은 erpc가 하는 동작이며, 사용자 권한으로 실행되는 다른 프로그램을 구속하지 않습니다. 작업이 끝나면 `erpc worker secret lock`을 실행하세요.
- 항목 이름은 숨겨지지 않으며, 항목의 크기로 값의 길이를 알 수 있습니다.
- 변경된 파일은 열리지 않습니다. 하지만 같은 항목의 이전 사본을 제자리에 되돌려 놓으면 열립니다.
- `erpc worker secret rm`은 시크릿의 키스토어 항목을 `erpc.toml`의 해당 줄과 함께 삭제하며(앱의 다른 설정이 같은 항목을 지정하는 경우는 제외), 1Password나 키체인에 있는 값은 그대로 둡니다. 디스크를 완전히 지우지는 않으며, 백업에 있는 사본도 남습니다.
- erpc는 트레이딩 키의 항목을 절대 삭제하거나 덮어쓰지 않습니다. 키를 교체하려면 자금을 옮긴 뒤 키의 파일과 `[wallet]`을 직접 삭제하세요.
- 키스토어나 키체인에서는 설정 이름을 대소문자에 관계없이 `WALLET`으로 할 수 없습니다. `--store 1password`에서는 이 이름을 쓸 수 있습니다.

## 트레이딩 키 다루기

| 명령 | 하는 일 |
| --- | --- |
| `erpc worker key new` | 트레이딩 키를 만들고 입금할 공개 키를 출력합니다 |
| `erpc worker key import <FILE>` | 키 파일을 1Password, 키체인 또는 키스토어로 옮긴 뒤, 파일을 지울지 묻습니다 |
| `erpc worker key show` | 키의 공개 키와 보관 위치를 표시합니다 |
| `erpc worker key balance` | 앱 자체의 RPC 설정을 통해 키의 잔액을 표시합니다 |
| `erpc worker key send --to <ADDRESS> --sol <N>` | 터미널에서 yes로 답한 뒤, 메모리에서 송금 한 건에 서명합니다. `--all`은 수수료를 제외한 전부를 보냅니다 |

erpc가 송금이 처리되었는지 알지 못한 채 종료되면, 다시 보내기 전에 그 서명을 조회하세요. 두 번째 전송은 두 번째 송금이 됩니다.
