メインコンテンツにスキップ

JWTデコーダー

JWT (JSON Web Token)をデコードして分析します。ヘッダー、ペイロード、署名を確認し、有効期限をチェックします。

About JWT

JWT (JSON Web Token) is a compact, URL-safe means of representing claims to be transferred between two parties. It consists of three parts: Header, Payload, and Signature.

Common Payload Claims

  • sub - Subject (user ID)
  • iat - Issued at (timestamp)
  • exp - Expiration time (timestamp)
  • iss - Issuer
  • aud - Audience
  • nbf - Not before (timestamp)

主な機能

🔓 JWTデコード

  • ヘッダー、ペイロード、署名の自動分離
  • Base64 URLデコード
  • JSONフォーマット

⏰ タイムスタンプ分析

  • iat (発行時刻)の確認
  • exp (有効期限)の確認と期限切れ表示
  • nbf (有効開始時刻)の確認

📋 コピー機能

  • ヘッダーJSONのコピー
  • ペイロードJSONのコピー
  • 署名のコピー

JWTとは?

JWT (JSON Web Token)は、二者間で情報を安全に転送するためのコンパクトでURL-safeな方法です。

JWT構造

JWTはドット(.)で区切られた3つの部分で構成されています:

header.payload.signature
  1. Header: トークンタイプとアルゴリズム情報
  2. Payload: クレーム(claim)データ
  3. Signature: ヘッダーとペイロードを秘密鍵で署名した値

一般的なクレーム

標準クレーム

  • sub (Subject): トークンの主体(ユーザーID)
  • iss (Issuer): トークン発行者
  • aud (Audience): トークンの対象
  • exp (Expiration): 有効期限
  • iat (Issued At): 発行時刻
  • nbf (Not Before): 有効開始時刻

カスタムクレーム

JWTペイロードに必要な情報を自由に追加できます:

  • ユーザー名、メール
  • 権限、役割
  • その他のメタデータ

JWT構造の詳細

ヘッダー例

{
"alg": "HS256",
"typ": "JWT"
}
  • alg: 署名アルゴリズム(HS256、RS256など)
  • typ: トークンタイプ(常にJWT)

ペイロード例

{
"sub": "1234567890",
"name": "田中太郎",
"email": "tanaka@example.com",
"role": "admin",
"iat": 1516239022,
"exp": 1516242622
}

署名の生成

HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)

JWTの使用フロー

1. 認証

ユーザー → ログイン → サーバー

JWT発行 ← サーバー

2. APIリクエスト

GET /api/profile
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

3. 検証

クライアント → JWT送信 → サーバー

署名検証

データ取得

セキュリティ注意事項

⚠️ 重要: このツールはクライアント側で実行され、署名検証は行いません。

セキュリティのベストプラクティス

  1. 秘密鍵の保護

    • 秘密鍵をクライアント側に保存しない
    • 環境変数で管理
    • 定期的な鍵のローテーション
  2. HTTPS使用

    • 必ずHTTPS経由でJWTを送信
    • 中間者攻撃の防止
  3. 有効期限の設定

    • 短い有効期限を設定(15分〜1時間)
    • リフレッシュトークンの使用
  4. 機密情報の非格納

    • ペイロードは暗号化されていない
    • パスワードやクレジットカード情報を含めない
    • Base64はエンコードであり、暗号化ではない

安全でない例

{
"userId": 123,
"password": "secret123", // ダメ!
"creditCard": "1234-5678" // ダメ!
}

安全な例

{
"userId": 123,
"role": "user",
"permissions": ["read", "write"]
}

使用例

1. 認証 (Authentication)

ユーザーログイン後JWT発行、以降のリクエストに含める

// ログイン
const response = await fetch('/api/login', {
method: 'POST',
body: JSON.stringify({ username, password })
});
const { token } = await response.json();

// トークンを保存
localStorage.setItem('token', token);

// 以降のリクエスト
fetch('/api/profile', {
headers: {
'Authorization': `Bearer ${token}`
}
});

2. 情報交換

2つのシステム間での安全な情報転送

// サービスA
const token = jwt.sign({ data: 'important' }, secret);

// サービスB
const decoded = jwt.verify(token, secret);
console.log(decoded.data); // 'important'

3. API認可

APIアクセス権限確認用トークン

// 権限チェック
const decoded = jwt.decode(token);
if (decoded.role === 'admin') {
// 管理者操作を許可
}

4. SSO (Single Sign-On)

複数のサービス間での認証共有

// メインサービスでログイン
const token = createJWT({ userId, email });

// 他のサービスでトークン使用
// Service A, B, C すべてで同じトークンを検証

実装例

Node.js (jsonwebtoken)

const jwt = require('jsonwebtoken');

// トークン生成
const token = jwt.sign(
{ userId: 123, role: 'admin' },
'your-secret-key',
{ expiresIn: '1h' }
);

// トークン検証
try {
const decoded = jwt.verify(token, 'your-secret-key');
console.log(decoded); // { userId: 123, role: 'admin', iat: ..., exp: ... }
} catch (err) {
console.error('無効なトークン');
}

Python (PyJWT)

import jwt
import datetime

# トークン生成
payload = {
'userId': 123,
'role': 'admin',
'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1)
}
token = jwt.encode(payload, 'your-secret-key', algorithm='HS256')

# トークン検証
try:
decoded = jwt.decode(token, 'your-secret-key', algorithms=['HS256'])
print(decoded)
except jwt.ExpiredSignatureError:
print('トークンの期限が切れています')
except jwt.InvalidTokenError:
print('無効なトークン')

Java (jjwt)

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;

// トークン生成
String token = Jwts.builder()
.setSubject("123")
.claim("role", "admin")
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 3600000))
.signWith(SignatureAlgorithm.HS256, "your-secret-key")
.compact();

// トークン検証
Claims claims = Jwts.parser()
.setSigningKey("your-secret-key")
.parseClaimsJws(token)
.getBody();

トークンリフレッシュ戦略

アクセストークン + リフレッシュトークン

// アクセストークン: 短い有効期限(15分)
const accessToken = jwt.sign(
{ userId: 123 },
SECRET,
{ expiresIn: '15m' }
);

// リフレッシュトークン: 長い有効期限(7日)
const refreshToken = jwt.sign(
{ userId: 123 },
REFRESH_SECRET,
{ expiresIn: '7d' }
);

// リフレッシュエンドポイント
app.post('/api/refresh', (req, res) => {
const { refreshToken } = req.body;
const decoded = jwt.verify(refreshToken, REFRESH_SECRET);
const newAccessToken = jwt.sign(
{ userId: decoded.userId },
SECRET,
{ expiresIn: '15m' }
);
res.json({ accessToken: newAccessToken });
});

よくある問題と解決

Q: JWTが大きすぎる

A: ペイロードに含める情報を最小限に。必要な情報のみ含める。

Q: 無効化方法は?

A: JWTは基本的にステートレス。無効化にはブラックリストやホワイトリストが必要。

Q: 更新方法は?

A: リフレッシュトークンを使用して新しいアクセストークンを発行。

関連ツール

💬 このツールは役に立ちましたか?

JWTデコーダーを使用して、トークンのデバッグや分析に役立ちましたか?フィードバックや改善提案がありましたら、お聞かせください。

プライバシー保護

このツールは完全にクライアント側で動作します。入力したJWTトークンはサーバーに送信されず、ブラウザ内でのみ処理されます。あなたのトークンは完全に安全です。