환경변수 잘못 넣어서 키 노출된 사례

환경변수는 개발 과정에서 민감 정보와 설정을 분리하여 관리하는 핵심 요소입니다. 하지만 잘못된 설정은 심각한 보안 사고로 이어질 수 있습니다. 본 글에서는 Vercel의 최근 보안 사고를 통해 환경변수 관리의 중요성을 강조하고, 초보 개발자가 궁금해하는 실제 설정 방법과 보안상 안전한 관리법을 제시합니다.

Vercel 보안 사고: 환경변수 노출의 실제 사례

API 키 노출, Vercel 보안사고, 개발자 보안, 민감 정보 관리, 보안 취약점, 시크릿 관리, 환경변수 보안

2026년 4월, 배포 플랫폼 Vercel에서 발생한 보안 사고는 환경변수 관리의 중요성을 다시 한번 상기시키는 계기가 되었습니다. 이 사고는 직원 계정 탈취를 통해 내부 시스템에 무단 접근이 이루어진 사례입니다.

Vercel 사고 개요 및 원인

Vercel은 2026년 4월 19일 사고 공지를 통해 일부 내부 시스템에 대한 무단 접근이 있었다고 밝혔습니다. 침해 경로는 직원이 사용하던 서드파티 AI 도구인 Context.ai의 침해로 시작되었으며, 이를 통해 해당 직원의 Google Workspace 계정이 탈취된 것으로 확인되었습니다. 이로 인해 Sensitive Environment Variable로 저장되지 않은 일부 고객 환경 변수에 접근이 발생했습니다.

노출 범위와 Vercel의 대응

이번 사고로 영향을 받은 고객은 일부 제한된 고객에 국한되었으며, Vercel은 해당 고객들에게 개별적으로 연락하여 상황을 공유했습니다. 특히, ‘sensitive’ 플래그가 설정되지 않은 환경 변수가 접근 대상이었으나, ‘sensitive’로 표시된 값은 접근 증거가 없었다고 밝혔습니다. Vercel은 내부 조사를 진행하고 법 집행 기관에 통보했으며, 관련 보안 대응 권고로 환경 변수 점검, 노출 가능 키·토큰 즉시 로테이션, 시크릿 관리 도구로의 이전을 제시했습니다.

환경변수(Environment Variable)란 무엇인가

API 키 노출, Vercel 보안사고, 개발자 보안, 민감 정보 관리, 보안 취약점, 시크릿 관리, 환경변수 보안

환경변수는 운영체제나 애플리케이션이 동작하는 환경에 대한 정보를 담고 있는 변수입니다. 이는 시스템 전반에 걸쳐 접근 가능하며, 주로 데이터베이스 연결 정보, API 키, 비밀번호와 같은 민감 정보를 코드 외부에서 안전하게 관리하기 위해 사용됩니다.

환경변수 사용의 필요성

환경변수를 사용하면 코드 수정 없이 애플리케이션의 동작을 변경할 수 있습니다. 예를 들어, 개발 환경과 운영 환경에서 다른 데이터베이스를 사용해야 할 때, 환경변수를 통해 쉽게 설정을 전환할 수 있습니다. 또한, 민감한 정보가 소스 코드에 직접 포함되는 것을 방지하여 보안 취약점을 줄이는 데 필수적입니다.

환경변수의 일반적인 유형

일반적으로 환경변수는 시스템 수준과 사용자 수준으로 나뉩니다. 시스템 환경변수는 모든 사용자에게 적용되며, 사용자 환경변수는 특정 사용자에게만 적용됩니다. PATH, HOME, USER 등 운영체제 기본 변수와 함께, 개발자가 직접 설정하는 커스텀 변수가 있습니다.

개발 환경별 환경변수 설정 가이드

API 키 노출, Vercel 보안사고, 개발자 보안, 민감 정보 관리, 보안 취약점, 시크릿 관리, 환경변수 보안

환경변수는 개발 환경에 따라 설정 방식이 다릅니다. 로컬 개발 환경부터 서버 배포, Docker 컨테이너까지 각 환경에 맞는 설정법을 이해해야 합니다. 초보 개발자가 겪는 “어디에, 어떻게 넣고, 왜 안 먹히는지”의 문제를 해결합니다.

로컬 개발 환경: `.env` 파일과 시스템 변수

