Project/개인 Project

[Project] ChatGPT + 개인 DB 기반 운동기록 API 서버 구축기 -2-

강_토발즈 2025. 7. 15. 23:10

 

 

 

지난 포스팅을 통해 개인 DB 에 접근한 API 서버를 구축하는 과정을 기록하였다. 이제 내가 특정 질문을 ChatGPT 에게 하면 이 API 에 접근하도록 설계해서 DB 에 있는 운동 기록 data 에 접근하면 되겠다라는 단순한 생각으로 ChatGPT 만들기를 시도하였다. 하지만 뭐 해석하긴 어렵지 않지만 한번에 이해할 수 없는 에러가 발생하였고, 이유를 찾아보니 보안 요구 조건에 부합하지 않는 API 호출 방식이라는 것을 알게 되었다.

 

 

1. ChatGPT는 아무 API나 부를 수 없다

OpenAI가 GPTs Tool을 통해 외부 API를 부르게 하기 위해 보안상 요구하는 2가지 조건이 있다.

 

 1-1. HTTPS만 허용한다

-> ChatGPT는 네트워크 공격, 중간자 공격(MITM) 방지를 위해 암호화된 HTTPS 연결만 허용한다고 한다.

 

 1-2. 루트 도메인 기반 구조여야 한다

-> 개인적으로 구축한 서버 접근법 ( IP 나 포트번호를 통한 웹 페이지 접근이나, API 호출) 이 아니라, 잘 갖춰진 인터넷 도메인의 형태여야 GPT 가 연결을 허용하는 느낌이였다. (보안상 이유니깐 뭐라 할수도 없다) 

 

 

2. 해결방법 

 

2-1. Nginx 의 리버스 프록시 서버 사용

[외부 GPTs] --> HTTPS (443) --> [nginx] --> FastAPI 내부 포트 5000
  • FastAPI는 직접 HTTPS를 제공하지 않는다. 따라서 중간에 nginx라는 프록시 서버를 하나 둬서, nginx가 인증서를 들고 있게 한다.
  • FastAPI는 localhost에서 그대로 실행되며 HTTPS를 신경 쓸 필요가 없게 된다.
  • 즉 단단한 현관문을 하나 설치하는 것!

2-2. Let’s Encrypt 인증서 사용

  • 단단한 현관문만 있으면 지나다니기 힘들다. 따라서 인증이 된 사람들은 자유롭게 다닐 수 있는 도어락 이라고 할 수 있다.
  • HTTPS를 구성하려면 SSL 인증서가 반드시 필요 -> 인증서가 있어야 GPTs도 “이건 믿을 수 있는 사이트다”라고 판단한다.

 

3. 진행시켜

 

3-1. 서버가 구동 될 OS 에, nginx 설치하기

sudo apt update
sudo apt install nginx -y

# 설치 후 상태 확인
sudo systemctl status nginx

 

3-2.certbot 설치 ( Let's Encrypt 인승서 발급용)

sudo apt install certbot python3-certbot-nginx -y

 

 

3-3. FastAPI 서버 기동 ( 외부 5055, 내부 5000 포트에서 실행)

uvicorn main:app --host 0.0.0.0 --port 5000

 

먼저 파이썬 가상화 환경을 실행 후(서버를 구현한 파이썬 파일이 위치한 곳) 백그라운드에서 서버를 실행하고, 터미널 프로그램을 이용해 새로운 새선을 하나 더 연결해서 다른 작업을 진행한다.

 

 

3-4. nginx 리버스 프록시 설정 생성

sudo vi /etc/nginx/sites-available/fastapi

 

내용 입력

server {
    listen 80;
    server_name *******.iptime.org;

    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

 

 

설정 활성화

sudo ln -s /etc/nginx/sites-available/fastapi /etc/nginx/sites-enabled/

 

설정 테스트 및 적용

sudo nginx -t
sudo systemctl restart nginx

 

 

 

3-5. 433 포트, 포트포워딩 설정하기

 

192.168.0.54 의 외부 443 내부 443 포트 포워딩

80번 포트도 포트포워딩 한다.

 

 

3-6. 인증서 발급

sudo certbot --nginx -d *******.iptime.org
  • 이메일 입력
  • 이용 약관 동의
  • “HTTP를 HTTPS로 리디렉션할까요?” →

 

 

 

트러블 발생

 

ipTIME DDNS는 Let’s Encrypt 인증서 발급을 막아놓았다. 현재 내가 이용하려는 도메인은 ipTIME에서 제공하는 무료 DDNS 도메인인데, ipTIME은 자체적으로 CAA 레코드(Certification Authority Authorization) 를 설정해놔서Let’s Encrypt를 포함한 외부 인증기관이 SSL 인증서를 발급하지 못하도록 차단해 놓았다.

 

-> 무료 도메인을 발급받아서 등록하도록 하자

시간이 늦어버려서 "무료 도메인 발급부터 API 호출 ChatGPT 등록"은 내일 이어서 포스팅 하도록 한다

DDNS 가 아니라 공인IP 와 포트번호를 매핑하지 않는 이유는 공인 IP가 변경된다면 매번 이에 맞게 nignx 설정을 바꿔줘야 하기 때문에, 바뀐 공인 IP 에 대응하는 DDNS 를 등록하기로 한다.

 

내일 할 일

 

1. 무료 도메인 생성법 찾아서 적용하기 

 

2. 무료 도메인과 현재 이용중인 DDNS 를 연결

 

3. nginx + certbot 으로 Https 구성 완료

 

4. ChatGPT 에 등록하기.