개발일기

Django SECRET_KEY 관리하기 본문

오늘의 공부일기/장고 공부일기

Django SECRET_KEY 관리하기

츄98 2023. 4. 29. 00:37

장고 시크릿키는 보안상을 위해서라도 공개되어서는 안 된다.

 

장고 시크릿키를 관리하는 방법은 다음과 같다..!!

 

< secrets.json 파일을 만들어 관리하기 >

STEP1. settings.py에 모듈 설치하기

import os, json
from django.core.exceptions import ImproperlyConfigured

 

STEP2. secrets.json 파일 만들기

secrets.json 파일을 만든 뒤에 거기에

{
	"SECRET_KEY":"시크릿키"
}

이렇게 시크릿키를 저장한다.

 

STEP3. settings.py에 다음 코드들을 입력하기

# SECURITY WARNING: keep the secret key used in production secret!
secret_file = os.path.join(BASE_DIR, 'secrets.json')

with open(secret_file) as f:
    secrets = json.loads(f.read())

def get_secret(setting, secrets=secrets):
    """비밀 변수를 가져오거나 명시적 예외를 반환한다."""
    try:
        return secrets[setting]
    except KeyError:
        error_msg = "Set the {} environment variable".format(setting)
        raise ImproperlyConfigured(error_msg)
    

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = get_secret("SECRET_KEY")

secrets.json 파일을 열어서 그 값을 읽은 후에, get_secret(setting, secrets = secrets) 함수를 통해 변수를 읽거나 예외를 가지고 온다. 

 

SECRET_KEY = get_secret("SECRET_KEY")

secrets.json에서 "SECRET_KEY" 라는 키 값을 읽어오도록 하는 것이다.

 

더보기

error_msg는 ImproperlyConfigured 예외를 발생시키기 전에 생성된 문자열로,

error_msg는 설정(setting)을 인자로 받아 해당 설정에 대한 환경 변수가 설정되지 않았음을 알려주는 메시지를 생성한다.

 

raise ImproperlyConfigured(error_msg)는 ImproperlyConfigured 예외를 발생시키는 코드이다.

raise 키워드를 사용하여 예외를 명시적으로 발생시킬 수 있고, 예외가 발생하면 프로그램의 실행 흐름이 중단되고 해당 예외를 처리할 수 있는 상위 코드 블록으로 이동한다.

 

ImproperlyConfigured는 일반적으로 프로그램의 설정이 부적절하거나 올바르게 구성되지 않았을 때 발생하는 예외이다. 예를 들어, 환경 변수가 설정되지 않았거나 잘못된 값으로 설정되었을 경우에 이 예외가 발생할 수 있다.

 

따라서 get_secret 함수는 setting을 키로 사용하여 secrets 사전에서 값을 찾으려고 시도하고, 값이 존재하지 않을 경우 KeyError 예외가 발생한다.

이때 ImproperlyConfigured 예외가 error_msg와 함께 발생하며, 이 예외는 setting에 대한 환경 변수가 설정되지 않았음을 나타내고, 예외를 처리하는 코드에서 이에 대한 적절한 조치를 취할 수 있다.

 

 

STEP4. gitignore에 secrets.json 추가하기

 

이로써 github에 시크릿키가 노출되는 것을 막을 수 있다. 

또 다른 숨기고 싶은 정보가 있을 경우도, secrets.json에 추가해줌으로써 계속 숨길 수 있다.

 

예를 들어 이메일 인증 코드의 경우, 보안상 관리자계정의 이메일비번을 보이면 안 된다.

그럴 때,

# settings.py
EMAIL_HOST_PASSWORD = get_secret('mail_password')

#secrets.json
{
	"mail_password":"이메일비번"
}

이런 식으로 get_secret 함수를 통해 숨길 수 있다.