장고 심화 공부 중 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 정보, 포트 등등 보안에 관련한 이슈들이 있으므로
따로 관리하지 않았다면 배포 전에 미리 보안 처리를 확인해야한다.
때문에 프로젝트를 처음 생성할 때부터 분리하여 관리하는 게 좋다!
'AI 웹개발반' 카테고리의 다른 글
[TIL] 오늘 공부, DRF 개인과제 진행 중 (0) | 2023.04.26 |
---|---|
[TIL] 오늘 정리, Restful API 공부 (0) | 2023.04.25 |
[WIL]:06 장고 심화 주간 (0) | 2023.04.23 |
[TIL] signin기능 사용에서의 500, 401 오류 해결 (0) | 2023.04.21 |
[TIL] python class, 장고 자주 쓰는 코드 정리 (3) | 2023.04.20 |