백엔드와 SDK

외부 API (b77.http)

비밀 키를 노출하지 않고 어떤 HTTPS API든 호출해요.

b77.http.fetch는 builder77 서버에서 외부 HTTPS API를 호출해요. API 키는 설정 → 비밀 키(고급 설정 안)에 저장하세요. builder77이 서버에 암호화해서 보관해요. 코드에는 {{secret:NAME}}이라고 쓰면 서버가 값을 채워 넣기 때문에 키가 브라우저에 전달되지 않아요.

const res = await b77.http.fetch('https://api.openai.com/v1/chat/completions', {
  method: 'POST',                                          // default GET
  headers: { Authorization: 'Bearer {{secret:OPENAI_API_KEY}}' },
  body: { model: 'gpt-4o-mini', messages: [{ role: 'user', content: 'Hi!' }] }, // object → JSON, or a string
});
if (res.ok) console.log(res.data);  // { ok, status, headers, body (text), data (parsed JSON or null) }

호출 한 번에 연동 크레딧 1개가 들어요. 호출은 https만 쓸 수 있고, 15초가 지나면 시간 초과되며, 응답은 최대 1 MB까지 받을 수 있어요. API가 키를 응답에 그대로 돌려주면 앱이 응답을 보기 전에 [secret]으로 바뀌어요.

비밀 키별 규칙

앱을 쓰는 사람은 누구나 비밀 키를 보지 않고도 그 키로 호출할 수 있어요. 그래서 비밀 키마다 내가 허용한 방식으로만 작동해요.

  • 허용 호스트: 키를 보낼 수 있는 유일한 서버예요 (예: api.openai.com, *.example.com은 하위 도메인까지 포함).
  • 허용 메서드: 기본값은 GET과 POST예요.
  • 허용 경로: /v1/chat/ 같은 경로 접두사를 지정할 수 있어요. 비워 두면 모든 경로가 허용돼요.
  • 키를 넣을 수 있는 위치: 기본값은 인증 헤더(Authorization, X-Api-Key, Api-Key, X-Goog-Api-Key 등)뿐이에요. 쿼리 매개변수(이름으로 지정, 예: key), URL 경로, 요청 본문은 직접 켜기 전까지 꺼져 있어요.

규칙을 어긴 호출은 아무것도 보내기 전에 상태 코드 403으로 거부돼요.

URL이나 본문에 넣는 키

가능하면 헤더로 키를 받는 API를 쓰세요. 주소에 키를 넣는 API도 있어요. 그런 경우에는 그 위치만 정확히 허용하고 경로를 좁혀 두세요.

// Settings → Secrets: TELEGRAM_TOKEN, host api.telegram.org, "In the URL path" on,
// allowed path /bot{{secret:TELEGRAM_TOKEN}}/sendMessage
await b77.http.fetch('https://api.telegram.org/bot{{secret:TELEGRAM_TOKEN}}/sendMessage', {
  method: 'POST',
  body: { chat_id: 12345, text: 'New booking!' },
});

요청 본문은 API가 꼭 요구할 때만 허용하세요. 허용하면 앱을 쓰는 누구나 그 API가 저장하는 곳(메시지, 메모, 공개 파일)에 키를 써 넣고 다시 읽어 낼 수 있어요.