플라스크 등의 라이브러리를 사용할 때, 배포 전에 깃허브에 올려둘 때, 몽고디비 클라이언트의 주소와 아이디 비밀번호를 그대로 노출해서 곤란한 상황을 겪을 수 있다. (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
입력한 몽고디비 주소가 잘 출력됐다면 성공이다.
당연한 얘기지만 응용하면 더 많은 변수를 이렇게 숨길 수 있다. 웹앱이 문제 없이 구동되는 것까지 확인해보자!
'Python' 카테고리의 다른 글
[파이썬으로 웹개발] wsgi, 내가 플라스크 개발하는데 그런 거까지 알아야 되니? (0) | 2021.10.19 |
---|---|
KPT 프로젝트 리뷰 :: "오늘뭐먹지?" 프로젝트 2,3주차 되짚어보기 (0) | 2021.10.19 |
[파이썬으로 웹개발] flask를 wsgi 서버에서 구동하기 (https 프로토콜) (0) | 2021.10.02 |
[파이썬으로 웹개발] 플라스크 NGINX 서버를 우분투 18.04에 설치하기 (0) | 2021.10.01 |
[파이썬으로 웹개발] 플라스크 geolocation api 사용하기: Use a producttion WSGI server instead. (0) | 2021.10.01 |
댓글