로컬 개발 시에는 주로 프로젝트 루트에 `.env` 파일을 생성하여 환경변수를 관리합니다. 이 파일은 버전 관리 시스템(Git)에서 `.gitignore`에 추가하여 절대 커밋되지 않도록 해야 합니다. Windows에서는 시스템 속성, macOS/Linux에서는 `~/.bashrc` 또는 `~/.zshrc` 파일에 `export` 명령어를 사용하여 영구적으로 설정할 수 있습니다.

환경 설정 파일/경로 적용 방식
Windows 시스템 속성 > 환경 변수 영구 적용, 재부팅/재로그인 필요
macOS/Linux `~/.bashrc`, `~/.zshrc` 영구 적용, 터미널 재시작 필요
프로젝트 (로컬) `.env` 파일 특정 라이브러리(dotenv)로 로드

서버 및 Docker 환경: 배포 시 고려사항

서버 환경에서는 직접 환경변수를 설정하거나, 배포 도구의 기능을 활용합니다. Docker 컨테이너의 경우 `docker run -e KEY=VALUE` 명령어나 `docker-compose.yml` 파일의 `environment` 섹션을 사용하여 환경변수를 전달합니다. Docker 이미지 내부에 민감 정보를 직접 포함하는 것은 보안상 위험합니다.

Spring, Node.js, Python 애플리케이션 연동

Spring Boot는 `application.properties` 또는 `application.yml` 파일에서 `${환경변수명}` 형태로 참조하거나, 시스템 환경변수를 직접 사용합니다. Node.js는 `process.env.환경변수명`으로 접근하며, `dotenv` 라이브러리를 통해 `.env` 파일을 로드합니다. Python은 `os.environ.get(‘환경변수명’)`으로 환경변수에 접근합니다. 각 프레임워크나 언어의 특성을 이해하고 적절한 방식으로 연동해야 합니다.

환경변수 관리의 보안 원칙과 우선순위

API 키 노출, Vercel 보안사고, 개발자 보안, 민감 정보 관리, 보안 취약점, 시크릿 관리, 환경변수 보안

환경변수 관리에서 가장 중요한 것은 보안과 올바른 우선순위 적용입니다. 비밀값을 코드에 넣지 않는 원칙을 준수하고, 다양한 설정이 충돌할 때 어떤 값이 우선 적용되는지 알아야 합니다.

비밀값 코드 분리 원칙

API 키, 데이터베이스 비밀번호 등 민감 정보는 절대로 소스 코드에 직접 하드코딩해서는 안 됩니다. 이는 버전 관리 시스템에 노출될 위험이 있으며, 협업 과정에서 보안 사고를 유발할 수 있습니다. 항상 환경변수나 전용 시크릿 관리 도구를 사용하여 분리해야 합니다.

환경변수 적용 우선순위

환경변수는 여러 계층에서 설정될 수 있으며, 적용 우선순위가 존재합니다. 일반적으로 가장 구체적인 설정이 가장 높은 우선순위를 가집니다. 예를 들어, Docker 컨테이너 내부에서 설정된 환경변수가 호스트 시스템의 환경변수보다 우선 적용될 수 있습니다. Spring의 경우 `application.properties/yml` < 시스템 환경변수 < 커맨드 라인 인자 순으로 우선순위를 가집니다.

설정 위치 우선순위 (높을수록 우선)
커맨드 라인 인자 최상위
Docker `environment` 상위
시스템 환경변수 중위
`.env` 파일 하위
기본 설정 파일 최하위

재시작 필요 여부

대부분의 환경변수 변경은 애플리케이션이나 시스템의 재시작을 필요로 합니다. 예를 들어, 시스템 환경변수를 변경한 후에는 터미널을 다시 시작하거나 재로그인해야 변경 사항이 적용됩니다. Docker 컨테이너의 경우, 환경변수를 변경하려면 컨테이너를 재시작해야 합니다. 환경변수 변경 후에는 반드시 변경 사항이 올바르게 적용되었는지 확인하는 절차가 필요합니다.

`.env` 파일 사용의 장단점과 보안 고려사항

API 키 노출, Vercel 보안사고, 개발자 보안, 민감 정보 관리, 보안 취약점, 시크릿 관리, 환경변수 보안

