dotenv를 버리고 Varlock으로 갈아탄 이유

BBetter Stack
Computing/SoftwareInternet Technology

Transcript

00:00:00환경 변수 관리용 오픈 소스 도구인 Valor를 소개합니다. 이 도구를 사용하면
00:00:04비밀번호 같은 민감한 정보를 더 이상 로컬 디스크에 평문으로 저장할 필요가 없습니다.
00:00:10로컬이나 1Password, Bitwarden, AWS 등 다양한 비밀번호 관리자를 통해 환경 변수를 불러오고
00:00:16타입 안정성이 보장된 스키마를 사용해 런타임 시 애플리케이션에 비밀 정보를 주입합니다.
00:00:21덕분에 .env 파일을 AI에게 노출하거나 GitHub에 공개해도 안전하죠. 그런데 이게 어떻게 작동하며
00:00:27이 독특한 문법은 무엇일까요? 구독 누르시고 바로 알아보겠습니다.
00:00:31새로운 개발 프로젝트에 참여해서 코드를 받고 로컬에서 실행했는데
00:00:39작동하지 않았던 적이 몇 번이나 있으신가요? 알고 보니 다른 개발자나
00:00:45암호화된 저장소에서 받아야 하는 .env 파일이 누락되었던 경우 말이죠.
00:00:50.env 파일이 업데이트될 때마다 이 과정을 반복해야 하죠. Valor는 바로 이 문제를 해결하고
00:00:56프롬프트 인젝션 공격을 받은 AI 에이전트가 비밀 정보에 접근하는 문제도 방지합니다.
00:01:02작동 방식을 보시죠. 여기 OpenAI의 Whisper로 트위터 영상을 받아쓰고
00:01:06Claude로 기사를 작성하는 작은 프로젝트가 있습니다.
00:01:12먼저 간단하게 Valor로 포트 번호를 변경해 보겠습니다. Valor가 설치된 상태라면
00:01:17현재 비어 있는 .env.schema 파일이 있을 겁니다. 이 파일은 모든 환경 변수의
00:01:23기준점이 되며, GitHub 퍼블릭 리포지토리에 커밋해도 안전합니다.
00:01:28먼저 간단한 'appenv' 환경 변수를 추가하고 값을 'testing'으로 설정해 보겠습니다.
00:01:33이제 새 탭에서 'varlock load'를 실행해 스키마를 검증하겠습니다.
00:01:39보시다시피 환경 변수를 읽어왔고 'sensitive(민감 정보)'로 설정되었습니다.
00:01:43Valor의 모든 환경 변수는 기본적으로 민감 정보로 설정되지만, 변경할 수 있습니다.
00:01:48파일에 첫 번째 데코레이터를 추가하겠습니다. 파일 내 모든 변수에 영향을 주는
00:01:52루트 데코레이터를 사용해 'default sensitive'를 false로 설정하겠습니다.
00:01:56문법을 보면 앞에 '#'이 붙어 있고 보통 루트 변수는 구분선으로 나뉩니다.
00:02:02이 파일 전체는 Varlock 팀이 만든 오픈 스펙인 'mspec'이라는 도메인 특화 언어를 사용합니다.
00:02:08이제 스키마를 다시 검증해 보면 더 이상 민감 정보로 설정되지 않아
00:02:14환경 변수의 값을 실제로 확인할 수 있습니다. 스키마 파일에서 다른 멋진 기능도 가능한데
00:02:19환경 변수에 타입을 지정하는 것입니다. 'string' 타입을 지정하면 여전히 잘 작동하지만
00:02:24만약 'number'로 바꾸면 문자열을 예상했다는 오류 메시지가 뜹니다.
00:02:29'required' 데코레이터를 추가하고 텍스트를 지워보겠습니다.
00:02:33파일을 확인해 보면 값을 예상했기 때문에 오류가 발생합니다.
00:02:39이런 것들을 '아이템 데코레이터'라고 부르며 Varlock 문서에서
00:02:44전체 목록과 사용 가능한 타입들을 확인할 수 있습니다. 이제 다른 변수를 추가해 보죠.
00:02:50이번엔 이름은 'port', 값은 3002로 하겠습니다. 타입은 'port'로 지정하고
00:02:55위쪽 설정은 다시 민감 정보로, 타입은 문자열로 되돌리겠습니다.
00:03:01이제 두 환경 변수를 모두 찾아냈고 민감 정보라 내용은 숨겨졌습니다.
00:03:05그럼 이 값들을 어떻게 애플리케이션에 넣을까요? 방법은 아주 간단합니다.
00:03:10'varlock run' 뒤에 앱 실행 스크립트를 붙여주면 됩니다. package.json 파일을 보면
00:03:15프론트엔드 실행을 위해 'vite' 명령어를 써야 합니다. 따라서 'varlock run vite'를 실행하면
00:03:21설정을 로드하고 해석한 다음 환경 변수에 주입합니다.
00:03:27정확히 처리되었네요. 이제 포트는 3002가 되었고 코드에서도 잘 작동합니다.
00:03:33Varlock이 주입 중인 포트 환경 변수를 가장 먼저 확인하기 때문이죠.
00:03:38이 스크립트는 자바스크립트 파일에 국한되지 않습니다. Varlock은 어떤 프로젝트든
00:03:43Python, Go, Rust 등 가리지 않고 예상대로 작동합니다. 만약 npm으로
00:03:48설치하고 싶지 않다면 동일하게 작동하는 Varlock CLI도 있습니다.
00:03:54로컬 환경 변수는 여기까지 하고, 이제 쉘 로컬 변수 대신 1Password에서
00:03:59OpenAI나 Anthropic API 키 같은 정보를 가져오는 과정을 살펴봅시다.
00:04:05저는 원래 1Password를 쓰지 않지만 영상 제작을 위해 체험판에 가입했습니다.
00:04:11보시다시피 새 금고를 만들었는데, 이건 아주 중요합니다. 이유는 나중에 설명하죠.
00:04:16금고 안에는 OpenAI API 키와 Anthropic API 키 두 항목이 있습니다.
00:04:24가짜 키라서 보여드려도 상관없습니다. 자, 이 값들을 Varlock 스키마에
00:04:30넣으려면 먼저 1Password 플러그인을 설치해야 합니다.
00:04:36Varlock 플러그인은 전용 루트 및 아이템 데코레이터를 추가할 수 있어서
00:04:42공식 문서에 없는 'init 1password' 같은 새로운 데코레이터를 볼 수 있습니다.
00:04:49설치 후 해당 플러그인을 포함한 루트 데코레이터를 로드하고
00:04:55'init 1password'를 실행합니다. 지금 필요한 건 여기서 가져올 토큰뿐입니다.
00:05:01이 토큰을 얻으려면 개인 금고가 아닌 '새 금고'에 연결해야 하며
00:05:06'개발자 서비스 계정' 메뉴에서 안내에 따라 토큰을 생성할 수 있습니다.
00:05:11영상 후에 토큰과 계정을 삭제할 거라 그냥 보여드리겠습니다. 이 값의 타입은
00:05:15플러그인에서 제공하는 '1password service token'으로 지정하고 민감 정보로 설정합니다.
00:05:21파일에 구문 강조가 안 되는 걸 보셨을 텐데, Varlock 팀이
00:05:26VS Code 플러그인은 만들었지만 Neovim용은 아직 없기 때문입니다.
00:05:32나중에 제가 직접 만들거나 Claude에게 시켜봐야겠네요. 이제 새 환경 변수인
00:05:37'openai api key id'를 만들고 1Password에서 값을 가져오기 위해
00:05:431Password 함수를 실행합니다. 규약(protocol)을 적고 나서
00:05:49금고 이름인 'test', 항목 이름인 'openai', 그리고 필드 이름을 적습니다.
00:05:55확인해 보니 필드 이름은 'credential'이네요. 이것도 민감 정보로 설정하고
00:06:02'varlock load'를 실행하면 몇 초 뒤에 1Password로부터 키를 가져옵니다.
00:06:08값이 '1234' 같은 것으로 바뀌어도 잘 작동하는지 확인해 보죠.
00:06:14다시 로드하면 정확한 값을 가져옵니다. 이제 환경 스키마 파일을
00:06:20커밋할 준비가 끝났습니다. 그런데 1Password 토큰은 노출되어도 안전할까요?
00:06:25솔직히 말씀드리면, 로컬 개발 시 1Password 데스크톱 앱이나
00:06:31CLI를 이미 사용 중이라면 토큰 대신 지문 인식으로
00:06:381Password 잠금을 해제하도록 설정할 수도 있습니다.
00:06:43Varlock은 AWS, GCP, Bitwarden 같은 다른 플러그인도 지원하며
00:06:52Vite, Next.js, Cloudflare Workers 등 다양한 통합 기능도 제공합니다.
00:06:57스키마에서 TypeScript 타입을 생성하거나 다른 파일의 환경 변수를 가져오고
00:07:03로그나 HTTP 응답에서 민감한 정보를 가리는 아주 유용한 기능들도 많습니다.
00:07:08AI 에이전트가 스키마 설정을 자동으로 도와주는 MCP 서버도 있고
00:07:15CI/CD 과정에서 환경 변수를 검증해 주는 GitHub Action도 있습니다.
00:07:21이렇게 멋진 Varlock이지만 몇 가지 아쉬운 점도 있습니다.
00:07:27예를 들어 오프라인에서는 쓸 수 없어서 공항 같은 곳에서 코딩할 때는
00:07:32결국 하드코딩된 환경 변수를 써야 하죠. 하지만 인터넷 없이 코딩하는 사람이 얼마나 될까요?
00:07:37그리고 외부 서비스에서 비밀번호를 가져올 때 약간의 지연이 발생해서
00:07:41스크립트 시작이 조금 늦어질 수 있습니다. Dashlane 같은 서비스 지원이
00:07:46부족하다는 점과, 로컬 쉘의 환경 변수 이름과 스키마 파일의 이름이 같으면
00:07:531Password 대신 로컬 변수를 우선시하는 기이한 버그도 경험했습니다.
00:07:59하지만 Varlock은 활발히 개발 중인 프로젝트라
00:08:05이런 문제들은 미래에 해결될 것이라고 확신합니다.
00:08:10그럼에도 현재 상태로도 저에게는 매우 유용한 도구이며
00:08:16앞으로 모든 사이드 프로젝트에 Varlock 스키마 파일을 사용할 생각입니다.
00:08:21에이전트들이 제 정보를 긁어가는 것을 원치 않기 때문에
00:08:26로컬 쉘 파일까지 대체할 방법이 있다면 꼭 그렇게 하고 싶네요.

