Claude CodeでJWT認証を設計・実装するベストプラクティス
Claude Codeを使ったJWT認証の設計パターンと実装方法を解説。アクセストークン・リフレッシュトークンの管理、セキュリティ対策まで網羅。
JWT認証の基本設計
JWT(JSON Web Token)はステートレスな認証を実現するトークン形式です。Claude Codeを使えば、セキュアなJWT認証基盤を効率的に構築できます。
トークン生成と検証
import jwt from "jsonwebtoken";
import { z } from "zod";
const TokenPayloadSchema = z.object({
userId: z.string(),
email: z.string().email(),
role: z.enum(["admin", "user", "viewer"]),
});
type TokenPayload = z.infer<typeof TokenPayloadSchema>;
const JWT_CONFIG = {
accessSecret: process.env.JWT_ACCESS_SECRET!,
refreshSecret: process.env.JWT_REFRESH_SECRET!,
accessExpiresIn: "15m" as const,
refreshExpiresIn: "7d" as const,
};
function generateTokens(payload: TokenPayload) {
const accessToken = jwt.sign(payload, JWT_CONFIG.accessSecret, {
expiresIn: JWT_CONFIG.accessExpiresIn,
issuer: "my-app",
audience: "my-app-client",
});
const refreshToken = jwt.sign(
{ userId: payload.userId },
JWT_CONFIG.refreshSecret,
{
expiresIn: JWT_CONFIG.refreshExpiresIn,
issuer: "my-app",
}
);
return { accessToken, refreshToken };
}
function verifyAccessToken(token: string): TokenPayload {
const decoded = jwt.verify(token, JWT_CONFIG.accessSecret, {
issuer: "my-app",
audience: "my-app-client",
});
return TokenPayloadSchema.parse(decoded);
}
認証ミドルウェア
import { Request, Response, NextFunction } from "express";
interface AuthenticatedRequest extends Request {
user?: TokenPayload;
}
function authMiddleware(
req: AuthenticatedRequest,
res: Response,
next: NextFunction
) {
const authHeader = req.headers.authorization;
if (!authHeader?.startsWith("Bearer ")) {
return res.status(401).json({ error: "No token provided" });
}
const token = authHeader.slice(7);
try {
const payload = verifyAccessToken(token);
req.user = payload;
next();
} catch (error) {
if (error instanceof jwt.TokenExpiredError) {
return res.status(401).json({
error: "Token expired",
code: "TOKEN_EXPIRED",
});
}
return res.status(401).json({ error: "Invalid token" });
}
}
リフレッシュトークンのローテーション
セキュリティを高めるため、リフレッシュ時に新しいリフレッシュトークンを発行します。
import { Redis } from "ioredis";
const redis = new Redis(process.env.REDIS_URL!);
async function refreshAccessToken(refreshToken: string) {
// リフレッシュトークンが無効化されていないか確認
const isRevoked = await redis.get(`revoked:${refreshToken}`);
if (isRevoked) {
throw new Error("Refresh token has been revoked");
}
const decoded = jwt.verify(refreshToken, JWT_CONFIG.refreshSecret) as {
userId: string;
};
// ユーザー情報を取得
const user = await getUserById(decoded.userId);
if (!user) {
throw new Error("User not found");
}
// 古いリフレッシュトークンを無効化
await redis.set(
`revoked:${refreshToken}`,
"1",
"EX",
7 * 24 * 60 * 60
);
// 新しいトークンペアを生成
const payload: TokenPayload = {
userId: user.id,
email: user.email,
role: user.role,
};
return generateTokens(payload);
}
ログインエンドポイント
import bcrypt from "bcrypt";
app.post("/auth/login", async (req, res) => {
const { email, password } = req.body;
const user = await getUserByEmail(email);
if (!user) {
return res.status(401).json({ error: "Invalid credentials" });
}
const isValid = await bcrypt.compare(password, user.passwordHash);
if (!isValid) {
return res.status(401).json({ error: "Invalid credentials" });
}
const payload: TokenPayload = {
userId: user.id,
email: user.email,
role: user.role,
};
const tokens = generateTokens(payload);
// リフレッシュトークンをHttpOnly Cookieに設定
res.cookie("refreshToken", tokens.refreshToken, {
httpOnly: true,
secure: true,
sameSite: "strict",
maxAge: 7 * 24 * 60 * 60 * 1000,
});
res.json({ accessToken: tokens.accessToken });
});
セキュリティ上の注意点
JWT認証で特に注意すべきポイントです。セキュリティの全体設計についてはOAuth認証の実装も参照してください。
| リスク | 対策 |
|---|---|
| トークン漏洩 | 短い有効期限 + リフレッシュトークン |
| XSS | HttpOnly Cookie + CSP |
| CSRF | SameSite属性 + CSRFトークン |
| リプレイ攻撃 | jtiクレーム + ブラックリスト |
Claude Codeでの活用
プロジェクトの既存コードに合わせたJWT認証を実装する際は、以下のようにClaude Codeに指示します。生産性を上げるコツはClaude Codeの生産性を3倍にする10のTipsで解説しています。
JWT認証を実装して。
- アクセストークン: 15分、リフレッシュトークン: 7日
- リフレッシュトークンローテーション対応
- Redisでトークンのブラックリスト管理
- 既存のユーザーモデルと統合して
JWTの詳細仕様はRFC 7519、Claude Codeの使い方は公式ドキュメントを参照してください。
まとめ
JWT認証はステートレスな設計が魅力ですが、トークン管理とセキュリティ対策が重要です。Claude Codeでプロジェクト全体を把握した上で実装すれば、一貫性のある認証基盤を構築できます。
無料PDF: Claude Code はじめてのチートシート
まずは無料PDFで基本コマンドと最初の使い方をまとめて確認してください。登録後はそのままテンプレート集や導入相談にも進めます。
スパムは送りません。登録情報は厳重に管理します。
Claude Codeを仕事で使える形にしませんか?
無料PDFで基礎を固めたあと、すぐ使えるテンプレート集で試し、必要なら業務自動化や導入相談まで進められます。
この記事を書いた人
Masa
現役DX室長|Claude Code でゼロから多言語AI技術メディア運営中。実務直結の自動化、AI開発相談・研修受付中。
関連書籍・参考図書
この記事のテーマに関連する書籍を楽天ブックスで探せます。
※ 当サイトは楽天市場のアフィリエイトプログラムに参加しています。上記リンクから商品をご購入いただくと、運営者に紹介料が支払われる場合があります。
関連記事
Claude Codeで多言語記事を毎日公開するための7つのデプロイ前チェック
日本語だけ公開して終わらせないために、Claude Codeで多言語記事を毎日出す前に確認したい7つのチェックを実例つきで整理しました。
Codex AutomationsでAIに毎日のコンテンツ運用を任せる方法
Codex Automationsを使って、アクセス確認、記事改善、CTA改善、デプロイ、公開確認までを毎日の運用フローとして回す方法を解説します。
Claude Code × GCP Cloud Functions 完全ガイド|サーバーレス関数を爆速開発
GCP Cloud FunctionsをClaude Codeで効率化。HTTP/Pub/Sub/Firestoreトリガーの実装からローカルテスト・デプロイ自動化まで、Masaの実務経験をもとに実例コードで解説。