GPTs API 연결 문제, HTTP 호출도 가능하게 만드는 비법 공개!

소개

GPTs에서 API를 연결할 때 HTTPS 프로토콜을 사용하는 openAPI 호출만 지원됩니다. 그러나 공공데이터포털과 같이 다양한 API 서비스를 제공하는 플랫폼에서는 HTTPHTTPS 프로토콜이 혼합되어 있는 경우가 많습니다. 이로 인해 GPTs에서는 HTTP 프로토콜을 사용하는 API 호출이 정상적으로 작동하지 않는 문제가 발생합니다.

이러한 문제를 해결하기 위해, GPTs에서 직접적으로 HTTP 호출이 불가능한 부분을 보완할 수 있는 리버스 프록시(Reverse Proxy) 도구를 도입하여 호출이 정상적으로 이루어지는지 테스트할 계획입니다. 만약 이 방법으로 문제를 해결할 수 있다면, 정부지원사업에서도 모든 API 호출이 원활하게 이루어질 것으로 기대됩니다.

진행 방법

  • 차례

    • Part 1. cloudflare worker를 통한 GPTs 연동

      • Step 01. 공공데이터포털 OpenAPI 활용신청 및 테스트

      • Step 02. Cloudflare Worker 설정 및 테스트

      • Step 03. GPTs 연동 및 테스트

    • Part 2. nginx를 통한 GPTs 연동

  • 용어 설명

    • 리버스 프록시(Reverse Proxy)는 클라이언트와 서버 사이에 위치하여 클라이언트의 요청을 대신 받아 서버에 전달하고, 서버의 응답을 클라이언트에게 반환하는 중개 서버입니다.

  • 구성도

Part 1. cloudflare worker를 통한 GPTs 연동

Step 01. 공공데이터포털 OpenAPI 활용신청 및 테스트

  • 공공데이터포털이란?

    • 국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Dataset)와 Open API로 제공하는 사이트입니다.

  • 공공데이터포털 검색

  • 인기데이터 > 오픈 API 클릭

한국 웹 사이트의 스크린 샷
  • 활용신청 버튼 클릭

한국어 텍스트가있는 페이지의 스크린 샷
  • 웹 사이트 개발 선택 후 "웹 개발" 입력, 라이선스 표시 "동의합니다." 체크, "활용신청" 버튼 클릭

  • "한국산업인력공단한국산업인력공단국가직무능력표준 정보" 검색

    • 본 사례에서는 "한국산업인력공단한국산업인력공단 국가직무능력표준 정보"를 기준으로 openapi 연동을 설명하겠습니다.

한국어 단어 데이터가있는 페이지의 스크린 샷
  • 해당 서비스 활용신청

  • 마이페이지 클릭

  • API 신청 클릭

  • 한국산업인력공단한국산업인력공단국가직무능력표준 클릭

  • 참고문서 다운로드 및 인증키 확인

  • 참고문서 중 REST(URI) 테스트, serviceKey에는 발급된 인증키로 수정

  • Chrome에서 테스트

https://www.ncs.go.kr/api/openapi1.do?serviceKey=본인인증키&returnType=xml&pageNo=1&numOfRows=10

Step 02. Cloudflare Worker 설정 및 테스트

Cloudflare Workers는 클라우드에서 코드를 실행할 수 있는 서버리스 환경이라, 별도의 서버 없이도 API 요청을 가로채서 변환하거나 프록시 역할을 할 수 있습니다.

  • 로그인 클릭(가입 과정은 생략합니다.)

  • Google로 계속 버튼 클릭

  • 추가 > Workers 클릭

  • Worker 생성 클릭

  • 배포 버튼 클릭

  • 코드 편집 클릭

  • 소스 붙여 넣기, 배포 클릭

  • 소스 내용(worker.js)

export default {
  async fetch(request) {
    const url = new URL(request.url);

    if (url.pathname.startsWith("/ncs")) {
      const apiUrl = "http://www.ncs.go.kr/api/openapi1.do" + url.search;

      const response = await fetch(apiUrl, {
        method: 'GET',
        headers: {
          // Host 헤더를 공공데이터포털 도메인으로 고정
          'Host': 'www.ncs.go.kr',

          // 클라이언트 IP 전달
          'X-Real-IP': request.headers.get('CF-Connecting-IP'),

          // 프록시 요청 흔적 제거
          'X-Forwarded-For': '',
          'X-Forwarded-Host': '',
          'X-Forwarded-Proto': '',

          // 브라우저처럼 보이도록 User-Agent 설정
          'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',

          // Content-Type 및 Accept 설정
          'Content-Type': 'application/xml',
          'Accept': 'application/xml'
        }
      });

      // 응답 반환 (XML 형식 유지)
      const responseData = await response.text();
      return new Response(responseData, {
        status: response.status,
        headers: { "Content-Type": "application/xml" }
      });
    }

    return new Response("Cloudflare Worker Proxy Running", {
      status: 200,
      headers: { "Content-Type": "text/plain" }
    });
  }
}

