
지난 포스팅을 통해 개인 DB 에 접근한 API 서버를 구축하는 과정을 기록하였다. 이제 내가 특정 질문을 ChatGPT 에게 하면 이 API 에 접근하도록 설계해서 DB 에 있는 운동 기록 data 에 접근하면 되겠다라는 단순한 생각으로 ChatGPT 만들기를 시도하였다. 하지만 뭐 해석하긴 어렵지 않지만 한번에 이해할 수 없는 에러가 발생하였고, 이유를 찾아보니 보안 요구 조건에 부합하지 않는 API 호출 방식이라는 것을 알게 되었다.
1. ChatGPT는 아무 API나 부를 수 없다
OpenAI가 GPTs Tool을 통해 외부 API를 부르게 하기 위해 보안상 요구하는 2가지 조건이 있다.
1-1. HTTPS만 허용한다
- ChatGPT는 HTTP로 된 API는 호출 자체를 금지한다.
- → http://********.iptime.org (차단됨)
- → https:// ******** .iptime.org (허용)
-> ChatGPT는 네트워크 공격, 중간자 공격(MITM) 방지를 위해 암호화된 HTTPS 연결만 허용한다고 한다.
1-2. 루트 도메인 기반 구조여야 한다
- ChatGPT는 “Tool의 주소”를 정할 때 반드시 https://도메인/엔드포인트 구조를 요구한다.
- 포트번호나 비루트 경로는 허용하지 않는다 즉,
→ https://********.iptime.org:5055 ❌
→ https:// ******** .iptime.org/workout/latest ✅
-> 개인적으로 구축한 서버 접근법 ( 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 에 등록하기.
'Project > 개인 Project' 카테고리의 다른 글
| [Project] Proxmox 로 개인 가상화 서버 구축하기 -1- (2) | 2025.07.29 |
|---|---|
| [Project] 개인 DB + ChatGPT 기능의 수정 및 확장 기록 (3) | 2025.07.21 |
| [Project] ChatGPT + 개인 DB 기반 운동기록 API 서버 구축기 (1) | 2025.07.14 |
| [개인 Project] NAS 를 이용한 개인 모니터링 시스템 구축하기 -3 편 (WAS 와 DB 연동) (1) | 2025.05.22 |
| [개인 Project] NAS 를 이용한 개인 모니터링 시스템 구축하기 -2 편 (데이터 DB 저장) (4) | 2025.05.20 |