概要
深刻度: HIGH
vite.config.ts の define 設定により、GEMINI_API_KEY が JavaScript バンドルに静的文字列として埋め込まれます。ブラウザの DevTools > Sources で誰でも確認可能な状態です。
該当箇所
vite.config.ts (全体)
define: {
'process.env.API_KEY': JSON.stringify(env.GEMINI_API_KEY),
'process.env.GEMINI_API_KEY': JSON.stringify(env.GEMINI_API_KEY)
},
utils/geminiClient.ts L5-6
// NOTE: In a real production app, move this logic to a server-side endpoint.
const ai = new GoogleGenAI({ apiKey: process.env.API_KEY });
問題の詳細
- Vite の
define は ビルド時に文字列置換 を行うため、ビルド後の JS に API キーがリテラルとして残る
server/api/analyze.ts にサーバーサイド実装のサンプルが存在するが、コメントアウトされており未実装
- 本番デプロイ時に API キーが公開状態になるリスクが高い
修正方針
短期対応(緊急)
- 現在の API キーを Google AI Studio でローテーション
.env ファイルに API キーが入っている場合、git log を確認してコミット履歴から漏洩していないか確認
中期対応(推奨)
server/api/analyze.ts のサンプルをベースに、サーバーサイドエンドポイントを実装する:
クライアント → POST /api/analyze (音声データ) → サーバー → Gemini API
↑
API キーはここだけ
Next.js / Vercel Edge Functions / Cloudflare Workers などを活用することで、API キーをサーバー環境変数として安全に管理できる。
暫定対応(開発環境のみ許容)
現状の構成は ローカル開発・個人利用のみ に限定し、公開デプロイは行わない。
参考
このIssueは 2026-06-04 の日次自動コードレビューにより作成されました。
概要
深刻度: HIGH
vite.config.tsのdefine設定により、GEMINI_API_KEYが JavaScript バンドルに静的文字列として埋め込まれます。ブラウザの DevTools > Sources で誰でも確認可能な状態です。該当箇所
vite.config.ts(全体)utils/geminiClient.tsL5-6問題の詳細
defineは ビルド時に文字列置換 を行うため、ビルド後の JS に API キーがリテラルとして残るserver/api/analyze.tsにサーバーサイド実装のサンプルが存在するが、コメントアウトされており未実装修正方針
短期対応(緊急)
.envファイルに API キーが入っている場合、git logを確認してコミット履歴から漏洩していないか確認中期対応(推奨)
server/api/analyze.tsのサンプルをベースに、サーバーサイドエンドポイントを実装する:Next.js / Vercel Edge Functions / Cloudflare Workers などを活用することで、API キーをサーバー環境変数として安全に管理できる。
暫定対応(開発環境のみ許容)
現状の構成は ローカル開発・個人利用のみ に限定し、公開デプロイは行わない。
参考
defineドキュメント: ビルド時の静的置換であることが明記されているこのIssueは 2026-06-04 の日次自動コードレビューにより作成されました。