Key Takeaway

Varlock은 .env 파일의 보안 취약점과 관리의 번거로움을 해결하기 위해 타입 안정성이 보장된 스키마와 외부 비밀번호 관리자 연동을 제공하는 차세대 환경 변수 관리 도구입니다.

Highlights

.env 파일에 민감한 정보를 평문으로 저장하지 않고 외부 비밀번호 관리자를 통해 안전하게 관리할 수 있습니다.

mspec이라는 전용 도메인 특화 언어를 사용하여 환경 변수의 타입 안정성과 필수 여부를 검증합니다.

1Password, Bitwarden, AWS, GCP 등 다양한 외부 서비스 플러그인을 지원하여 확장성이 뛰어납니다.

GitHub와 같은 퍼블릭 저장소에 스키마 파일을 공개해도 보안상 안전하며 팀 협업 시 설정 누락 문제를 해결합니다.

AI 에이전트의 프롬프트 인젝션 공격으로부터 API 키 등 민감한 정보가 노출되는 것을 방지합니다.

Varlock run 명령어를 통해 언어와 상관없이(Node, Python, Go 등) 환경 변수를 주입하여 앱을 실행할 수 있습니다.

Timeline

Varlock 소개 및 기존 .env 방식의 문제점

발표자는 기존의 .env 파일 방식이 가진 보안 취약점과 협업 시의 불편함을 지적하며 Varlock을 소개합니다. 로컬 디스크에 민감한 정보를 평문으로 저장하는 대신 1Password나 AWS와 같은 도구를 사용하여 환경 변수를 불러오는 방식을 제안합니다. 특히 팀 프로젝트에서 새로운 개발자가 환경 설정 파일이 없어 겪는 고충을 이 도구가 어떻게 해결하는지 설명합니다. 또한 AI 에이전트가 프롬프트 인젝션을 통해 비밀 정보에 접근하는 최신 보안 위협에 대한 방어책으로서의 가치도 강조합니다. 결론적으로 Varlock은 단순한 설정 도구를 넘어 보안과 생산성을 동시에 잡는 솔루션임을 명시합니다.

