- 공유 링크 만들기
- X
- 이메일
- 기타 앱
| APIKey해킹방지완벽가이드dotenv로환경변수안전하게관리하기 |
1. 환경변수를 분리해야 하는 이유
환경변수는 프로세스 실행 시점에 주입되는 동적 값으로, 애플리케이션 동작에 영향을 줍니다. 코드에 직접 하드코딩하지 않고 환경변수로 관리하면 다음 이점을 얻을 수 있습니다.
- 보안 강화: API Key, DB 비밀번호 등 민감 정보가 Git 히스토리에 남지 않음
- 환경별 분리: 개발(dev), 스테이징(staging), 운영(prod) 환경마다 다른 설정을 코드 수정 없이 적용 가능
- 협업 효율: 팀원마다 로컬 환경이 다를 때 .env.example을 공유하고 각자 .env를 생성하여 충돌 방지
- 배포 자동화: CI/CD 파이프라인에서 Secret Manager나 환경변수 주입 방식으로 안전하게 배포 가능
주의: .env 파일 자체는 평문이므로 반드시 .gitignore에 추가해야 하며, 운영 환경에서는 AWS Secrets Manager, HashiCorp Vault 등 전용 Secret 관리 도구를 사용하는 것을 권장합니다.
2. Node.js 환경에서 dotenv 사용법
Node.js에서는 dotenv 라이브러리가 사실상 표준입니다. .env 파일의 KEY=값 형식을 읽어 process.env 객체에 자동으로 로드합니다.
설치 및 기본 설정
- 설치:
npm install dotenv - .env 파일 생성 (프로젝트 루트):
DB_HOST=localhost DB_USER=admin DB_PASSWORD=secret123 API_KEY=abcd1234efgh5678 NODE_ENV=development
- 애플리케이션 진입 파일(index.js, app.js 등) 최상단에 추가:
require('dotenv').config();
console.log(process.env.DB_HOST); // localhost
console.log(process.env.API_KEY); // abcd1234efgh5678
환경별 .env 파일 분리
개발/운영 환경을 분리하려면 path 옵션을 사용합니다.
// .env.local, .env.production 등 별도 파일 사용
require('dotenv').config({ path: '.env.production' });
ES 모듈 환경 대응
ES 모듈(import/export)을 사용하는 프로젝트에서는 코드 수정 없이 실행 옵션으로 dotenv를 로드할 수 있습니다.
node -r dotenv/config index.js # 다른 경로의 .env 사용 DOTENV_CONFIG_PATH=.env.local node -r dotenv/config index.js
꿀팁: package.json의 scripts에 "start": "node -r dotenv/config src/index.js"로 등록하면 매번 옵션을 입력할 필요가 없습니다.
브라우저 번들링 환경 (Webpack, Create React App)
- Webpack: DefinePlugin으로 빌드 시점에 환경변수를 문자열로 치환
// webpack.config.js
const webpack = require('webpack');
require('dotenv').config();
module.exports = {
plugins: [
new webpack.DefinePlugin({
'process.env': JSON.stringify(process.env)
})
]
};
- Create React App: 별도 설치 없이
REACT_APP_접두사를 붙인 변수만 자동 인식
# .env REACT_APP_API_URL=https://api.example.com // src/App.js console.log(process.env.REACT_APP_API_URL);
주의: 클라이언트 번들에 포함된 환경변수는 브라우저에서 노출되므로, 민감한 API Key는 서버 사이드에서만 사용해야 합니다.
3. Python 환경에서 python-dotenv 사용법
Python에서는 python-dotenv 라이브러리를 사용합니다. 사용법은 Node.js와 유사하지만 os.environ 딕셔너리에 로드됩니다.
설치 및 기본 설정
- 설치:
pip install python-dotenv - .env 파일 생성 (프로젝트 루트):
DATABASE_URL=postgresql://user:pass@localhost/dbname SECRET_KEY=django-insecure-key-12345 DEBUG=True
- Python 코드에서 로드:
from dotenv import load_dotenv
import os
load_dotenv() # .env 파일 로드
db_url = os.getenv('DATABASE_URL')
secret_key = os.getenv('SECRET_KEY')
debug = os.getenv('DEBUG') == 'True'
print(f"Database: {db_url}")
Django/Flask 프레임워크 통합
Django settings.py:
from pathlib import Path
from dotenv import load_dotenv
import os
BASE_DIR = Path(__file__).resolve().parent.parent
load_dotenv(os.path.join(BASE_DIR, '.env'))
SECRET_KEY = os.getenv('SECRET_KEY')
DEBUG = os.getenv('DEBUG') == 'True'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.getenv('DB_NAME'),
'USER': os.getenv('DB_USER'),
'PASSWORD': os.getenv('DB_PASSWORD'),
}
}
Flask app.py:
from flask import Flask
from dotenv import load_dotenv
import os
load_dotenv()
app = Flask(__name__)
app.config['SECRET_KEY'] = os.getenv('SECRET_KEY')
app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL')
꿀팁: load_dotenv()는 이미 설정된 환경변수를 덮어쓰지 않으므로, 운영 환경에서 시스템 환경변수가 우선 적용됩니다. 덮어쓰기가 필요하면 load_dotenv(override=True)를 사용하십시오.
4. 보안 체크리스트 및 실전 팁
.gitignore 필수 등록
# .gitignore .env .env.local .env.*.local
.env.example 파일을 만들어 키 이름만 공유하고 실제 값은 제외합니다.
# .env.example DB_HOST= DB_USER= DB_PASSWORD= API_KEY=
GitHub Secret Scanning 대응
GitHub는 Public 저장소에 푸시된 AWS Access Key, Stripe API Key 등을 자동 탐지하여 경고합니다. 이미 노출된 키는 즉시 폐기(Revoke)하고 재발급해야 합니다. Git 히스토리에서 완전히 제거하려면 다음 명령을 실행하십시오.
# BFG Repo-Cleaner 사용 (git-filter-branch보다 빠름) bfg --replace-text passwords.txt # 민감 문자열 치환 git reflog expire --expire=now --all git gc --prune=now --aggressive git push --force
주의: force push는 협업 중인 저장소에서 충돌을 일으킬 수 있으므로 팀원과 사전 공유 후 진행하십시오.
운영 환경 배포 시 권장 사항
- Docker: docker run 시
--env-file .env옵션 사용 또는 docker-compose.yml에서 env_file 지정 - Kubernetes: Secret 리소스를 생성하고 Pod에 envFrom으로 주입
- AWS: Systems Manager Parameter Store 또는 Secrets Manager 사용 후 애플리케이션 시작 시 SDK로 로드
- Vercel/Netlify: 대시보드의 Environment Variables 섹션에서 GUI로 등록
성능 팁: load_dotenv()나 config()는 파일 I/O가 발생하므로 애플리케이션 시작 시 1회만 호출하고, 런타임 중 반복 호출하지 마십시오.
정리 및 Action Item
환경변수 관리는 보안과 배포 자동화의 출발점입니다. .env 파일로 로컬 개발 환경을 정리하고, .gitignore 등록과 Secret Manager 도입으로 운영 환경까지 안전하게 확장할 수 있습니다. 지금 당장 실행할 Action Item: 현재 진행 중인 프로젝트의 하드코딩된 API Key를 찾아 .env로 이동하고, .gitignore에 .env를 추가한 뒤 git log에 민감 정보가 남아있는지 점검하십시오.
# 함께 보면 좋은 글
댓글
댓글 쓰기