업데이트로 돌아가기
New releaseSep 3, 2026

envsec v1.0.0-rc.2

네이티브 OS 자격 증명 저장소(macOS 키체인, Linux Secret Service, Windows Credential Manager)를 사용하여 환경 비밀을 관리하는 안전한 CLI 도구

공유

envsec

네이티브 OS 자격 증명 저장소를 사용한 안전한 환경 비밀 관리.

데모

Image

기능

  • OS 네이티브 자격 증명 저장소에 비밀 저장 (일반 텍스트 파일이 아님)
  • 크로스 플랫폼: macOS, Linux, Windows
  • 컨텍스트별로 비밀 구성 (예: myapp.dev, stripe-api.prod, work.staging)
  • SQLite를 통한 비밀 메타데이터(키 이름, 타임스탬프) 추적
  • glob 패턴으로 컨텍스트 및 비밀 검색
  • 비밀 보간을 사용한 명령 실행
  • cmd로 명령 저장 및 재실행 (검색, 목록, 실행, 삭제)
  • .env 파일로 비밀 내보내기 (audit를 통한 생성 추적 포함)
  • 셸 환경 변수로 비밀 내보내기 (eval $(envsec env))
  • .env 파일에서 비밀 불러오기 (충돌 감지 포함)
  • 팀 구성원을 위해 GPG로 암호화된 비밀 공유
  • 명령을 외우지 않고도 비밀을 관리할 수 있는 대화형 터미널 UI (envsec tui)

패키지

다음 패키지들을 포함하는 모노레포입니다:

패키지설명npm
envsec비밀 관리를 위한 CLI 도구npm
@envsec/sdk프로그래밍 방식으로 비밀을 로드하기 위한 Node.js / Bun SDKnpm
@envsec/core핵심 엔진 — OS 자격 증명 저장소 어댑터 + 메타데이터 DBnpm
@envsec/tui비밀 관리를 위한 대화형 터미널 UInpm

SDK 빠른 시작

Node.js 또는 Bun에서 프로그래밍 방식으로 비밀에 접근하려면 @envsec/sdk를 사용하세요:

npm install @envsec/sdk
import { loadSecrets } from "@envsec/sdk";

// Load and inject into process.env
await loadSecrets({ context: "myapp.dev", inject: true });

// Or use the client for full control
import { EnvsecClient } from "@envsec/sdk";
const client = await EnvsecClient.create({ context: "myapp.dev" });
const apiKey = await client.get("api.key");
await client.close();

전체 API, 멀티 컨텍스트 지원 및 옵션에 대해서는 SDK 문서를 참조하세요.

요구 사항

  • Node.js >= 22

macOS

추가 종속성이 없습니다. security CLI 도구를 통해 내장 Keychain을 사용합니다.

Linux

libsecret-tools(secret-tool 명령 제공)가 필요하며, 이는 D-Bus를 통해 GNOME Keyring, KDE Wallet 또는 모든 Secret Service API 제공자와 통신합니다.

# Debian / Ubuntu
sudo apt install libsecret-tools

# Fedora
sudo dnf install libsecret

# Arch
sudo pacman -S libsecret

실행 중인 D-Bus 세션과 키링 데몬(예: gnome-keyring-daemon)이 활성화되어 있어야 합니다. 대부분의 데스크톱 환경에서는 이를 자동으로 처리합니다.

Windows

추가 종속성이 없습니다. cmdkey와 PowerShell을 통해 내장 Windows Credential Manager를 사용합니다.

설치

Homebrew (macOS / Linux)

brew tap davidnussio/homebrew-tap
brew install envsec

npm

npm install -g envsec

npx (설치 없이)

npx envsec

mise

mise use -g npm:envsec

사용법

대부분의 명령은 --context(또는 -c)로 지정된 컨텍스트를 필요로 합니다. 컨텍스트는 시크릿을 그룹화하기 위한 자유 형식 레이블입니다 — 예: myapp.dev, stripe-api.prod, work.staging.

전역 옵션

다음 옵션은 모든 명령에서 사용할 수 있습니다:

  • --context, -c — 컨텍스트 이름 (예: myapp.dev, stripe-api.prod). ENVSEC_CONTEXT 환경 변수도 읽습니다
  • --debug, -d — 디버그 로깅 활성화
  • --json — 스크립팅을 위한 JSON 형식 출력
  • --db — SQLite 데이터베이스 파일 경로 (기본값: ~/.envsec/store.sqlite). ENVSEC_DB 환경 변수도 읽습니다

사용자 지정 데이터베이스 경로

기본적으로 메타데이터는 ~/.envsec/store.sqlite에 저장됩니다. --db 또는 ENVSEC_DB 환경 변수로 이를 재정의할 수 있습니다:

# Use a project-local database
envsec --db ./local-store.sqlite -c myapp.dev list

# Or via environment variable
export ENVSEC_DB=/shared/team/envsec.sqlite
envsec -c myapp.dev list

--db 플래그는 ENVSEC_DB보다 우선합니다. 사용 사례로는 프로젝트별 데이터베이스, 네트워크 드라이브의 팀 공유 데이터베이스, 임시 스토리지를 사용하는 CI/CD 등이 있습니다.

시크릿 추가

OS 자격 증명 저장소에 시크릿을 저장합니다.

  • <key> — 시크릿 키 이름 (예: api.key, db.password)
  • --value, -v — 저장할 값 (생략하면 대화형 마스킹 프롬프트)
  • --expires, -e — 만료 기간 (예: 30m, 2h, 7d, 4w, 3mo, 1y)
# Store a value inline
envsec -c myapp.dev add api.key --value "sk-abc123"