Varlock 스키마 설정 및 기본 문법

실제 프로젝트에 Varlock을 적용하여 포트 번호와 같은 환경 변수를 관리하는 실습 과정을 보여줍니다. .env.schema 파일이 프로젝트의 기준점이 되며, 이는 퍼블릭 리포지토리에 커밋해도 안전한 구조임을 강조합니다. mspec이라는 전용 언어를 사용하며, 해시 기호(#)를 이용한 데코레이터 문법으로 타입 지정이나 필수 여부(required)를 설정할 수 있습니다. 예를 들어 숫자형 변수에 문자열이 들어오면 오류를 발생시켜 런타임 이전에 설정을 검증하는 강력한 타입 안정성을 제공합니다. 기본적으로 모든 변수를 민감 정보로 취급하여 노출을 막는 보안 지향적인 설계 철학을 엿볼 수 있습니다.

애플리케이션 실행 및 다중 언어 지원

설정된 환경 변수를 실제 애플리케이션에 주입하여 실행하는 'varlock run' 명령어의 사용법을 상세히 다룹니다. Vite와 같은 프런트엔드 도구뿐만 아니라 백엔드 스크립트에서도 명령어 앞에 붙이기만 하면 즉시 환경 변수가 주입됩니다. 이 도구의 가장 큰 장점 중 하나는 자바스크립트에 국한되지 않고 Python, Go, Rust 등 모든 개발 환경에서 동일하게 작동한다는 점입니다. npm 설치를 원치 않는 사용자를 위해 별도의 CLI 도구도 제공하여 접근성을 높였습니다. 개발자는 코드 변경 없이 실행 명령어 한 줄만 추가하여 안전한 환경 변수 관리를 시작할 수 있습니다.

1Password 플러그인 연동 및 외부 API 키 관리

로컬 변수 대신 1Password와 같은 외부 서비스에서 OpenAI나 Anthropic의 API 키를 실시간으로 가져오는 심화 과정을 설명합니다. 전용 플러그인을 설치하고 서비스 토큰을 연결하는 구체적인 단계를 시연하며, 금고 이름과 필드 이름을 지정하는 프로토콜 문법을 소개합니다. VS Code용 구문 강조 플러그인이 있어 편리하지만 아직 Neovim용은 없다는 점 등 실제 사용자가 느낄 수 있는 세세한 정보도 포함됩니다. 지문 인식을 통한 잠금 해제와 같은 강력한 보안 기능을 활용하면 로컬에 어떤 비밀 정보도 남기지 않을 수 있습니다. 이를 통해 개발 환경 전체의 보안 수준을 한 단계 격상시킬 수 있음을 보여줍니다.

추가 기능 및 Varlock의 한계와 미래

Varlock이 제공하는 TypeScript 타입 생성 기능, CI/CD를 위한 GitHub Action 지원, 그리고 로그 내 민감 정보 필터링 기능을 요약합니다. 다만 오프라인 환경에서 사용이 제한되거나 외부 연동 시 발생하는 약간의 지연 시간, 특정 서비스 지원 부족과 같은 현재의 단점들도 솔직하게 언급합니다. 또한 개발 과정에서 발견한 사소한 버그를 공유하며 이 도구가 아직 활발히 성장 중인 프로젝트임을 시사합니다. 하지만 이러한 단점에도 불구하고 보안상의 이점이 훨씬 크기 때문에 모든 사이드 프로젝트에 적용할 가치가 있다고 추천합니다. 마지막으로 AI 시대에 자신의 정보를 보호하기 위한 필수적인 도구로 Varlock을 제안하며 영상을 마무리합니다.

Community Posts

View all posts