`.env` 파일은 로컬 개발 환경에서 환경변수를 편리하게 관리할 수 있게 해주지만, 잘못 사용하면 보안 위험을 초래할 수 있습니다.

`.env` 파일의 장점

`.env` 파일은 프로젝트별로 환경변수를 분리하여 관리할 수 있으며, 여러 개발자가 동일한 환경을 쉽게 구축할 수 있도록 돕습니다. `.env` 파일을 통해 개발, 테스트, 운영 환경에 맞는 다양한 설정을 간편하게 전환할 수 있습니다.

`.env` 파일의 보안 위험

`.env` 파일은 기본적으로 일반 텍스트 파일이므로, 실수로 버전 관리 시스템에 커밋되거나 서버에 배포될 경우 민감 정보가 노출될 위험이 있습니다. Vercel 사고에서 보듯이, ‘sensitive’ 플래그가 없는 환경 변수들이 접근 대상이 될 수 있습니다. 따라서 `.env` 파일을 사용할 때는 항상 `.gitignore`에 추가하여 노출을 방지해야 합니다.

`.env` 파일 안전하게 사용하기

`.env` 파일에는 개발에 필요한 기본 정보만 담고, 절대 민감한 프로덕션 키나 비밀번호를 직접 저장하지 마십시오. 민감 정보는 별도의 시크릿 관리 도구(예: AWS Secrets Manager, HashiCorp Vault)를 사용하거나, 배포 환경에서 직접 환경변수로 주입하는 방식을 권장합니다.

안전한 환경변수 관리를 위한 권장 사항

API 키 노출, Vercel 보안사고, 개발자 보안, 민감 정보 관리, 보안 취약점, 시크릿 관리, 환경변수 보안

Vercel의 사례처럼 환경변수 노출 사고를 예방하기 위해서는 체계적인 관리와 보안 의식이 필수적입니다. 안전한 환경변수 관리를 위한 몇 가지 권장 사항을 따르는 것이 중요합니다.

1. 시크릿 관리 도구 활용

AWS Secrets Manager, Google Secret Manager, Azure Key Vault, HashiCorp Vault와 같은 전문 시크릿 관리 도구를 사용하십시오. 이러한 도구는 민감 정보를 암호화하여 저장하고, 접근 제어 기능을 통해 인가된 사용자만 접근할 수 있도록 보안을 강화합니다.

2. 환경변수 로테이션 주기 설정

API 키나 비밀번호와 같은 민감 정보는 정기적으로 로테이션(갱신)하는 정책을 수립하십시오. 만약 키가 유출되더라도, 로테이션 주기가 짧으면 공격자가 해당 키를 악용할 수 있는 시간을 최소화할 수 있습니다.

3. 접근 제어 및 최소 권한 원칙

환경변수에 접근할 수 있는 사용자나 시스템의 권한을 최소화하십시오. 필요한 최소한의 권한만 부여하고, 불필요한 접근은 차단해야 합니다. Vercel 사고에서도 직원의 Google Workspace 계정 탈취가 원인이었음을 기억해야 합니다.

4. 코드 리뷰 및 보안 감사

정기적인 코드 리뷰를 통해 민감 정보가 소스 코드에 하드코딩되지 않았는지 확인하십시오. 또한, 보안 감사를 통해 환경변수 설정의 적절성과 보안 취약점을 점검하는 것이 필요합니다.

자주 묻는 질문

Q1: `.env` 파일을 Git에 커밋해도 되나요?

아니요, `.env` 파일은 민감 정보를 포함할 수 있으므로 절대로 Git에 커밋해서는 안 됩니다. `.gitignore`에 추가해야 합니다.

Q2: Windows와 macOS/Linux에서 환경변수 설정 방식이 왜 다른가요?

운영체제마다 환경변수를 관리하는 방식과 셸(Shell)의 종류가 다르기 때문입니다. Windows는 GUI 기반 시스템 속성, macOS/Linux는 셸 스크립트 파일을 사용합니다.

Q3: 배포 후 환경변수가 반영되지 않아요. 어떻게 해야 하나요?

대부분의 경우 애플리케이션이나 서버를 재시작해야 변경된 환경변수가 적용됩니다. Docker 컨테이너의 경우 컨테이너를 다시 빌드하고 실행해야 합니다.

댓글 남기기