개발자가 내팔자

[Flask] .env로 환경변수를 관리하여 보안이 든든한 서버를 개발해보자 (dotenv) 본문

WEB/Back-end

[Flask] .env로 환경변수를 관리하여 보안이 든든한 서버를 개발해보자 (dotenv)

야생의 개발자 2022. 8. 1. 23:55

Flask에서 dotenv로 관리하기

https://flask.palletsprojects.com/en/2.1.x/tutorial/factory/#the-application-factory

 

Application Setup — Flask Documentation (2.1.x)

Application Setup A Flask application is an instance of the Flask class. Everything about the application, such as configuration and URLs, will be registered with this class. The most straightforward way to create a Flask application is to create a global

flask.palletsprojects.com

플라스크 공식문서 튜토리얼을 보면 SECRET_KEY가 훤히 노출되어 있는 것을 볼 수 있다.
아무리 튜토리얼이라지만 너무 불편하다. 으으
우리는 보안까지 신경쓰는 멋진 개발자이기 때문에 dotenv를 이용하여 이러한 중요한 정보들을 은밀하게 관리하기로 한다.

import os

from flask import Flask


def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_mapping(
        SECRET_KEY='dev',
        DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
    )

    ... ( 중략 ) ...

    return app

패키지 설치

$ pip install python-dotenv

.env 파일 만들기

.env 파일은 절대로 외부에 공개되어서는 안된다.
시크릿 키나 비밀번호 같은 중요한 정보들을 담고 있기 때문이다.
그렇기 때문에 보통 .gitignore 같은 곳에 아래와 같은 문자열을 추가한다.

(참고로 앞에 .이 붙은 파일들은 숨겨진 비밀의 파일이라는 뜻이다. 터미널에서 그냥 ls 명령어를 쳐도 보이지 않는다.

# Environments
*.env
.env.*

아래는 실제 내가 운영하고 있는 서비스에서 사용하는 .env.sample 파일이다.
보안상의 문제로 인해 Rvalue를 모두 지워놨는데 원래는 key=value 형식으로 되어 있다.

개발 환경에 따라 .env.local / .env.dev / .env.prod 이런 식으로 env파일을 분리해놨다.

PORT=
API_EXTERNAL_PORT=

DB_HOST=
DB_PORT=
DB_NAME=
DB_USER_NAME=
DB_USER_PASSWORD=

REDIS_HOST=
REDIS_PORT=

GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=
GITHUB_CALLBACK_URL=
JWT_SECRET=

EMAIL_AUTH_EMAIL=
EMAIL_AUTH_PASSWORD=
EMAIL_HOST=
EMAIL_FROM_USER_NAME=
EMAIL_ENDPOINT=
FRONT_URL=

SLACK_HOOK_URL=

AWS_REGION=
AWS_ACCESS_KEY=
AWS_SECRET_KEY=
AWS_S3_UPLOAD_BUCKET=

ACCESS_TOKEN_KEY=

ORIGIN_LIST=

코드에 적용해보기

from dotenv import load_dotenv

load_dotenv(verbose=True) # take environment variables from .env.

def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__, instance_relative_config=True)
    
    # Code of your application, which uses environment variables (e.g. from `os.environ` or
	# `os.getenv`) as if they came from the actual environment.
    app.config.from_mapping(
        SECRET_KEY=os.getenv('SECRET_KEY'),
        DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
    )

    ... ( 중략 ) ...

    return app

여기까지 해냈다면 축하한다!

이제 다른 사람들은 우리 코드를 아무리 뒤져봐도 secret_key가 무엇인지 결코 알 수 없을 것이다.
실수로 외부 유출을 하지 않는 한 말이다!!
모두들 소중한 보안을 위해 .env 파일에 꼭꼭 잘 숨기길 바란다. 이상!

 

https://pypi.org/project/python-dotenv/

 

python-dotenv

Read key-value pairs from a .env file and set them as environment variables

pypi.org

 

Comments