Django SECRET_KEY 환경변수로 안전하게 관리하기

SECRET_KEY란?

Django의 SECRET_KEY는 프로젝트의 보안을 위한 중요한 암호화 키입니다. 다음과 같은 곳에서 사용됩니다:

  • 세션 데이터 암호화
  • CSRF 토큰 생성
  • 비밀번호 재설정 토큰 생성
  • 기타 보안이 필요한 암호화 작업

SECRET_KEY를 보호해야 하는 이유

  1. 보안 취약점 예방
    • SECRET_KEY가 노출되면 세션 하이재킹이나 CSRF 공격에 취약해질 수 있습니다
    • 악의적인 사용자가 암호화된 데이터를 복호화할 수 있게 됩니다
  2. 프로젝트 무결성 보호
    • GitHub 등에 SECRET_KEY가 포함된 코드가 올라가면 프로젝트가 보안 위협에 노출됩니다
    • 한번 노출된 SECRET_KEY는 즉시 변경해야 하며, 이는 서비스 운영에 큰 부담이 됩니다

환경 변수로 관리하는 방법

1. python-dotenv 설치

pip install python-dotenv

2. .env 파일 생성

프로젝트 루트 디렉토리에 .env 파일을 생성하고 SECRET_KEY를 저장합니다:

DJANGO_SECRET_KEY=your_secret_key_here
DEBUG=False

3. settings.py 수정

import os
from pathlib import Path
from dotenv import load_dotenv

# .env 파일 로드
load_dotenv()

# SECRET_KEY 환경변수에서 가져오기
SECRET_KEY = os.getenv('DJANGO_SECRET_KEY')

4. .gitignore에 .env 추가

 


환경 변수 관리의 장점

  1. 보안성
    • 민감한 정보를 코드와 분리하여 관리할 수 있습니다
    • 실수로 GitHub에 업로드되는 것을 방지할 수 있습니다
  2. 유연성
    • 개발, 테스트, 운영 환경별로 다른 설정을 쉽게 적용할 수 있습니다
    • 키 변경이 필요할 때 코드 수정 없이 환경 변수만 변경하면 됩니다
  3. 개발 협업
    • 팀원들이 각자의 환경에 맞는 설정을 사용할 수 있습니다
    • 예시 .env 파일(.env.example)을 공유하여 필요한 환경 변수를 문서화할 수 있습니다

추가 보안 팁

1. 자동 SECRET_KEY 생성

from django.core.management.utils import get_random_secret_key

if not SECRET_KEY:
    SECRET_KEY = get_random_secret_key()

 

2. 프로덕션 환경 보안 설정

 

if not DEBUG:
    SECURE_SSL_REDIRECT = True
    SESSION_COOKIE_SECURE = True
    CSRF_COOKIE_SECURE = True

 

 

과제 피드백을 받았는데 나 뿐만 아니라 대부분의 사람들이 장고 시크릿키를 깃허브에 올린 일이 발생했다.

휴 그래서 찾아봤더니 배포예정이 없는 과제면 사실 괜찮다고 한다.

그래도 나즁에 배포할 대상이나 배포예정의 결과물을 이렇게 올리면 안되니까...

 

 

이미 올라간 SECRET_KEY를 이력에서 지우고 싶다면:

# GitHub 커밋 이력에서 완전히 삭제
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch 프로젝트명/settings.py" \
--prune-empty --tag-name-filter cat -- --all

# 강제로 push
git push origin main --force

주의: 협업 중인 팀원들은 레포지토리를 다시 클론해야 할 수 있음

 

실제 배포할 계획이 있다면:

  • 즉시 새로운 SECRET_KEY를 생성하고 환경변수로 관리하도록 변경
  • .gitignore에 .env 추가
  • settings.py의 SECRET_KEY를 환경변수로 수정
  • 이전 커밋 이력에서 SECRET_KEY 삭제(위의 2번 방법)

최소한의 안전 조치로는:

# settings.py
from django.core.management.utils import get_random_secret_key

SECRET_KEY = os.getenv('DJANGO_SECRET_KEY', get_random_secret_key())

이렇게 하면 환경변수가 없을 때마다 새로운 키를 생성하게 된다고 한다.

 

 

다행히 과제라서 괜찮았지만 앞으로는 보안도 생각하면서 공부해야겠다.