django-environ으로 민감 정보와 환경변수 안전하게 관리하기

django-environ을 활용해 개발/테스트/운영 환경별 설정과 SECRET_KEY, DB 접속 정보 등 민감 정보를 코드와 분리하여 보안성과 관리 효율성을 높이는 방법

환경변수 관리의 중요성

문제점

  • settings.py에 하드코딩 시 Git 저장소에 민감 정보 노출

  • 환경별 설정 변경 시 코드 직접 수정 필요

  • 팀원 합류 시 로컬 환경 설정 안내의 번거로움

해결 방법

  • Twelve-Factor App 원칙에 따른 설정과 코드의 완전 분리

  • django-environ을 통한 환경변수 기반 설정 관리

기본 설정 및 사용법

설치

pip install django-environ

.env 파일 생성

SECRET_KEY='your-super-secret-and-long-django-secret-key'
DEBUG=True
DATABASE_URL='psql://user:password@localhost:5432/mydatabase'
ALLOWED_HOSTS=localhost,127.0.0.1,.your-domain.com

.gitignore 필수 추가

.env

settings.py 적용

import os
import environ
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

env = environ.Env(
    DEBUG=(bool, False)
)

environ.Env.read_env(os.path.join(BASE_DIR, '.env'))

SECRET_KEY = env('SECRET_KEY')
DEBUG = env('DEBUG')
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')
DATABASES = {
    'default': env.db()
}

실무 활용 팁

협업을 위한 .env.example 파일

  • 실제 값 대신 예시 값으로 구성

  • Git에 포함하여 필요한 환경변수 목록 공유

타입 캐스팅 활용

  • env.bool(): 불리언 변환

  • env.int(): 정수 변환

  • env.list(): 콤마 구분 리스트 변환

  • env.json(): JSON 형식 변환

기본값 설정

SOME_API_KEY = env('SOME_API_KEY', default=None)
PAGINATION_SIZE = env.int('PAGINATION_SIZE', default=20)

Docker 환경 대응

  • 로컬: .env 파일 활용

  • 운영: 컨테이너 환경변수 직접 주입

  • 시스템 환경변수가 .env 파일보다 우선 적용

보안 주의사항

SECRET_KEY 생성

from django.core.management.utils import get_random_secret_key
print(get_random_secret_key())

Last updated