본문 바로가기
AI 웹개발반

[TIL] Django SECRET_KEY 관리하기

by 째깍단 2023. 4. 24.

장고 심화 공부 중 github에서 메일이 왔다

 

대략 시크릿 키가 노출되었으니 얼른 고치라는 말

 

확인해보니 settings.py에 들어있는 SECRET_KEY 를 그대로 공유한 것이 문제였다.

 

 

지금은 연습 중이고, 배포까지 갈 서비스를 만드는 것이 아니라서 그냥 여상하게 git push를 해왔지만

이후 배포과정에 들어가게 된다면 보안면에 있어 큰 이슈가 될 것이므로 SECRET_KEY를 어떻게 숨길 수 있는지를 찾아보고 적용했다.

 

 

 

 

내가 활용한 방법은 json 파일을 만들어 SECRET_KEY를 넣고, 연결해주는 방법이다.

 

 

이 외에도 환경변수를 설정하는 방법이 있다.

 

1. .env 파일에 넣고 config로 관리하는 방법,

2. python-dotenv 를 설치하여 .env 파일로 관리하는 방법(마찬가지로 .gitignore를 해주어야함)

 

 

 

[참조]:

장고 공식문서의 secret key 설명

https://docs.djangoproject.com/en/4.2/ref/settings/#std:setting-SECRET_KEY

 

참고한 secret key 관련 블로그들

https://wayhome25.github.io/django/2017/07/11/django-settings-secret-key/

https://velog.io/@ghwn/macOS-파이썬-백엔드-개발환경-설정

https://grape-blog.tistory.com/17

https://daco2020.tistory.com/480

 

가상환경의 역사… (어쩌다 여기까지,, 하지만 유익하니까 읽어보도록 하자)

https://spoqa.github.io/2017/10/06/python-env-managers.html

 

 

 

 

장고의 공식문서에 따르면 SECRET_KEY는  특정 Django 설치를 위한 비밀 키로

startproject를 할때 settings.py에 함께 생성된다.

암호화된 서명을 제공하는 데 사용되며 고유하고 예측할 수 없는 값으로 설정되어야 한다.

 

  • SECRET_KEY 가 사용되는 곳은..
    -  django.contrib.sessions.backends.cache 이외의 다른 세션 백엔드를 사용하거나 기본 get_session_auth_hash()를 사용하는 경우의 모든 세션
    - CookieStorage 또는 FallbackStorage를 사용하는 경우 모든 메시지
    - 모든 PasswordResetView 토큰
    - 다른 키가 제공되지 않는 한 암호화 서명 사용

 

장고에 SECRET_KEY가 없으면 프로그램이 동작하지 않고, 암호화 인증이 필요한 모든 곳에서 이용하므로 중요하다! 

 = 노출되면 장고 프로젝트의 보안이 유지되지 않음!

 

그러므로 프로젝트를 시작하는 초기에 환경변수나 비밀파일로 설정하여 배포되지 않도록 하는 것이 좋다고 한다.

 

 

++ 소셜로그인에 필요한 민감정보도 함께 추가한다!

OAuth email 과 password 등

 

 

 

 

Secret Key 등 보안이 필요한 정보 관리 하기

 

  • 환경변수패턴 : SECRET_KEY의 값을 환경변수에 저장하여 참고한다. 
    = .env 파일을 만들어 환경변수로 관리

    터미널로 임시로 설정하는 방법과 영구로 설정하는 방법,
    패키지 decouple 혹은 dotenv를 설치해 적용하는 방법 등이 있는 듯하다



  • 비밀파일패턴 : SECRET_KEY 값을 별도 파일에 저장하여 참고한다.   
    = json으로 별도 파일 관리

 

 

 

✔︎ 어떤 방법을 택하든 .env 파일과 json 파일은 모두 manage.py 와 같은 선상의 디렉터리에 있어야한다 

 

✔︎ 기껏 예외 처리 한 후 git hub에 올리지 않도록 .gitignore에 추가한다

 

#.gitignore 파일에 추가

### SECRET_KEY ###
secrets.json 혹은 .env

 

 

 


 

 

1. decouple 패키지로 관리하기

 

 

먼저 가상환경을 설정한 후 의존성 패키지를 설치한다

 

pip install python-decouple

 

 

 

 

이후 .env 파일을 만들어 secret key를 분리해준다.

settings.ini 파일도 가능하다

 

# settings
from decouple import config

SECRET_KEY = config("SECRET_KEY")


# .env
SECRET_KEY= PROJECT_SECRET_KEY

 

 

 


 

 

2. dotenv 패키지로 관리하기

 

decouple과 마찬가지로  가상환경을 설정하고, Python dotenv모듈을 사용해 환경변수 설정을 해준다.

.env 파일에 값을 저장하고 불러오고 수정할 수 있다

 

 

 

 

dotenv 의존성 설치

pip install python-dotenv

 

 

 

settings.py에 os를 import, 프로젝트 폴더에 .env를 만들고 secret key를 추가한다

 

# settings.py
import os

SECRET_KEY = os.environ.get("SECRET_KEY")


#.env
SECRET_KEY = "PROJECT_SECRET_KEY"

 

 

 

 

 

둘 중 하나의 작업을 하여 dotenv가 secret key를 잘 가져올 수 있도록 한다.

manage.py 에 코드를 작성하거나, settings.py에 코드를 작성!

 

 

 

1. manage.py => main()  함수가 출력되기전에 값을 불러온다

 

# manage.py
import dotenv 

if __name__ == '__main__':
dotenv.read_dotenv()
main()

 

 

 

2. settings.py에 코드 작성

 

불러올 정보들보다 상단에 위치하도록 한다!

 

from dotenv import load_dotenv

dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)

 

 

 

 

[공식문서] : https://pypi.org/project/python-dotenv/

 

 


 

 

 

3. secrets.json 파일로 관리하기

 

secrets.json 파일을 만들어 SECRET_KEY 넣어주고, settings.py와 연결해주면 된다.

 

 

 

 

secrets.json에 키:값을 넣어준다

 

# secrets.json
{
    "SECRET_KEY" : "django-insecure-고유 key 추가"
}

 

 

 

settings.py에 추가 ( secret key를 가져올때 예외처리를 한 코드)

 

#settings.py에 추가

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


secret_file = os.path.join(BASE_DIR, 'secrets.json') # 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)

SECRET_KEY = get_secret("SECRET_KEY")

 

 

 

이후 python3 manage.py runserver로 SECRET_KEY가 잘 연결되었는지 확인하면 잘 작동하는 것을 볼 수 있다.!

 

 

 


 

 

SECRET_KEY외에도 AWS 시크릿 코드, DB 정보, 포트 등등 보안에 관련한 이슈들이 있으므로
따로 관리하지 않았다면 배포 전에 미리 보안 처리를 확인해야한다. 

때문에 프로젝트를 처음 생성할 때부터 분리하여 관리하는 게 좋다!