본문 바로가기
카테고리 없음

파이썬에서 계정 정보를 숨기고 싶다면? 파이썬 env 파일 사용 방법!

by 수메르 여행자 2024. 3. 13.

ENV 파일이 필요한 이유

안녕하세요

보통 web 개발을 할 때는 next.js / react.js / remix.js 등등등... 에서는 보통 '.env' 파일을 사용하여 API 키나 사용자에게 노출되어서는 안 되는 값을 숨깁니다

 

출처 : 구글 클라우드 _+ OFD. WHY WE USE API KEY AND AUTH SETTINGS

그렇지만 보통 파이썬에서는 하드코딩으로 때려박는 경우가 많아 깃허브에 잘못 커밋되는 경우도 허다하죠 ( 유출 등 )

 

import pymysql

userd = 'root'
passwordd = 'root'

connection = pymysql.connect(host='localhost', port=3306, user=userd, password=passwordd, db='test')

 

보통 강의 등에서는 위와 같이 테이블에 접속하는 코드를 작성하는 경우가 많습니다

왜냐하면 수정도 편하고 굳이 이 코드를 커밋하거나 유출되는 경우가 적고 유출되더라도 localhost DB를 사용하기 때문이죠

 

그런데/.. 외부접속 하는 경우에는 이걸 실제 IP로 때려박는 경우가 많습니다

저도 배울 때 자체로서는 그냥 하드코딩 해도 된다고 배웠구요

 

이러다가 커밋 잘못해서 실제로 공부용 DB가 암호화된 적이 있습니다

 

ENV 사용

ENV파일을 사용하면 ENV로부터 값을 반환받아야 하기 때문에 이런 코드가 유출되더라도 의미를 잃게 됩니다

 

 

우선 이런 식으로 프로젝트 폴더를 열고 . env 파일을 생성합니다

( 이름 붙이지 말고 .env )로 생성하세요

 

 

그리고 .gitignore 파일을 생성해서 .env 파일을 무시하도록 설정합니다

 

 

이런 식으로 .git add .

 > git status

를 쳐 보면 .env를 원하는 대로 추적하지 않음을 알 수 있습니다

 

다시 ENV를 열고 여기에 비밀 정보를 입력해줍니다

 

이렇게 세상에서 제일 중요한 키를 입력해주시구요

> 실제로 패스워드나 아이디 이렇게 살려두면 망합니다 ( 무차별 대입 공격 : 브루트포스 에 걸립니다 )

> 이렇게 하고 싶으면 외부접속 막아두고 내부망에서만 쓰세요

> 보통은 db는 릴레이 (nginx 등으로 프록시 태우는 경우나 내부망 전용으로 설계하는 경우가 많습니다 )

 

 

자 저희가 만든 .env 가 제대로 읽히는지 확인하기 위해서

이런 식으로 test.py를 짜고 

from dotenv import load_dotenv
load_dotenv()

 

이런 코드를 짜줍니다

이 코드는 간단히 말하자면, 실행하고 있는 컴퓨터에 .env의 내용을 전부 불러와서 환경변수 값으로 임시 저장하고 메모리를 통해 읽겠다 라는 의미입니다

 

이러고 나면 os.environ을 안 해줘도 환경변수가 자동 추가됩니다

 

from dotenv import load_dotenv
load_dotenv()
import os

def print_env():
    print(os.getenv("VERY_VERY_IMPORTANT_SERVER_IP"))
    print(os.getenv("VERY_VERY_IMPORTANT_SERVER_PASSWORD"))
    print(os.getenv("VERY_VERY_IMPORTANT_SERVER_USERNAME"))
    
if __name__ == "__main__":
    print_env()

 

파이썬에서 ENV 파일의 값을 읽을 때는 os.getenv를 통해 환경변수로 등록된 키의 인덱스를 주고 값을 불러옵니다

 

즉 여기서 파란색의 인덱스를 치면 주황색?의 값을 가져온다는 뜻이죠

위의 파이썬 코드를 실행하면

 

이런 식으로 env 속의 값들이 잘 불러와지는 걸 알 수 있습니다