본문 바로가기
Python

몽고디비 주소를 그대로 깃에 올려버렸다고??? 파이썬 MongoDB 환경변수 설정하기

by 돈민찌 2021. 10. 4.
반응형

플라스크 등의 라이브러리를 사용할 때, 배포 전에 깃허브에 올려둘 때, 몽고디비 클라이언트의 주소와 아이디 비밀번호를 그대로 노출해서 곤란한 상황을 겪을 수 있다. (AWS 키 파일은 말할 것도 없다.)

보통 일반적으로는

 

from flask import Flask, request, jsonify, render_template, Response
from pymongo import MongoClient  # 몽고디비
app = Flask(__name__)

# client = MongoClient('localhost', 27017)  # 배포 전에 원격 db로 교체!
# 01
client = MongoClient("mongodb://id:password@localhost:27017") 
# 02
client = MongoClient("mongodb://id:password@localhost", 27017) 
# 03
client = MongoClient("mongodb://id:password@40.123.110.23", 27017)

 

이런 식으로 올리게 될 AWS 자체의 인스턴스 로컬호스트를 사용하거나, 따로 디비를 활성화한 서버의 주소를 입력해두는데, 여기서 아이디와 패스워드를 기입한 부분까지 모두 퍼블릭 깃허브 리포지토리에서는 타인이 확인할 수 있는 점이 문제가 된다. 

이번 프로젝트에서도 배포 서비스를 받아서 배포를 하는 바람에 이 부분을 놓치고 배포를 해서 아이디와 비밀번호가 노출되었으니 숨기는 것이 좋겠다는 조언을 듣게 되었다. 그래서 이 부분을 환경 변수로 가리는 방법을 공유하고자 한다. 

첫번째! 시스템 환경 변수 직접 설정하기!!

시스템 환경 변수 편집을 검색한다.

윈도우 환경에서는 이렇게 "시스템 환경" 혹은 "환경 변수"를 입력하면 제어판으로 연결되는 바로가기가 나타난다.

환경 변수 버튼을 클릭한다.

그 다음 환경 변수라는 버튼을 클릭한다.

시스템 변수 새로 만들기를 클릭한다.

숨기고자 하는 변수를 값으로, 그것을 불러올 키를(의미 파악할 수 있어야 나중에 관리가 쉬움) 입력한다.

참 쉽죠?

확인을 누르면 끝이다. 

두번째! 마 개발자답게!! 파이썬으로 해결해라!!!

파이썬 파일 하나를 만든다. 올리고자 하는 리포지토리와 같은 폴더 안에 두지 않도록 유의한다.

from os import environ

environ['MONGO_DB_PATH'] = "mongodb://test:password@localhost:27017"

위와 같이 입력하고 실행한다. 그리고 첫번째 방법으로 확인해보면 똑같이 잘 들어가 있다!! (결국 둘다 해보긴 해야하잖??)

🙋‍♂️엥 저는 잘 안되는데요???? 

🚨 가상환경에서 os.environ을 직접적으로 조정하는 파이썬 코드를 실행하면 운영체제가 가상환경으로 분리되어 있기 때문에 바뀌지 않을 수 있다고 합니다!!

사실 커맨드라인에서도 해결할 수 있다.

  • bash/ubuntu의 경우 export 키=값 (이퀄기호사용)
  • window cmd 의 경우 setx 키 값 (띄어쓰기임)
  • powershell 의 경우 $Env:키="값" (쌍따옴표 사용)

키나 값에 특수기호가 들어가면 그에 맞는 처리가 필요하긴 하지만 일단은 예외로 두자.

그리고 이제 이 값을 꺼내 쓸 차례다. 다음과 같이 플라스크 앱 파일을 바꾼다.

from flask import Flask, request, jsonify, render_template, Response
from pymongo import MongoClient  # 몽고디비
import os

app = Flask(__name__)
# client = MongoClient('localhost', 27017)  # 배포 전에 원격 db로 교체!
client = MongoClient(os.environ.get("MONGO_DB_PATH"))

훨씬 안전해진 느낌이 든다면 성공이다. 참 쉽죠??

아니 그러면 AWS나 타 사이트에 배포할 때는 어떡하란 말이냐 로컬에서만 인식되는거 아니냐!!

맞다. 정확한 지적이다. 실제로 협업을 하는 팀원들조차 이렇게 해당 파일을 환경 변수에 입력해야 웹앱이 동작한다.

그렇다면 원격 서버에는 이 값을 어떻게 넘겨줄까?

깃배시 등을 이용해 해당 인스턴스의 우분투에 접속한 뒤

sudo nano /etc/profile

을 입력해주면, 서버 실행 시에 우선적으로 실행될 스크립트를 삽입할 수 있다. 알아듣기 힘든 내용이 많을텐데 무시하고 가장 끝까지 내려와서, 몽고디비의 주소값을 입력해준다. (참고로 이 명령문 자체는 이 파일 밖에서 직접 명령할 수도 있는 배시 명령문이다.)

export MONGO_DB_PATH=mongodb://test:password@localhost:27017

그리고 Ctrl + x (닫기)를 누르고 Shift + Y(저장), Enter (이름변경x)를 누른다. 이대로 두면 서버가 실행될 때마다 이 스크립트가 실행될 것인데, 일단 지금 실행을 해보고 바로 확인도 해보자. 

source /etc/profile
echo $MONGO_DB_PATH

입력한 몽고디비 주소가 잘 출력됐다면 성공이다.

당연한 얘기지만 응용하면 더 많은 변수를 이렇게 숨길 수 있다. 웹앱이 문제 없이 구동되는 것까지 확인해보자!

반응형

댓글