코드에 비밀번호를 넣으면 안 되는 이유 – 환경변수 이해하기

1. GitHub에 비밀번호가 올라간다는 것의 의미

초보 개발자들이 자주 저지르는 실수 중 하나가 데이터베이스 비밀번호, API 키, 시크릿 키 같은 민감한 정보를 코드에 직접 적어서 GitHub에 올리는 것입니다.

공개 저장소라면 전 세계 누구나 이 정보를 볼 수 있습니다. 실제로 GitHub에서 AWS_SECRET_KEY, DB_PASSWORD 같은 키워드로 검색하면 수많은 노출 사례가 나옵니다. 공개된 AWS 키는 수분 내에 누군가 발견해 악용하는 경우가 비일비재합니다.

이 문제를 근본적으로 해결하는 방법이 환경변수를 사용하는 것입니다.

2. 환경변수란 무엇인가?

**환경변수(Environment Variable)**는 운영체제 수준에서 관리되는 키-값 쌍의 변수입니다. 프로그램이 실행될 때 이 변수를 읽어 사용하므로, 민감한 정보를 코드 밖에 두고 실행 시점에 주입할 수 있습니다.

방송국 생방송 진행을 생각해보세요. 대본(코드)에는 “여기서 협찬사 이름을 말한다”고만 적혀 있고, 실제 협찬사 이름은 방송 직전에 별도 메모(환경변수)로 전달받습니다. 대본 자체에는 협찬사 이름이 없으니 대본이 유출되어도 문제가 없습니다.

환경변수를 사용하면 동일한 코드를 개발 환경과 운영 환경에서 서로 다른 설정으로 실행할 수도 있습니다.

3. 리눅스에서 환경변수 확인하고 설정하기

현재 설정된 모든 환경변수를 출력합니다.

printenv

특정 환경변수 값을 확인합니다.

echo $HOME
echo $PATH

현재 터미널 세션에서만 임시로 환경변수를 설정합니다. 터미널을 닫으면 사라집니다.

export DB_PASSWORD=mysecretpassword

로그인할 때마다 자동으로 설정되게 하려면 홈 디렉토리의 .bashrc 파일에 export 구문을 추가합니다.

sudo nano ~/.bashrc

파일 맨 아래에 아래처럼 추가하고 저장합니다.

export DB_HOST=localhost
export DB_PASSWORD=mysecretpassword

저장 후 즉시 적용합니다.

source ~/.bashrc

4. .env 파일 활용법

여러 환경변수를 관리할 때는 프로젝트 루트에 .env 파일을 만들어 한 곳에서 관리하는 것이 일반적입니다.

.env 파일은 아래처럼 작성합니다.

DB_HOST=localhost
DB_PORT=3306 DB_USER=myapp
DB_PASSWORD=mysecretpassword
JWT_SECRET=myjwtsecretkey123
AWS_ACCESS_KEY_ID=AKIA…
AWS_SECRET_ACCESS_KEY=…

Node.js에서는 dotenv 패키지를 사용해 .env 파일을 읽습니다.

require(‘dotenv’).config();
const dbPassword = process.env.DB_PASSWORD;

Python에서는 python-dotenv 패키지를 사용합니다.

from dotenv import load_dotenv
import os
load_dotenv()
db_password = os.getenv(‘DB_PASSWORD’)

5. .gitignore로 .env 보호하기

.env 파일을 만들었다면 절대 Git에 올라가지 않도록 .gitignore 파일에 추가해야 합니다.

프로젝트 루트의 .gitignore 파일을 열어 아래 줄을 추가합니다.

.env
.env.local
.env.development
.env.production

.gitignore에 추가한다고 기존에 올라간 파일이 자동으로 삭제되지는 않습니다. 이미 추적되고 있는 파일은 아래 명령으로 Git 추적에서 제외합니다.

git rm –cached .env

이후 커밋하면 원격 저장소에서도 제거됩니다.

6. 실수로 올렸다면 즉시 해야 할 것

이미 .env 파일이나 비밀번호가 포함된 코드를 GitHub에 올렸다면 파일을 삭제해도 Git 히스토리에 남아있습니다. 커밋 기록을 뒤지면 내용을 볼 수 있습니다.

즉시 해야 할 일은 다음과 같습니다. 노출된 비밀번호, API 키, 시크릿을 즉시 변경하거나 재발급합니다. AWS 키라면 IAM 콘솔에서 즉시 비활성화하고 새 키를 발급합니다. git filter-branch 또는 BFG Repo-Cleaner 도구로 히스토리에서 민감 정보를 제거합니다.

7. 서비스별 환경변수 주입 방법

systemd 서비스 파일에 주입 systemd로 관리하는 서비스에는 서비스 파일 편집으로 환경변수를 주입합니다.

sudo systemctl edit 서비스명

편집기에서 아래 형태로 입력합니다.

[Service]
Environment=”DB_PASSWORD=mysecretpassword”
Environment=”JWT_SECRET=myjwtsecretkey”

Docker에서 환경변수 주입 Docker 실행 시 -e 옵션이나 --env-file 옵션으로 .env 파일을 직접 전달합니다.

AWS Parameter Store / Secrets Manager 팀 단위 프로젝트나 보안이 중요한 서비스에서는 클라우드 서비스의 비밀 관리 도구를 활용합니다. 앱이 실행 시 API로 필요한 값을 가져오는 방식이라 파일에 저장하지 않아 더 안전합니다.

8. 정리 및 다음 단계

오늘 배운 핵심을 정리합니다.

  • 비밀번호, API 키 같은 민감 정보는 절대 코드에 직접 쓰지 않습니다.
  • 환경변수를 사용하면 실행 시점에 외부에서 설정값을 주입할 수 있습니다.
  • .env 파일에 환경변수를 모아 관리하고 반드시 .gitignore에 추가합니다.
  • 이미 올렸다면 즉시 비밀번호를 변경하고 히스토리를 정리합니다.

다음 글에서는 SSH 세션이 끊겨도 프로세스가 계속 돌아가게 하는 nohup과 백그라운드 실행 방법을 알아보겠습니다.

댓글 남기기

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.