Computer Science/Troubleshooting

[Django] SECRET KEY 관리 방법

_혀니 2022. 8. 14. 22:50
728x90
반응형

Django Secret Key exposed on GitHub!


장고 프로젝트를 GitHub에 올리면 이런 메일이 오게 된다.
secret key가 노출되었다는 뜻이다.
보안상의 이유로 이 키를 보이지 않도록 하는 것이 바람직하다는 내용이다.

SECRET_KEY는 무엇입니까?

SECRET_KEY는 Django의 보안에 아주 중요한 역할을 합니다.
Django 공식문서의 글을 참고하면,

  • SECRET_KEY는 쿠키 데이터의 해시와 암호화 서명에 사용합니다.
  • django.contrib.sessions.backends.cache가 아닌 다른 세션 백엔드 를 사용 중이거나 기본값 get_session_auth_hash()을 사용 중인 경우 모든 세션 입니다.
  • CookieStorageFallbackStorage를 사용하는 경우 모든 메시지.
  • 모든 PasswordResetView.
  • 다른 키가 제공되지 않는 한 모든 암호화 서명 사용.

따라서 SECRET_KEY를 저장소에 올리지 않도록 별도로 설정 해 주어야 합니다.

SECRET_KEY 관리 방법

1. .gitignoresettings.py를 추가하여 아예 업로드하지 않는다.

  • 좋은 방법은 아닙니다. settings.py는 아예 업로드하지 않기에는 너무 많은 설정이 적용되어 있습니다.

2. key.json파일을 생성하여 별도로 관리한다.

key.json 생성
{
    SECRET_KEY = "secret_key"
}

"secret_key"에는 본인 프로젝트의 시크릿 키를 넣습니다.
key.json 파일은 manage.py파일과 같은 위치에 있어야 합니다.


settings.py 변경

 

기존 코드

SECRET_KEY = "secretkey1234"

 

변경한 코드

import os, json

secret_file = os.path.join(BASE_DIR, 'key.json') # 베이스 디렉토리의 키 파일을 불러옵니다.

with open(secret_file) as f:
    secrets = json.loads(f.read()) # 해당 json파일을 읽어들입니다.


def get_secret(setting, secrets=secrets):
    try:
        return secrets[setting] # 지정된 키 값을 가져옵니다.
    except KeyError:
        error_msg = "Set the {} environment variable".format(setting)
        raise error_msg


SECRET_KEY = get_secret("SECRET_KEY") # 원래의 시크릿 키를 이렇게 대체합니다.

단, key.json파일은 GitHub 등 외부에 업로드하지 않도록 반드시 .gitignore에 추가해야 합니다.

728x90
반응형