도키피디아 v1.0
Where It Goes Live
다 만들었습니다.
이제 어디에 올릴까요.
내 컴퓨터에서는 잘 돌아갑니다. 그런데 동료 교사에게 주소 하나로 보여 주려면 어딘가에 올려야 합니다. 올리는 곳은 공짜가 많지만 공짜의 조건이 저마다 다릅니다. 어떤 곳은 한도를 넘으면 사이트를 멈추고, 어떤 곳은 카드에서 돈을 빼 갑니다.
기준일 2026-08-28 · 요금·한도는 공식 문서 조회값 · 무료 요금제 기준00 — Before You Read
배포는 파일을 남의 컴퓨터에 두는 일입니다
거창한 말처럼 들리지만 하는 일은 단순합니다. 내 컴퓨터에 있던 파일을 항상 켜져 있는 남의 컴퓨터에 복사해 두고 누구나 주소로 찾아올 수 있게 여는 것입니다.
npm run dev로 띄운 localhost:3000은 내 컴퓨터 안에서만 보입니다.
같은 학교 선생님도 못 봅니다. 노트북을 닫으면 사라집니다. 배포는 그 파일을 24시간 켜져 있는 회사 서버에 올려
내주소.vercel.app 같은 주소를 받는 일입니다.
먼저 짚을 다섯 낱말
정적 사이트 static site
미리 만들어 둔 HTML·CSS·이미지를 그대로 내려 주는 사이트입니다. 방문자가 누구든 같은 파일을 받습니다. 대백과 한 장짜리 문서, 학급 안내 페이지가 여기 해당합니다. 가장 싸고 가장 안 터집니다.
빌드 build
내가 쓴 소스를 브라우저가 읽을 수 있는 형태로 바꾸는 과정입니다. npm run build가 그것입니다.
결과물이 dist나 build 폴더에 쌓입니다. 배포되는 건 소스가 아니라 이 결과물입니다.
서버리스 함수 serverless function
서버 한 대를 통째로 빌리지 않고 함수 하나만 올려 두는 방식입니다. 요청이 올 때만 잠깐 깨어나 답하고 잠듭니다. API 키를 숨겨야 할 때 여기에 둡니다. 이 문서에서 몇 번이고 다시 나옵니다.
미리보기 배포 preview deployment
고친 내용을 본 주소에 반영하기 전에, 임시 주소로 먼저 띄워 확인하는 기능입니다. 실수를 본 사이트에 그대로 밀어 넣지 않게 막아 줍니다. 요즘은 대부분 무료로 줍니다.
환경변수 environment variable
소스에 직접 적기 곤란한 값을 밖에 빼 두고 이름으로 불러 쓰는 장치입니다. .env 파일이나 배포 사이트 설정 화면에 넣습니다.
이름과 달리 자동으로 숨겨 주지는 않습니다. 10장에서 자세히 다룹니다.
01 — Four Ways
네 갈래의 올리기
사이트 이름부터 외우면 헷갈립니다. 어떻게 올라가는가로 먼저 나누면 나머지가 정리됩니다. 같은 회사가 두 갈래를 다 제공하기도 합니다.
깃 연동형
깃허브 저장소를 한 번 연결해 두면 그다음부터는 푸시할 때마다 알아서 빌드하고 올립니다. 손댈 일이 없습니다.
Vercel · Netlify · Cloudflare · GitHub Pages · Render
명령어형
내 컴퓨터에서 명령어 한 줄을 칩니다. 그 순간의 폴더 내용이 그대로 올라갑니다. 저장소가 없어도 됩니다.
Firebase Hosting · Surge
끌어다 놓기형
빌드된 폴더를 브라우저 화면에 끌어다 놓으면 끝납니다. 계정도 없이 되는 곳이 있습니다. 한 번 보여 주고 말 때 씁니다.
Netlify Drop · Vercel 웹 업로드
구글 계정형
구글 계정 안에서 만들고 그 안에서 공개합니다. 파일이 밖으로 나가지 않습니다. 접근 범위를 계정 단위로 잠글 수 있습니다.
Apps Script 웹앱
교사 입장에서 갈리는 지점
깃 연동형은 고치는 일이 잦을 때 훨씬 편합니다. 수업 자료를 계속 손보면 여기가 맞습니다. 반대로 한 번 올리고 끝날 자료라면 저장소를 만드는 수고가 아깝습니다. 명령어형이나 끌어다 놓기형이 빠릅니다.
구글 계정형은 성격이 다릅니다. 공개하지 않으면서 나눠 주고 싶을 때 쓰는 거의 유일한 무료 수단입니다. 학생 개별 열람 페이지처럼 아무나 보면 안 되는 것이 여기 해당합니다.
02 — Head to Head
정면 비교표
느낌이 아니라 공식 문서로 확인한 것만 담았습니다. 전부 무료 요금제 기준이고 조회일 2026-08-28입니다. 표가 화면보다 넓으면 옆으로 밀어 보세요.
표 A — 어떻게 올라가나
| 따져볼 것 | Vercel | Netlify | Cloudflare | GitHub Pages | Firebase Hosting |
|---|---|---|---|---|---|
| 푸시하면 자동 배포 | 됨 | 됨 | 됨 | 됨 | 안 됨 명령어로 직접 올림 |
| 미리보기 배포 | 브랜치·PR마다 | Deploy Preview | 개수 제한 없음 | 없음 | 미리보기 채널 명령어로 만듦 |
| 깃 없이 올리기 | 웹에서 업로드 | 끌어다 놓기 | Wrangler 명령 | 저장소가 곧 배포 | 명령어 한 줄 |
| 빌드를 대신 해 주나 | 해 줌 | 해 줌 운영 배포 1회 15크레딧 |
해 줌 월 500회 |
Actions로 | 내 컴퓨터에서 빌드해 올림 |
| 서버 기능 (키를 숨길 자리) |
Functions | Functions | Workers | 없음 | Hosting만으로는 없음 App Hosting은 Blaze 필요 |
| 커스텀 도메인·HTTPS | 무료 | 무료 | 무료 100개까지 |
무료 | 무료 |
| 되돌리기 | 직전 1개만 Pro는 임의 선택 |
배포 이력에서 | 배포 이력에서 | 커밋을 되돌려 다시 배포 | 릴리스 이력에서 |
← 옆으로 밀 수 있습니다
표 B — 환경변수·보안·요금
| 따져볼 것 | Vercel | Netlify | Cloudflare | GitHub Pages | Firebase Hosting |
|---|---|---|---|---|---|
| 환경변수 설정 화면 | 있음 | 있음 | Workers에 있음 | 없음 Actions 시크릿은 별개 |
없음 정적 파일만 올라감 |
| 환경별로 다른 값 | 운영·미리보기·개발 브랜치별 덮어쓰기 |
운영·미리보기·브랜치·로컬 | Worker 단위로 나눔 | 해당 없음 | 해당 없음 |
| 비밀값 취급 | 암호화 저장 | 비밀값 표시 가능 범위 지정은 Pro 이상 |
넣고 나면 다시 못 읽음 | 해당 없음 | 해당 없음 |
| 무료로 비공개 배포 | 미리보기만 잠김 운영 도메인은 유료 |
비밀번호 보호는 Pro 이상 |
Access로 로그인 무료 요금제 있음 |
Enterprise Cloud만 | 없음 |
| 무료 한도 | 전송 100GB 함수 호출 100만 CPU 4시간 |
월 300크레딧 대역폭 20크레딧/GB |
정적 파일 요청은 무료·무제한 Workers는 10만 요청/일 |
1GB·월 100GB 둘 다 여유 있는 기준 |
저장 10GB 전송 360MB/일 |
| 한도를 넘으면 | 배포가 멈춤 | 멈춤 무료는 자동 충전 없음 |
정적은 과금 없음 | 깃허브가 연락 | Blaze면 청구 전송 $0.15/GB |
← 옆으로 밀 수 있습니다
03 — Vercel
Vercel Next.js를 만든 회사
Next.js를 만든 회사가 운영합니다. Next.js로 만든 것을 올릴 거라면 설정이 거의 필요 없습니다. 대신 무료 요금제에 비상업 조건이 붙습니다.
수업 자료 규모면 넘길 일이 드뭅니다.
vercel env pull로 내 컴퓨터에 받아 옵니다.가장 자주 걸리는 것
무료 요금제의 상업적 사용 금지가 생각보다 넓습니다. 공식 문서는 상업적 사용을 "프로젝트 제작에 관여한 누구든 금전적 이득을 얻는 배포"로 정의합니다. 광고를 달거나 결제를 받는 것뿐 아니라 사이트를 만들어 주고 돈을 받는 경우, 그리고 후원을 요청하는 경우까지 들어갑니다. 학교 안내 페이지나 수업 자료는 대개 문제가 없지만, 외부 강의료를 받고 만든 결과물을 올린다면 한 번 생각해 볼 지점입니다.
또 하나. 환경변수는 새로 배포할 때부터 적용됩니다. 값을 고쳐도 이미 올라간 배포는 그대로입니다. 키를 바꿨는데 안 바뀐다면 다시 배포했는지부터 확인하세요.
- Next.js로 만들었을 때. 설정이 거의 없습니다
- 브랜치별 미리보기를 자주 볼 때
- API 키를 서버 쪽에 숨겨야 할 때
- 대가를 받고 만든 결과물을 올릴 때
- 본 주소를 비공개로 잠가야 할 때
- 방문이 갑자기 몰릴 수 있는 자료일 때
근거 — Fair Use Guidelines · Environment variables · Deployment Protection · Instant Rollback 2026-08-28 조회
04 — Netlify
Netlify 끌어다 놓기가 되는 곳
빌드된 폴더를 브라우저에 끌어다 놓기만 해도 주소가 나옵니다. 입문자에게 가장 친절합니다. 다만 요금 계산 방식이 1년 사이에 두 번 바뀌었습니다.
dist 폴더를 화면에 끌어다 놓습니다. 계정 없이도 임시 주소가 나옵니다._headers 파일에 기본 인증을 직접 적어야 합니다.크레딧이라는 셈법
예전에는 대역폭 100GB, 빌드 300분처럼 항목별로 한도가 있었습니다. 지금은 300크레딧 하나로 묶여 있고 무엇을 쓰든 거기서 깎입니다. 그래서 같은 300이라도 쓰는 방식에 따라 남는 양이 크게 다릅니다.
대역폭만 쓴다고 치면 1GB에 20크레딧이니 대략 15GB가 한 달치입니다. 반대로 자료를 자주 고쳐 하루에 한 번씩 배포하면 배포만으로 한 달에 450크레딧이라 한도를 넘습니다. 이 계산은 공식 요율에서 나온 것이지만 어림값이니 실제 사용량은 대시보드에서 보세요.
무료 요금제에는 자동 충전이 없습니다. 크레딧이 떨어지면 거기서 멈춥니다. 갑자기 청구서가 날아오지 않는다는 뜻이라 요금 사고 측면에서는 오히려 안전합니다.
- 깃허브를 아직 안 쓰는데 일단 올려 보고 싶을 때
- 문의 폼처럼 부가 기능을 붙이고 싶을 때
- 예기치 않은 청구가 절대 없어야 할 때
- 하루에도 여러 번 고쳐 올릴 때. 배포마다 크레딧이 나갑니다
- 이미지·영상이 많아 대역폭이 클 때
- 비밀번호를 무료로 걸고 싶을 때
근거 — Credit-based pricing plans · Environment variables · Deploy overview 2026-08-28 조회
05 — Cloudflare
Cloudflare 많이 봐도 돈이 안 나가는 곳
교사에게 가장 유리한 한 줄이 여기 있습니다. 정적 파일 요청은 무료이고 개수 제한이 없습니다. 자료가 갑자기 퍼져도 청구서가 오지 않습니다.
npx wrangler를 씁니다.npx wrangler secret put으로 넣고, 넣은 뒤에는 다시 볼 수 없습니다.Pages와 Workers, 뭐가 다른가
Cloudflare에는 이름이 둘 있어 처음에 헷갈립니다. Pages는 정적 사이트를 올리는 서비스로 먼저 나왔고, Workers는 서버 기능을 돌리는 서비스였습니다. 지금은 Workers가 정적 파일까지 다룰 수 있게 되어 2026년 3월 기준으로 정적 파일·서버 렌더링·커스텀 도메인에서 Pages와 같은 수준이 됐습니다.
회사는 새로 시작하는 프로젝트에 Workers를 권합니다. 다만 Pages도 계속 지원되고 강제로 옮기라는 안내는 없습니다. 이미 Pages로 잘 돌고 있다면 그대로 두어도 됩니다. 옛 방식인 Workers Sites만 폐기됐으니 그건 쓰지 마세요.
wrangler secret put으로 넣은 값은 대시보드에서도 명령어로도 다시 읽을 수 없습니다.
불편해 보이지만 화면 공유나 스크린샷으로 키가 새는 사고를 원천적으로 막아 줍니다.
값을 잊었다면 새로 발급받아 덮어씁니다. 평문 변수 쪽에는 민감한 값을 넣지 말라고 공식 문서가 못 박습니다.- 연수 자료처럼 몇 명이 볼지 모를 때
- 사진·영상이 많아 전송량이 클 때
- 동료에게만 보여 주고 싶을 때
- 설정할 곳이 많아 처음이 어려울 때
- 파일이 2만 개를 넘거나 한 파일이 25MiB를 넘을 때
- 하루에 빌드를 스무 번 넘게 돌릴 때
근거 — Workers 요금 · Pages 한도 · Workers 시크릿 · Pages에서 Workers로 · Pages 되돌리기 2026-08-28 조회
06 — GitHub Pages
GitHub Pages 저장소가 곧 사이트
따로 가입할 곳이 없습니다. 깃허브 저장소 설정에서 켜기만 하면 그 저장소가 그대로 사이트가 됩니다. 대신 무료 계정에서는 저장소가 공개여야 합니다.
공개 저장소라는 조건
공식 문서는 이렇게 적었습니다. Pages는 GitHub Free에서 공개 저장소에만, GitHub Pro·Team·Enterprise에서는 공개와 비공개 저장소 모두에 쓸 수 있습니다. 무료 계정이라면 저장소를 공개로 두어야 하고 그 말은 소스와 커밋 이력이 전부 남에게 보인다는 뜻입니다.
여기서 사고가 납니다. .env를 한 번이라도 커밋했다면 나중에 지워도 이력에 남아 검색됩니다.
키를 노리는 자동 프로그램이 공개 저장소를 계속 훑고 있습니다. 실수를 알았다면 파일을 지우는 게 아니라
키를 즉시 새로 발급받는 것이 유일한 복구입니다.
- HTML 한 장짜리 자료를 올릴 때
- 이미 깃허브를 쓰고 있어 추가 가입이 귀찮을 때
- 공개해도 아무 문제 없는 내용일 때
- API 키가 필요한 기능이 들어갈 때. 숨길 자리가 없습니다
- 소스를 공개하고 싶지 않을 때
- 학생 개인정보가 조금이라도 들어갈 때
근거 — GitHub Pages limits · What is GitHub Pages · Changing the visibility of your site 2026-08-28 조회
07 — Firebase
Firebase 구글의 한 묶음
Firebase는 서비스 하나가 아니라 묶음입니다. 화면을 올리는 Hosting, 서버 렌더링까지 맡는 App Hosting, 데이터를 담는 Firestore·Realtime Database가 각각 다릅니다. 이 장은 앞의 둘을 다루고, 데이터는 8장에서 봅니다.
firebase init으로 폴더를 잡고 firebase deploy를 칩니다. 저장소가 없어도 됩니다.하루 360MB라는 벽
무료 요금제에서 가장 먼저 부딪히는 숫자입니다. 저장 용량은 10GB로 넉넉한데 내보내는 양이 하루 360MB입니다. 3MB짜리 페이지라면 하루 120번 열면 끝입니다. 학급용 도구처럼 정해진 인원이 쓰는 것에는 충분하지만, 연수 자료를 널리 뿌리는 용도로는 좁습니다. 그런 자료는 Cloudflare 쪽이 맞습니다.
더 중요한 건 이것입니다. 공식 문서가 "예산과 예산 알림은 사용량이나 요금을 제한하지 않습니다"라고 적었습니다. 알림은 알려 줄 뿐 막아 주지 않고, 알림이 오기까지 며칠 걸릴 수도 있습니다. Blaze를 쓴다면 알림과 별개로 지출 상한을 따로 걸어 두세요. 2026-08-28 조회
App Hosting은 다른 물건입니다
이름이 비슷해 헷갈리는데, App Hosting은 Next.js나 Angular처럼 서버가 필요한 앱에 씁니다. 깃허브 저장소를 직접 연결하고 "커밋 하나면 새 버전이 나갑니다"라고 공식 문서가 설명합니다. Hosting과 달리 푸시하면 자동으로 배포됩니다.
대신 Blaze 요금제가 반드시 필요합니다. 무료로는 쓸 수 없습니다. 깃 연동이 필요해서 여기로 온 것이라면 무료인 Vercel이나 Cloudflare를 먼저 보는 편이 낫습니다.
- 로그인·데이터베이스를 같이 쓸 때
- 학급 인원 정도가 쓰는 도구일 때
- 이미 구글 계정으로 다 하고 있을 때
- 많은 사람에게 자료를 뿌릴 때. 하루 360MB입니다
- 무료로 깃 연동을 원할 때
- 청구가 절대 나면 안 될 때. 상한을 안 걸면 그대로 나갑니다
근거 — Firebase 요금 · Hosting 문서 · 릴리스 관리 · App Hosting · 예상 못 한 요금 피하기 2026-08-28 조회
08 — Backend and Database
백엔드 데이터를 담아 두는 곳
출석·설문·기록처럼 저장해 두어야 하는 것이 생기면 화면만 올려서는 안 됩니다. 데이터를 담는 곳이 따로 필요합니다. 여기서 교사가 실제로 만나는 것은 사실상 둘입니다.
| 따져볼 것 | Firestore · Realtime Database | Supabase |
|---|---|---|
| 무엇을 담나 | 문서 형태의 데이터. 실시간 반영이 쉽습니다 | 표 형태의 데이터(PostgreSQL). 로그인·파일 보관도 함께 줍니다 |
| 브라우저가 직접 붙나 | 붙습니다. 그렇게 설계됐습니다 | 붙습니다. 공개용 키를 브라우저에 두고 씁니다 |
| 그럼 뭐가 막아 주나 | 보안 규칙 하나뿐입니다 | 행 수준 보안(RLS)입니다. 표마다 켜야 합니다 |
| 기본값이 안전한가 | 테스트 모드를 고르면 누구나 읽고 덮어씁니다 | RLS를 안 켜면 공개용 키만으로 다 보입니다 |
| 무료 한도 | Spark 요금제에 무료분이 있습니다 항목별 수치는 요금 페이지 확인 |
활성 프로젝트 2개 · 500MB · 전송 5GB 파일 1GB · 월 이용자 5만 |
| 안 쓰면 멈추나 | 안 멈춥니다 | 1주 쉬면 자동으로 멈춥니다 직접 다시 켤 수 있습니다 |
| 카드 등록 | Spark는 불필요 · Blaze는 필요 | 무료 요금제는 불필요 |
| 지출 상한 | 직접 걸어야 합니다 | 유료 요금제는 기본으로 켜져 있습니다 |
← 옆으로 밀 수 있습니다
- 파이어베이스 공식 문서 — "Firebase Security Rules are the only safeguard blocking access for malicious users." 보안 규칙이 유일한 방벽이라는 뜻입니다
- 같은 문서 — "if you deploy your app, it's publicly accessible — even if you haven't launched it." 아직 알리지 않았어도 올린 순간 공개입니다
- 데이터베이스를 만들 때 테스트 모드를 고르면 공식 설명이 이렇습니다. "allows anyone to read and overwrite your data"
- Supabase 공식 문서 — 공개용 키는 "Safe to expose online"이지만 그건 "enable Row Level Security on all tables"를 했을 때의 이야기입니다
서버를 통째로 빌리는 쪽
파이썬 스크립트를 계속 돌린다거나 직접 만든 서버를 띄워야 한다면 성격이 다른 곳으로 갑니다. 다만 이쪽은 무료가 거의 없습니다. 교사 입장에서 먼저 알아 둘 것은 그 사실입니다.
- Railway — 무료 요금제는 월 $1어치 크레딧으로 아주 작은 것만 돌아갑니다. 처음 한 번 $5어치를 주고, 실제로 쓰려면 월 $5짜리 Hobby 요금제로 올라갑니다
- Fly.io — 무료 할당이 없고 쓴 만큼 냅니다. 모든 조직에 카드 등록이 필요합니다. 켜 둔 시간만큼 초 단위로 계산되고 꺼 둔 것도 저장 공간 값은 나갑니다
서버가 꼭 필요한 게 아니라면 여기까지 오지 않아도 됩니다. API 키를 숨기는 정도라면 서버리스 함수 하나면 충분합니다(10장).
근거 — Firebase 보안 규칙 · Firestore 시작하기 · Supabase 요금 · Supabase API 키 · Railway 요금제 · Fly.io 요금 2026-08-28 조회
09 — Other Options
그 밖의 선택지
앞의 다섯 곳으로 대부분 해결됩니다. 다만 특정 상황에서만 유독 잘 맞는 곳이 몇 군데 있습니다.
Surge
폴더에서 surge를 치면 끝입니다. 저장소도 빌드 설정도 없습니다. 계정 만들기까지 명령창 안에서 끝납니다.
한 번 보여 주고 말 자료에
Render
푸시하면 자동 배포되고 PR마다 미리보기를 만듭니다. 인증서는 무료로 발급·갱신됩니다. 도메인은 낮은 요금제에서 2개까지입니다.
서버까지 한곳에서 굴리고 싶을 때
Deno Deploy
깃허브를 연결하면 자동 배포되고 PR마다 미리보기 주소가 생깁니다. 배포 하나의 총 용량은 1GB, 메모리는 512MB까지입니다.
타입스크립트로 작은 서버를 붙일 때
Apps Script 웹앱
구글 계정 안에서 만들고 그 안에서 공개합니다. 누가 볼 수 있는지를 계정 단위로 정할 수 있습니다.
아무나 보면 안 되는 것에
Apps Script 웹앱을 따로 보는 이유
앞의 어떤 곳도 무료로 비공개 배포를 잘 해 주지 못했습니다. Apps Script는 그 자리를 메웁니다. 파일이 교사 개인 구글 계정 밖으로 나가지 않고, 배포할 때 두 가지를 고릅니다.
- 누구 자격으로 실행할까 — 나로 실행하면 방문자가 내 권한으로 자료를 읽습니다. 접속한 사람으로 실행하면 각자 자기 권한만큼만 봅니다
- 누가 접근할 수 있나 — 나만, 또는 정해진 범위 안의 사람만으로 좁힐 수 있습니다
학생별 개별 열람 페이지처럼 내용은 나눠 줘야 하는데 공개는 안 되는 경우에 이 조합이 잘 맞습니다. 대신 만드는 방식이 일반 웹 개발과 달라 익숙해지는 데 시간이 듭니다.
근거 — Render 정적 사이트 · Deno Deploy 한도 · Apps Script 웹앱 · Surge 2026-08-28 조회
10 — Environment Variables
환경변수는 숨김 상자가 아닙니다
이 장 하나만 읽고 나머지를 넘겨도 됩니다. 배포에서 나는 사고의 절반이 여기서 나옵니다. 키를 환경변수에 넣었으니 안전하다는 생각이 사고의 출발점입니다.
무슨 일이 벌어지나
.env에 키를 적고 코드에서 불러 쓰면 소스에는 키가 안 보입니다. 여기까지는 맞습니다.
그런데 npm run build를 하는 순간 그 값이 결과물 안에 글자 그대로 박힙니다.
그 결과물이 배포되고 브라우저는 그걸 통째로 내려받습니다. 누구나 열어 볼 수 있습니다.
VITE_로 시작하는 변수에는 API 키 같은 민감한 정보를 넣지 말라는 뜻입니다. 빌드할 때 소스에 박힌다고 이유까지 적어 두었습니다.
Next.js —
NEXT_PUBLIC_이 붙은 변수는 빌드할 때 자바스크립트 결과물에 그대로 새겨집니다.
접두사가 없는 변수는 서버에서만 쓰입니다.
2026-08-28 조회접두사는 경고문입니다. VITE_나 NEXT_PUBLIC_을 붙이는 행위 자체가
"이 값을 브라우저로 보내겠다"는 선언입니다. 그런데 브라우저에서 부르려면 접두사를 붙여야 하니
초보자는 안 되면 접두사를 붙여 해결하게 되고 그 순간 키가 공개됩니다.
그럼 키는 어디에 두나
브라우저가 아니라 서버가 부르게 하면 됩니다. 서버리스 함수가 그 자리입니다. 브라우저는 내 함수에게 부탁하고 함수가 키를 들고 진짜 API에 다녀와서 결과만 돌려줍니다. 키는 함수 안에만 있습니다.
- 브라우저 → 제미나이 API
- 키가 브라우저 코드 안에 있어야 함
- 개발자도구를 열면 그대로 보임
- 남이 내 키로 요금을 씀
- 브라우저 → 내 함수 → 제미나이 API
- 키는 함수 쪽 환경변수에만
- 브라우저 코드에는 함수 주소만 남음
- 함수에서 사용량 제한도 걸 수 있음
지금 새고 있는지 확인하기
이미 배포한 것이 있다면 3분이면 확인됩니다.
- 배포된 주소를 브라우저로 엽니다
내 컴퓨터의
localhost가 아니라 실제 배포 주소여야 합니다. - F12를 눌러 개발자도구를 엽니다
Network 또는 소스 탭으로 갑니다.
- 내 키의 앞 6~8글자를 검색합니다
키 전체를 붙여 넣지 말고 앞부분만 씁니다. 검색창에 남으면 그것도 위험합니다.
- 결과가 나오면 이미 샌 것입니다
파일을 고치는 걸로 끝나지 않습니다. 키를 새로 발급받아야 합니다.
② 결제가 붙은 키였다면 사용 내역을 확인합니다.
③
.env를 커밋했다면 파일만 지워도 이력에는 남습니다. 저장소를 비공개로 돌린다고 해결되지 않습니다.④ 새 키는 서버리스 함수 쪽에만 둡니다. 같은 자리에 다시 넣으면 같은 일이 반복됩니다.
11 — Security
아무나 못 보게, 아무나 못 읽게
배포는 인터넷 전체에 공개하는 행위입니다. 링크를 안 알려 줬다는 것은 보호가 아닙니다. 주소는 검색에 잡히고 자동으로 훑고 다니는 프로그램도 있습니다.
먼저 받아들일 사실
브라우저에서 도는 코드는 전부 보입니다. 저장소를 비공개로 해도 소용없습니다. 배포되는 건 소스가 아니라 결과물인데, 그 결과물은 방문자 컴퓨터로 내려갑니다. 숨길 방법이 없습니다.
그래서 보안은 보이지 않게 하는 일이 아니라 보여도 문제없게 만드는 일입니다. 키는 서버 쪽에, 데이터는 규칙 뒤에, 개인정보는 아예 올리지 않는 것이 그 방법입니다.
사이트 자체를 잠그려면
| 방법 | 무료인가 | 어떤 상황에 |
|---|---|---|
| Cloudflare Access | 무료 요금제 있음 인원 한도는 요금 페이지 확인 |
정해진 사람에게만 열고 싶을 때. 로그인이나 일회용 번호를 요구합니다 |
| Apps Script 웹앱 액세스 설정 | 무료 | 구글 계정 기준으로 범위를 좁힐 때. 학생 개별 열람에 잘 맞습니다 |
Netlify _headers 기본 인증 |
직접 설정 | 간단한 비밀번호 한 겹이면 충분할 때 |
| Vercel 비밀번호 보호 | Enterprise 또는 Pro에 월 $150 추가 |
무료로는 미리보기 주소만 잠깁니다 |
| GitHub Pages 비공개 사이트 | Enterprise Cloud만 | 개인 요금제로는 방법이 없습니다 |
| 앱 안에서 직접 로그인 구현 | 직접 만듦 | Firebase Hosting처럼 잠금 장치가 없는 곳에서 |
← 옆으로 밀 수 있습니다
- 꼭 웹으로 나눠 줘야 한다면 Apps Script 웹앱처럼 교사 계정 안에서 끝나는 방식을 씁니다
- 계산이나 정리만 필요하다면 내 컴퓨터에서 도는 형태로 만듭니다. 배포하지 않아도 됩니다
- 어쩔 수 없이 올려야 한다면 이름 대신 번호나 가명으로 바꾸고 본인 확인은 다른 경로로 합니다
흔한 오해 셋
"링크를 안 알려 주면 안전하다"
주소는 여러 경로로 알려집니다. 브라우저 확장, 공유 기록, 검색 로봇, 인증서 발급 기록까지. 주소를 모른다는 것은 보호 수단이 아닙니다.
"저장소가 비공개니 코드도 안 보인다"
배포된 결과물은 저장소와 별개로 공개됩니다. 브라우저가 받아 가야 화면이 뜨기 때문입니다. 저장소 공개 여부와 배포물 노출은 다른 이야기입니다.
"키를 코드에 안 적었으니 괜찮다"
빌드하면 값이 결과물에 박힙니다. 소스에 안 적은 것과 결과물에 없는 것은 다릅니다. 10장의 확인 절차로 직접 검색해 보세요.
"아직 아무한테도 안 알렸다"
파이어베이스 공식 문서가 이렇게 적었습니다. "if you deploy your app, it's publicly accessible — even if you haven't launched it." 올린 순간부터 공개입니다.
12 — When the Bill Comes
무료 한도를 넘으면
무료 요금제를 고를 때 봐야 할 것은 한도의 크기가 아닙니다. 넘었을 때 멈추느냐 청구되느냐입니다. 이 둘은 성격이 완전히 다릅니다.
두 종류가 있습니다
- Vercel 무료 — 배포가 멈춥니다
- Netlify 무료 — 크레딧이 떨어지면 멈춥니다. 자동 충전이 없습니다
- GitHub Pages — 여유 있게 보다가 깃허브가 연락합니다
- Supabase 무료 — 프로젝트가 일시정지됩니다
- Cloudflare 정적 파일 — 애초에 전송 과금이 없습니다
- Firebase Blaze — 무료분을 넘으면 그대로 청구
- Fly.io — 무료 할당 없이 쓴 만큼
- Railway 유료 요금제 — 사용량 기준
- Vercel·Netlify 유료 요금제 — 초과분 과금
결제수단을 등록하는 순간 성격이 바뀝니다. 무료 요금제를 쓰다가 기능이 필요해 카드를 붙이면 그때부터는 멈추는 쪽이 아니라 청구되는 쪽이 됩니다. 파이어베이스에서 Blaze로 올리는 것이 대표적입니다.
막는 것은 지출 상한입니다. 알림과 별개 기능이고 별도로 걸어야 합니다. 공식 문서도 함수나 App Hosting을 쓴다면 지출 상한을 함께 설정하라고 강하게 권합니다. 2026-08-28 조회
실제로 나는 사고 셋
- 사진을 원본 그대로 올렸다
수업 사진 200장을 줄이지 않고 올리면 한 장이 5MB씩 잡힙니다. 한 사람이 다 훑으면 1GB입니다. Firebase 무료는 하루 360MB라 세 명이면 그날치가 끝납니다. 올리기 전에 이미지를 줄이세요.
- 함수가 자기를 다시 부른다
데이터가 바뀌면 실행되는 함수가 다시 데이터를 바꾸면 끝없이 돕니다. 무료면 한도에서 멈추지만 청구되는 요금제라면 하룻밤에 액수가 커집니다. 함수를 붙일 때 지출 상한을 먼저 거세요.
- 공개 저장소에 키를 올렸다
공개 저장소를 훑는 자동 프로그램이 있습니다. 키를 주워 가면 내 계정으로 남이 API를 씁니다. 요금뿐 아니라 그 사용 내역도 내 이름으로 남습니다.
② 카드를 걸었다면 지출 상한부터 겁니다. 알림만으로는 부족합니다
③ 전송량이 걱정되면 Cloudflare에 둡니다. 정적 파일은 전송 과금이 없습니다
④ 이미지·영상은 올리기 전에 줄입니다. 대역폭 문제의 대부분이 여기서 나옵니다
13 — Your Call
나는 어디에 올리나
위에서부터 네 가지만 물으면 대개 답이 나옵니다. 앞의 질문일수록 중요합니다. 첫 질문에서 걸리면 나머지는 볼 필요가 없습니다.
Vercel을 고를 때는 대가를 받고 만든 결과물이 아닌지 한 번 더 확인하세요(3장). GitHub Pages는 무료 계정에서 저장소가 공개여야 한다는 조건이 붙습니다(6장).
올리기 전 점검표
여덟 개를 다 켜지 못했다면 올리기 전에 해결하세요. 올린 뒤에 고치는 것보다 훨씬 쌉니다.
+ — Reference
레퍼런스
숫자는 자주 바뀝니다. 결제나 도입을 결정하기 전에는 아래 공식 페이지를 직접 여세요.
배포 플랫폼
- Vercel — Fair Use Guidelines · 무료 한도와 상업적 사용 정의
- Vercel — Deployment Protection · 요금제별 잠금 범위
- Netlify — Credit-based pricing plans · 크레딧 요율
- Cloudflare — Workers 요금 · 정적 자산 무과금 근거
- Cloudflare — Pages 한도
- GitHub Pages — 한도
- Firebase — 요금제 · Spark와 Blaze 비교
환경변수와 키
- Vite — Env Variables and Modes ·
VITE_경고문 원문 - Next.js — Environment Variables ·
NEXT_PUBLIC_동작 - Cloudflare — Workers 시크릿
- Netlify — Environment variables
- Vercel — Environment variables
데이터베이스 보안과 요금
- Firebase — 보안 규칙 기초
- Firebase — 예상 못 한 요금 피하기 · 예산 알림과 지출 상한의 차이
- Supabase — API 키 · 공개 키와 비밀 키
- Supabase — 요금제 · 무료 일시정지 조건
그 밖
+ — Sources
자료 출처
이 문서의 사실은 2026년 8월 28일에 각 사 공식 문서로 확인했습니다. 무료 한도와 요금 정책은 몇 달 단위로 바뀌므로, 결제나 도입을 결정하기 전 원문을 다시 확인하시길 권합니다.
확인 방식
본문의 모든 수치와 인용은 각 회사의 공식 문서에서 가져왔습니다. 블로그나 요약 사이트의 값은 쓰지 않았습니다. 공식 문서에서 확정하지 못한 값은 적지 않고, 확인이 필요하다고 표시했습니다. Cloudflare Access의 무료 인원수가 그 예입니다.
주요 인용
- Vercel "Hobby teams are restricted to non-commercial personal use only." — Fair Use Guidelines
- Vite "VITE_* variables should not contain sensitive information such as API keys." — Env Variables and Modes
- Firebase "Firebase Security Rules are the only safeguard blocking access for malicious users." / "if you deploy your app, it's publicly accessible — even if you haven't launched it." — 보안 규칙 기초
- Firebase "Budgets and budget alerts do not cap your usage or charges." — 예상 못 한 요금 피하기
- Supabase "Never expose your secret keys publicly. Your data is at risk." / "enable Row Level Security on all tables" — API 키
- GitHub Pages는 GitHub Free에서 공개 저장소에만 제공됩니다 — What is GitHub Pages
참고할 법령
- 개인정보 보호법 제28조의8 개인정보의 국외 이전. 이 문서에 나오는 서비스는 대부분 국외 사업자입니다
- 초·중등교육법 제30조의6 학생 관련 자료 제공의 제한
법령 해석이 필요한 사안은 소속 기관의 개인정보 보호 담당자에게 확인하시기 바랍니다.