[TIL] 10월 6일: 민감한 KEY 노출 멈춰!

Jung·2021년 10월 6일
0

TIL

목록 보기
20/77
post-thumbnail

.env 파일

한국관광공사 API를 사용하려면 나의 서비스 키값이 필요하다. 근데 이 키값이 노출이 되면 보안상에 있어서 위험하기 때문에 GitHub에 올린다면 더더욱 조심해야 한다. GitHub에 노출시키지 않기 위해서는 어떤 방법을 사용해야 할까?

환경변수 설정으로 막는 방법은 다양하다. 그 중 나는 python-dotenv 라이브러리를 사용했다.

import os

from dotenv import load_dotenv

우리가 사용할 모듈을 가져온다.
os 모듈은 Operating System의 약자로서 운영체제에서 제공되는 여러 기능을 파이썬에서 수행할 수 있게 해준다.

load_dotenv(verbose=True)
OPEN_API_KEY = os.getenv('OPEN_API_KEY')

load_dotenv() 메소드는 아래와 같이 정의되어 있다.

def load_dotenv(
dotenv_path=None,
stream=None,
verbose=False,
override=False,
**kwargs
)

dotenv_path: .env 파일의 절대경로 및 상대경로
stream: .env 파일 내용에 대한 StringIO 객체
verbose: .env 파일 누락 등의 경고 메시지를 출력할 것인지에 대한 옵션
override: 시스템 환경변수를 .env 파일에 정의한 환경변수가 덮어쓸지에 대한 옵션

우리가 .env라는 파일을 만들어서 파일 안에

OPEN_API_KEY=발급 받은 키 값
키=값 형태

이런 식으로 저장하면 키 값이 OPEN_API_KEY 변수에 담아진다.
그 변수를 os.getenv('OPEN_API_KEY')를 통해 키 값을 불러오고, 또 OPEN_API_KEY라는 변수에 저장한다.

이를 이용해

url = f'{REQUEST_URL}?ServiceKey={OPEN_API_KEY}...

위 코드처럼 OPEN_API_KEY 뿐만 아니라 요청 URL이라든지 노출되면 불안한 부분들을 .env 환경변수 파일에 저장해서 불러오는 형태로 사용하는 것이 좋다.

DB_INFO = os.getenv('DB_INFO')
DB_PORT = os.getenv('DB_PORT')

client = MongoClient(DB_INFO, int(DB_PORT))

MongoDB에 대한 코드도 노출이 된다면 누군가 악의적인 마음을 품고 나의 DB를 삭제시킬 수도 있다!!
그래서 이 부분도 환경변수 파일을 통해 GitHub 노출을 막았다.

GitHub 노출은 어떻게 막나요?? 😎

GitHub에 올라가지 않게 하는 건 간단하다.

.gitignore 파일을 생성하고 파일 안에 .env를 입력하면 .env 파일은 GitHub에 올라가지 않는다.
.env 파일 이외에도 올리고 싶지 않은 파일들이 있다면 .gitignore 파일을 통해 설정할 수 있다. 아주 유용한 기능이다!

참고로 .gitignore 파일은 디렉토리의 최상단 위치에 있어야 한다.

참고
“OS 모듈.” 위키독스, https://wikidocs.net/3141.

“Python - Dotenv 심기.” Velog, https://velog.io/@yvvyoon/python-env-dotenv.


번외

사용하려는 OPEN API의 요청 URL에서 쿼리 파라미터를 상황에 따라 다른 값을 넣고 요청을 보내고 싶다면 어떻게 해야 할까? 일단 내가 어떤 식으로 사용할지 고민부터 한다. 예를 들어 Ajax를 사용하는데 'apple'이라는 데이터가 프론트에서 서버로 넘어오면 Open Api의 정해진 쿼리 파라미터 contentType의 값을 A로 하려고 한다. 'apple'이 아니면 contentType 값을 B로 하려고 한다.

@app.route('/practice', methods=['POST'])
def 함수():
    type_receive = request.form['type_give']

        if type_receive == 'apple':
            content_type = 'A'
        else:
            content_type = 'B'
        
    url = f'{REQUEST_URL}?ServiceKey={OPEN_API_KEY}&contentType={content_type}'
 
    request = requests.get(url)
 
    return ...

이런 식으로 활용해서 유연하게 사용할 수 있다.

profile
97kim.github.io

0개의 댓글