API key 是一串长随机字符串,让你的 code 对付费服务验证身份。当你调用 OpenAI、Anthropic、Resend、Stripe 或任何现代 API,请求 header 会带 Authorization: Bearer sk-... — 那个 sk-... 就是 key。谁拿到谁就能用你的账号花钱,当信用卡号看待。
API key 到底是什么
机械上,就是一串长字符串(通常 40-100 字符),provider 产生,你 copy 进 app。这个 key:
- 识别是哪个账号发 request(provider 才知道这笔钱算谁)
- 通常带 scope / 权限(只读、完整、限定项目等)
- 外泄时可以撤销、轮换
不同服务有不同前缀:
- OpenAI:
sk-proj-...(项目 key)或sk-...(旧版 user key) - Anthropic:
sk-ant-api03-... - Resend:
re_... - Stripe:
sk_live_...或sk_test_... - Supabase:JWT 或
sbp_...PAT
前缀是给人看的提示,真正的秘密是整串。
怎么实际使用
基本流程:
- 进 provider 的 dashboard(
platform.openai.com、console.anthropic.com等) - 创建 API key,复制。通常只看得到一次 — provider 只存 hash,不存原文。
- 放进 app。绝对不要写死在 source code。
- 用 SDK(Python、TypeScript)或 raw HTTP 调用。
TypeScript 用 Anthropic 的最小示例:
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: process.env.ANTHROPIC_API_KEY, // 永远不要写死
});
const msg = await client.messages.create({
model: "claude-sonnet-4",
max_tokens: 1024,
messages: [{ role: "user", content: "Hello" }],
});
Key 放在环境变量 — process.env.ANTHROPIC_API_KEY — 开发时设在 .env.local,production 设在 hosting 的环境变量(Vercel、Render、Cloudflare 等)。
Key 是怎么外泄的
真实案例:
**Commit 到公开 repo。**你写死 key、commit、push 上 GitHub。Bot 几分钟内就会 scrape 新 commit,一小时内已经有人用你的模型跑他自己的工作流。代价:几百到几千美元,你还没发现。
**送进 client-side code。**你把 OPENAI_API_KEY 放进 Next.js 的 "use client" 文件、或 React Native bundle。谁都能打开浏览器 DevTools 看到。这就是个人 indie dev 一个周末损失 $5,000 的方式。
**截图贴出去。**你截了 terminal 显示环境变量的图,丢到 Discord 求救。这张图现在在某人的 screenshot 文件夹、然后是下一个 AI 爬虫的训练数据。
Slack 跟 email DM。「这是我的 API key,你看一下为什么跑不动?」你的 Slack 现在有它的索引。半年后 Slack workspace 被黑,key 跟着外泄。
怎么安全使用
四条规则挡掉 95% 的外泄。
**1. 永远不要把 key 放进 source code 或 client bundle。**开发永远 .env.local(gitignored),production 永远平台环境变量。服务器端才能存 — key 永远不该到用户的浏览器。
**2. .gitignore 加上 .env*。**第一次 commit 前再检查一次。万一不小心 commit 上去,光 rotate key 不够 — git history 还会泄露。用 git filter-repo 清。
**3. 用有 scope、有限额的 key。**OpenAI、Anthropic 跟大多数主流 API 都让你建受限 key:花费上限、项目限定、只读。开发千万不要用 master key — 开一个月上限 $5 的 dev key。漏了损失停在 $5。
**4. 在 dashboard 设花费警示跟上限。**OpenAI 可以设硬上限,Anthropic 同样。在你把 key 放进 app 之前就设好,不是等账单来才设。
Key 漏了怎么办
按这个顺序快速行动:
- **马上在 provider dashboard 撤销 key。**每分每秒都重要。
- **产新 key 换掉。**更新
.env.local跟 hosting 平台。 - **看用量 log。**大多 provider 会显示近期 call,找你没做过的高峰。
- **如果有费用产生,联系客服。**大部分主流 provider 会把明显外泄的费用退掉,只要你动作快、故事清楚(commit hash、撤销截图等)。
- **检讨怎么漏的。**git?Client bundle?Slack?把流程修好,下周不要再来一次。
Server vs serverless 考量
现代 web app 里,「key 应该住哪」依 runtime 而定:
- Server-rendered 页面、server action、API route(Next.js / Remix / SvelteKit):key 放环境变量,server-side 用。安全。
- Client component、client fetch(浏览器 JS):永远不行。Key 会送到浏览器。如果浏览器需要跟 OpenAI 讲话,通过你自家 server 代转,加 auth。
- Serverless function(Vercel、Cloudflare、AWS Lambda):同 server — 环境变量,绝不打包进 client code。
- Mobile app(iOS、Android):放在 app 二进制的 key 用工具能挖出来。永远通过自己的 backend 代转。
规则:**如果用户能看到调用 API 的 code,他就能挖出 key。**据此规划。
什么时候不用太担心
如果你只是学习,用一个 $5 上限的测试 key 在自己笔记本,最坏情况是别人花掉你一杯咖啡的钱。不要因为安全焦虑就不敢实验。等到你 ship 给真实用户、或用真钱的 key,那时再紧起来。
延伸阅读
- 什么是 LLM
- 什么是 prompt injection、为什么危险
- 怎么把 LLM API 账单砍半
- 防 prompt injection:2026 年实际的护栏
- LLM observability:logging、tracing、evals