SECRET_KEY란?
Django의 SECRET_KEY는 프로젝트의 보안을 위한 중요한 암호화 키입니다. 다음과 같은 곳에서 사용됩니다:
- 세션 데이터 암호화
- CSRF 토큰 생성
- 비밀번호 재설정 토큰 생성
- 기타 보안이 필요한 암호화 작업
SECRET_KEY를 보호해야 하는 이유
- 보안 취약점 예방
- SECRET_KEY가 노출되면 세션 하이재킹이나 CSRF 공격에 취약해질 수 있습니다
- 악의적인 사용자가 암호화된 데이터를 복호화할 수 있게 됩니다
- 프로젝트 무결성 보호
- 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 추가
환경 변수 관리의 장점
- 보안성
- 민감한 정보를 코드와 분리하여 관리할 수 있습니다
- 실수로 GitHub에 업로드되는 것을 방지할 수 있습니다
- 유연성
- 개발, 테스트, 운영 환경별로 다른 설정을 쉽게 적용할 수 있습니다
- 키 변경이 필요할 때 코드 수정 없이 환경 변수만 변경하면 됩니다
- 개발 협업
- 팀원들이 각자의 환경에 맞는 설정을 사용할 수 있습니다
- 예시 .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())
이렇게 하면 환경변수가 없을 때마다 새로운 키를 생성하게 된다고 한다.
다행히 과제라서 괜찮았지만 앞으로는 보안도 생각하면서 공부해야겠다.
'Today I learned' 카테고리의 다른 글
[프로그래머스-SQL]노선별 평균 역 사이 거리 조회하기 (0) | 2025.02.05 |
---|---|
플랫폼별 OAuth 키 발급 방법 (0) | 2025.02.04 |
WIL (0) | 2025.01.31 |
LLM 활용 기법: 프롬프트 트렁케이션, CoT, RAG 개념 정리 (0) | 2025.01.31 |
Nginx (1) | 2025.01.29 |