# Or use the short alias
envsec -c myapp.dev add api.key -v "sk-abc123"

# Omit --value for an interactive masked prompt
envsec -c myapp.dev add api.key

# Set an expiry duration with --expires (-e)
envsec -c myapp.dev add api.key -v "sk-abc123" --expires 30d

# Supported duration units: m (minutes), h (hours), d (days), w (weeks), mo (months), y (years)
# Combinable: 1y6mo, 2w3d, 1d12h
envsec -c myapp.dev add api.key -v "sk-abc123" -e 6mo

시크릿 가져오기

OS 자격 증명 저장소에서 시크릿 값을 검색합니다.

  • <key> — 검색할 시크릿 키 이름
  • --quiet, -q — 원시 값만 출력 (경고나 추가 출력 없음)
  • --json — JSON 형식으로 출력 (context, key, value, expires_at 포함)
envsec -c myapp.dev get api.key

# Print only the raw value (no warnings or extra output)
envsec -c myapp.dev get api.key --quiet
envsec -c myapp.dev get api.key -q

시크릿 삭제

OS 자격 증명 저장소에서 시크릿을 제거합니다.

  • <key> — 삭제할 시크릿 키 이름 (--all을 사용하는 경우 선택 사항)
  • --yes, -y — 확인 프롬프트 건너뛰기
  • --all — 컨텍스트의 모든 시크릿 삭제
envsec -c myapp.dev delete api.key

# or use the alias
envsec -c myapp.dev del api.key

시크릿 이름 변경

동일한 컨텍스트 내에서 시크릿 키의 이름을 변경합니다. 값과 만료 메타데이터는 유지됩니다.

  • <old-key> — 현재 시크릿 키 이름
  • <new-key> — 새 시크릿 키 이름
  • --force, -f — 대상이 이미 존재하는 경우 덮어쓰기
# Rename a key
envsec -c myapp.dev rename old.key new.key

# Overwrite target if it already exists
envsec -c myapp.dev rename old.key existing.key --force

컨텍스트의 모든 시크릿 나열

컨텍스트의 모든 시크릿 키와 메타데이터를 나열합니다.

  • --json — JSON 형식으로 출력
envsec -c myapp.dev list

모든 컨텍스트 나열

시크릿 개수와 함께 사용 가능한 모든 컨텍스트를 나열합니다.

  • --json — JSON 형식으로 출력
# Without --context, lists all available contexts with secret counts
envsec list

시크릿 검색

glob 패턴을 사용하여 시크릿 또는 컨텍스트를 검색합니다.

  • <pattern> — 검색할 glob 패턴 (예: api.*, myapp.*)
  • --json — JSON 형식으로 출력
# Search secrets within a context
envsec -c myapp.dev search "api.*"

# Search contexts by pattern (without --context)
envsec search "myapp.*"

컨텍스트 간 시크릿 이동

시크릿을 한 컨텍스트에서 다른 컨텍스트로 이동합니다. 이동 후 원본 시크릿은 제거됩니다.

  • <pattern> — 이동할 글로브 패턴 또는 정확한 키 (--all 사용 시 선택 사항)
  • --to, -t — 시크릿을 이동할 대상 컨텍스트
  • --all — 원본 컨텍스트의 모든 시크릿 이동
  • --force, -f — 대상 컨텍스트의 기존 시크릿 덮어쓰기
  • --yes, -y — 확인 프롬프트 건너뛰기
# Move a single secret
envsec -c myapp.dev move api.token --to myapp.prod

# Move secrets matching a glob pattern
envsec -c myapp.dev move "redis.*" --to myapp.prod -y

# Move all secrets from one context to another
envsec -c myapp.dev move --all --to myapp.prod -y

# Overwrite existing secrets in the target context
envsec -c myapp.dev move "redis.*" --to myapp.prod --force -y

컨텍스트 간 시크릿 복사

한 컨텍스트에서 다른 컨텍스트로 시크릿을 복사합니다. 원본 시크릿은 그대로 유지됩니다.

  • <pattern> — 복사할 Glob 패턴 또는 정확한 키 (--all을 사용하는 경우 선택 사항)
  • --to, -t — 시크릿을 복사할 대상 컨텍스트
  • --all — 원본 컨텍스트의 모든 시크릿 복사
  • --force, -f — 대상 컨텍스트의 기존 시크릿 덮어쓰기
  • --yes, -y — 확인 프롬프트 건너뛰기
# Copy a single secret
envsec -c myapp.dev copy api.token --to myapp.staging

# Copy secrets matching a glob pattern
envsec -c myapp.dev copy "redis.*" --to myapp.staging -y

# Copy all secrets from one context to another
envsec -c myapp.dev copy --all --to myapp.staging -y

# Overwrite existing secrets in the target context
envsec -c myapp.dev copy "redis.*" --to myapp.staging --force -y

시크릿과 함께 명령 실행

플레이스홀더를 통해 보간되거나 환경 변수로 주입된 시크릿 값과 함께 명령을 실행합니다.

  • <command> — 실행할 명령. 시크릿 보간을 위해 {key} 플레이스홀더를 사용합니다
  • --inject, -i — 모든 컨텍스트 시크릿을 환경 변수로 주입합니다 (KEY.NAME → KEY_NAME)
  • --save, -s — 이 명령을 나중에 사용할 수 있도록 저장합니다
  • --name, -n — 저장된 명령의 이름 (--save와 함께 생략하면 대화식으로 입력을 요청합니다)
# Placeholders {key} are resolved with secret values before execution
envsec -c myapp.dev run 'curl {api.url} -H "Authorization: Bearer {api.token}"'

카테고리