팁 : 아래 부분을 설정하지 않으면 공공데이터 포털에서 불법 접근으로 인식하여 접근을 거부함.

          // 프록시 요청 흔적 제거
          'X-Forwarded-For': '',
          'X-Forwarded-Host': '',
          'X-Forwarded-Proto': '',

          // 브라우저처럼 보이도록 User-Agent 설정
          'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',

  • Chrome 테스트

https://patient-boat-d070.junsan12.workers.dev/ncs?serviceKey=서비스키입력&returnType=xml&pageNo=1&numOfRows=10

Step 03. GPTs 연동

  • GPT 탐색 클릭

  • 만들기 클릭

  • 새 작업 만들기 클릭

  • ActionGPT에서 도움 받기 클릭

  • 복사 클릭(ActionGPT)

  • 에러 메시지 복사

  • 에러 내용 물어보기(ActionGPT)

  • 복사 클릭(ActionGPT)

  • 에러 해결 확인

  • 서비스 키 작성

팁 : 인증 API키 형식으로 안될 떄에는 서비스 키에 대한 파라미터 이름과 값을 확인하여 값을 enum 형식으로 작성

  • 테스트 클릭

Part 2. Reverse Proxy를 nginx를 사용하는 경우(구성방식만 설명)

nginx 설정은 AWS 클라우드 서비스의 EC2(가상 컴퓨터) 인스턴스를 생성하여 진행했습니다. GPTs에서 호출되는 HTTPS 프로토콜을 처리하기 위해서는 openssl 프로그램을 활용해 공인 인증서를 발급받아야 합니다. 그러나 공인 인증서를 발급받기 위해서는 도메인 주소가 필요하며, 이 도메인 주소는 유료로 발급받아야 합니다. 도메일 주소 발급 문제로 인해 테스트 방식을 변경하였습니다. nginx를 로컬 PC에 설치한 후, Chrome 브라우저에서 HTTPS 호출을 통해 공공데이터포털 API 호출이 정상적으로 이루어지는 것을 확인했습니다.

  • 구성도

nginx.conf

#user nobody; worker_processes 1;

events { worker_connections 1024; }

http { include mime.types; default_type application/octet-stream;

sendfile        on;
keepalive_timeout  65;
​
# HTTPS 요청 처리 (포트 443)
server {
    listen       8443 ssl;
    server_name  localhost;
​
    ssl_certificate      C:/nginx-1.26.2/ssl/cert.pem;
    ssl_certificate_key  C:/nginx-1.26.2/ssl/key.pem;
​
    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;
​
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;
​
    # /ncs2 경로로 들어온 요청을 HTTPS로 공공데이터포털 API에 프록시 전달
    location /ncs2 {
        proxy_pass http://www.ncs.go.kr/api/openapi1.do;
        proxy_set_header Host www.ncs.go.kr;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
​
    location / {
        root   html;
        index  index.html index.htm;
    }
​
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

결과와 배운 점

이번 프로젝트를 통해 GPTs에서 HTTP 프로토콜을 사용하는 API 호출 제한 문제를 효과적으로 해결할 수 있었습니다. Cloudflare Workers를 활용하여 HTTP 요청을 HTTPS로 변환하는 리버스 프록시를 설정한 결과, 공공데이터포털 API 호출이 성공적으로 이루어졌습니다. 이를 통해 GPTs와 다양한 API의 원활한 연동이 가능하다는 것을 확인했습니다.

또한, nginx를 활용한 테스트도 진행했습니다. 초기에는 AWS EC2 인스턴스를 활용하여 공인 인증서를 발급받으려 했으나, 도메인 발급 문제로 테스트를 중단했습니다. 대신 nginx를 AWS EC2 인스턴스에 설치하여 공공데이터포털 API를 호출하는 데 성공했습니다.

이 과정에서 프록시 요청 흔적 제거User-Agent 설정과 같은 세부 설정이 API 호출 성공에 중요한 역할을 한다는 것을 배웠습니다. 특히, Cloudflare Workers와 같은 서버리스 환경은 추가 비용 없이도 손쉽게 설정할 수 있어 비용 효율적인 솔루션임을 확인했습니다.

결론적으로, 이번 테스트를 통해 정부지원사업 등 다양한 프로젝트에서도 이러한 방식으로 API 호출 문제를 해결할 수 있을 것으로 기대됩니다.

4
1개의 답글

👉 이 게시글도 읽어보세요