面试题:AI 前端中的模型 API Key 安全
本题考察模型调用链路设计,以及前端环境变量、BFF 和接口安全。

文章目录 3
题目
某开发者在 Vue 项目中这样调用大模型:
const response = await fetch('https://api.example-ai.com/v1/chat', {
method: 'POST',
headers: {
Authorization: `Bearer ${import.meta.env.VITE_AI_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
messages,
}),
});请回答:
- 这段代码有什么安全问题?
- 为什么把 Key 放入
.env并加入.gitignore仍然不安全? - 请简述一个更合理的调用链路。
- 除了隐藏 Key,服务端至少还应该做哪两项安全措施?
我的回答
- API key直接暴露在网站中,易被他人获取;
- 在代码远程托管中仍有可能被他人获取,不管是私人还是公开的
- API key应该交由后端保存至库中维护管理
- 校验用户身份和权限、处理超时/重试和限流
题解
整体方向正确,评分:7/10。
正确点
- 能识别 API Key 暴露问题。
- 知道模型调用应经过后端。
- 提到了身份校验、权限控制和限流,这是防止接口被滥用的关键措施。
- 超时和重试也是必要的稳定性措施。
需要修正
第 2 点的核心原因不是“代码托管可能泄露”。
.gitignore 只能阻止 .env 被提交,但 VITE_ 开头的变量会在构建时被替换进前端 JavaScript:
import.meta.env.VITE_AI_API_KEY
// 构建后可能变成:
'真实的 API Key'用户下载前端产物后,可以通过 DevTools、源码或网络请求获得它。因此:
浏览器是用户可控环境,不能保存任何服务端密钥。
第 3 点中,Key 不一定要存在数据库。更常见的做法是保存在:
- 服务端环境变量
- Secret Manager
- 部署平台的加密密钥配置
合理链路是:
浏览器 → 携带用户凭证请求 BFF → BFF 校验身份和权限
→ BFF 从服务端读取 API Key → 调用模型 → 返回结果第 4 点需要区分:
- 安全措施:身份认证、权限控制、限流、请求参数校验、内容审核和审计日志。
- 稳定性措施:超时、重试、熔断和降级。
更好的面试表达
.gitignore只能避免密钥进入 Git,无法避免构建工具将VITE_环境变量写入前端产物。浏览器属于用户可控环境,因此模型 API Key 必须保存在 BFF 的服务端环境变量或 Secret Manager 中。前端先调用 BFF,由 BFF 完成用户认证、权限校验、限流和参数校验,再携带 Key 调用模型。此外还要处理超时、重试、内容安全和调用审计。
相关文章
- 面试题-基础
Vue 3 响应式解构:为什么替换 user 后出现“李四 / 王五”
通过一道 Vue 3 代码题,区分 reactive 对象解构、嵌套属性修改与对象替换的行为,并用 toRef 保持源属性关联。文章保留首次作答及追问补答,说明从误判到纠正的过程。
- 面试题-基础
Vue 3 编辑弹窗:草稿状态、取消重开与父子数据契约
以一个始终挂载的姓名编辑弹窗为场景,给出覆盖数据归属、保存取消、重开初始化和外部更新冲突的完整 Vue 3 解法。结合首次回答与递进补答,说明本地草稿、脏标记和版本校验各自解决的问题。
- 面试题-基础
JavaScript 浅拷贝、深拷贝与 structuredClone:前端状态更新的正确方式
通过一道对象复制代码题,梳理 JavaScript 浅拷贝、JSON 深拷贝、structuredClone 和 transferable object 的边界,并解释 React 结构共享与 Vue 3 响应式更新的差异。
评论
0 条评论会在审核后展示,邮箱不会公开。