brunch

You can make anything
by writing

C.S.Lewis

by Younggi Seo Mar 30. 2023

Python에서의 ChatGPT 3.5 구현

.gitignore를 통해 외부로 API_KEY 노출시키지 않는 방법






Python에서 실행시킨 ChatGPT3.5를 통해 OpenAI와 대화를 나눠봤다.



여기서 다룰 내용은 OpenAI API를 가져와서 나의 파이썬 IDE(Visual Studio)에서 ChatGPT를 구현하는 거다. 그전에 개인 API 키를 OpenAI 사이트의 API 키 페이지(회원 가입 이후)에서 발급받아야 한다. API 키는 아래 화면의 OpenAI 사이트에도 설명되어 있듯이, ChatGPT에 가입한 사용자가 인증(authentication, ChatGPT 사용권한을 부여하기 위한 신원 증명)을 위해 사용해야 한다.  



1_ 아래 화면에서처럼 API 키 페이지에서 '+ Create new secret key' 버튼을 누르면 API 키 암호가 새로 생성된다.


2_ 발급한 API 키를 복사(오른쪽 초록색 라디오 버튼 클릭)한다.


3_ 복사한 키를 아래와 같은 OpenAI에서 제공하는 소스 코드에서 붙여 넣기('하드코딩*')한다.

필자는 현재 여기 보이는 api_key 변수에 박힌 값을 그대로 사용하고 있어서 도용가능 하다. 하지만 굳이...


이 하드코딩이 해킹의 원인이 될 수 있다. 하드코딩이란, 어떠한 매개변수를 통해서 인자값(argument)을 전달하지 않고 해당 인자값(여기서는 API_KEY)을 그대로 노출시켜서 코딩하는 것을 말한다. 요즘 클라우드를 사용하는 많은 IT 기업에서 이렇게 API 키와 같이 인증이 가능한 ID나 패스워드를 하드코딩한 소스코드를 github repository 올리는 경우가 많은데, 우발적인 해커의 github 스캐닝에 의해 해당 문자열(plain text)들이 노출되면 이후 여러 가지 공격으로 이어질 수 있다.



4_ 아래 화면의 OpenAI 사이트에서 서비스 구현을 따라 해 볼 수 있게끔 만든 튜토리얼들이 있는데, 이 중에 Chat이라는 아이콘을 선택한다


5_ 들어가면 도입 부분에 ChatGPT를 구현하기 위한 소스코드를 확인할 수 있다.



6_ 소스 코드의 커스터마이제이션을 하면 필자가 처음에 보인 화면과 같이 실제 ChatGPT 애플리케이션 서비스와 같이 연속적으로 질의응답을 받을 수 있다. 해당 구현 과정은 아래 영상을 따라 하면 쉽게 된다.




7_ 필자가 이 섹션에서 강조하는 바는 하드코딩하지 말라는 것이다. 다행히 위의 영상에서의 개발자도 아래와 같이 API 키를 환경변수를 이용해서 가져오거나 아니면, 특정 로컬(내 컴퓨터) 위치에 저장해서 해당 경로를 지정해 주는 방법으로 가이드한다.



8_ 하지만 이보다 더 안전한 방법이 있으니, 해당 과정은 아래 외국 개발자 유튜브 영상을 참조하면 되는데, 필자가 하드코딩하지 않고 github에 소스코드를 업로드(push)하는 방법을 하나씩 보여주겠다.

.gitignore를 이용해서 github에 올리는 소스코드에서 특정파일(.env)들을 제외시킬 수 있다.


dotenv 모듈(라이브러리)로부터 load_dotenv를 임포트하고, .env파일과 .gitingnore라는 파일을 생성해서 여기에 환경 변수를 세팅하면, 윈도에 ChatGPT 인증을 위한 API_KEY 환경변수를 따로 만들지 않고도 소스 코드 내에서 안전하게 키 값을 보관할 수 있다. 또한 github repository에 소스를 커밋할 때 키 값이 든 파일을 업로드(push)시키는 것을 예방할 수 있다.




.gitignore를 통해 외부로 API_KEY 노출시키지 않는 방법


1) 일단 기존의 chatGPT를 파이썬에서 구현하기 위한 소스코드의 상단에 아래와 같은 몇 가지 구문을 추가한다.

from dotenv import load_dotenv
import os
import openai

load_dotenv()  # take environment variables from .env.

API_KEY = os.getenv("api_key")

print(os.getenv("api_key"))
일단 os 함수와 dotenv 모듈을 임포트 하고 load_dotenv함수를 호출한다. 그리고 기존의 API_KEY 변수에는 매개변수 api_key를 대입한다.




2) 위의 소스 코드에서 api_key 매개변수(파라미터)를 통해 실제 키 값을 잘 불러오는지 print() 함수를 통해 확인해 보기 전에 .env 파일을 아래와 같이 생성한다. 앞의 소스코드를 실행시켰을 때, api_key에 대입한 값이 제대로 출력된다면 앞으로 api_key나 평문(하드코딩값)으로 노출되면 안 되는 비밀번호나 이메일 주소 등 개인정보 등을 이 파일에 저장시키면 된다.

.env 파일에 API_KEY의 값을 저장한다.




3) .gitignore라는 파일을 하나 더 만든다. 이 파일에는 본인이 작성한 소스코드를 커밋할 때 자동으로 github에 업로드시키지 말아야 하는 파일들을 지정할 수 있다. 여기서는 .env 파일이므로 .gitignore 파일에 아래와 같이 .env 를 입력한다.



4) 추가로 gitignore.io 사이트로 가서 현재 자신의 런타임 환경에서 사용하고 있는 OS와 언어를 검색해서 외부로 노출이 되면 위험한 파일들을 아래와 같이 생성할 수 있다.


생성된 .gitignore 블록들을 복사해서 .gitignore 파일에 붙여 넣기 한다



5) 이제 다 됐다. 지금부터 자신의 IDE(필자는 Visual Studio)에서 환경변수는 .env 파일의 특정 매개변수명(파라미터)으로 저장시키고 필요하면 아래와 같이 getenv 함수를 통해서 해당 파라미터만을 로드하면 되고, 커밋할 때는 .env 파일이 github에 업로드되지 않으므로 외부로 클라이언트의(개인이 사용하는) 비밀값들을 노출시키지 않을 수 있다.



API_KEY = os.getenv("api_key")



쉽죠잉?


2023년 2월부로 dotenv 라이브러리는 deno_std 라이브러리의 일부가 되었다고 한다.

참조 : https://github.com/pietvanzoen/deno-dotenv

DEPRECATED: Dotenv is now a part of deno_std
매거진의 이전글 PC keylog 레코딩 해킹
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari