← inaro.devAI駆動開発 学習ツール

サーバー経由で安全に呼ぶ

なぜ学ぶか: Phase 09で最も重要なトピック。「AIチャットを作った、でもAPIキーが漏れて高額請求」— これは実際に多発する事故で、このカリキュラムがセキュリティを重視してきた理由そのものです。フロント直呼びが『なぜ』危険かを理解し、Route Handlerで中継する正しい構成を身につけます。

フロント直呼び=キーが全世界に露出

ブラウザから直接Claudeを呼ぶと、APIキーが通信に乗り、開発者ツールで誰でも見られます。

正しい構成:ブラウザ →自分のAPI →Claude

ブラウザは自分のRoute Handler(/api/...)を呼び、その中でサーバーがClaudeを呼びます。キーはサーバーから一歩も出ません。

入力を信じない

ユーザー入力をそのままClaudeに渡す前に、長さ制限や検証(zod)を挟みます。乱用や悪用への第一歩の対策です。

レビューの最優先チェック

AIアプリを見たら真っ先に『キーはサーバー側か・フロントから直接叩いていないか』を確認します。ここだけは妥協しません。

コード例

// app/api/chat/route.ts — ブラウザとClaudeの間の「中継所」
import Anthropic from "@anthropic-ai/sdk";
import { z } from "zod";

const client = new Anthropic(); // キーはサーバーの環境変数から

// 入力を検証(信じない)
const BodySchema = z.object({
  message: z.string().min(1).max(2000),
});

export async function POST(request: Request) {
  const parsed = BodySchema.safeParse(await request.json());
  if (!parsed.success) {
    return Response.json({ error: "入力が不正です" }, { status: 400 });
  }

  const res = await client.messages.create({
    model: "claude-opus-4-8",
    max_tokens: 1024,
    messages: [{ role: "user", content: parsed.data.message }],
  });

  const text = res.content.find((b) => b.type === "text");
  // ブラウザには「結果」だけ返す。キーは一切出さない
  return Response.json({ reply: text?.type === "text" ? text.text : "" });
}

ブラウザ → /api/chat → Claude、の流れ。ブラウザは自分のAPIを叩くだけで、Claudeのキーには一切触れません。これがAIアプリの唯一の安全な型です。

ステップ 1 / 2

※ カリキュラムの内容はAIが生成しており、誤りが含まれる場合があります。正確な情報は公式ドキュメント等でご確認ください。