Java JWT 検証例
⚠️ 重要なお知らせ: これはデモンストレーション目的の基本的な例です。実運用で使用する際は、ソ フトウェアスタック、セキュリティ要件、デプロイ環境に特化したベストプラクティスを調査し、実装してください。常に組織のセキュリティガイドラインに従い、確立されたJWTライブラリやフレームワークの使用を検討してください。
📝 注意: この例は教育目的でJWKSのダウンロードとファイルキャッシングを示しています。実運用環境では、インフラストラクチャに基づいて、構成管理、環境変数、または好みのキャッシング戦略を使用してJWKSキー管理を実装することを選択できます。
この例は、Javaを使用してRokt JWTトークンを検証する方法を示しています。
前提条件
pom.xmlに次の依存関係を追加します:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
完全な例
package com.rokt;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import java.math.BigInteger;
import java.security.Key;
import java.security.KeyFactory;
import java.security.spec.ECPublicKeySpec;
import java.security.spec.ECParameterSpec;
import java.security.spec.ECPoint;
import java.util.Base64;
import java.util.Date;
public class RoktJwtValidator {
// 概要ページからテストトークンをコピー
private static final String SAMPLE_JWT_TOKEN = "PASTE_TEST_TOKEN_HERE";
// JWKS エンドポイント URL
private static final String JWKS_URL = "https://public-api.rokt.com/.well-known/jwks.json";
public static void main(String[] args) {
try {
System.out.println("=== Java JWT バリデーター ===");
System.out.println("トークン: " + SAMPLE_JWT_TOKEN.substring(0, 50) + "...");
System.out.println("JWKS URL: " + JWKS_URL);
System.out.println();
// JWKS をダウンロードしてキャッシュ
String jwksJson = downloadAndCacheJWKS(JWKS_URL, JWKS_CACHE_FILE);
System.out.println("JWKS のダウンロードとキャッシュに成功しました");
// JWKS から公開鍵の座標を抽出
String[] coordinates = extractKeyCoordinates(jwksJson);
String xCoordinate = coordinates[0];
String yCoordinate = coordinates[1];
// JWK 座標から ECDSA 公開鍵を作成
Key publicKey = createECDSAPublicKey(xCoordinate, yCoordinate);
// JWT トークンを検証
Claims claims = validateJWT(SAMPLE_JWT_TOKEN, publicKey);
System.out.println("✅ トークンの検証に成功しました!");
System.out.println("キャンペーン ID: " + claims.get("cid"));
System.out.println("クリエイティブ ID: " + claims.get("crid"));
System.out.println("RCLID: " + claims.get("rclid"));
System.out.println("発行日時: " + new Date(claims.getIssuedAt().getTime()) + " UTC");"
} catch (Exception e) {
System.err.println("❌ トークンの検証に失敗しました: " + e.getMessage());
e.printStackTrace();
}
}
private static Claims validateJWT(String token, Key publicKey) {
return Jwts.parserBuilder()
.setSigningKey(publicKey)
.setAllowedClockSkewSeconds(60) // 1分の時計のずれを許可
.build()
.parseClaimsJws(token)
.getBody();
}
private static Key createECDSAPublicKey(String xCoordinate, String yCoordinate) throws Exception {
// base64urlエンコードされた座標をデコード
byte[] xBytes = Base64.getUrlDecoder().decode(xCoordinate);
byte[] yBytes = Base64.getUrlDecoder().decode(yCoordinate);
// BigIntegerに変換
BigInteger x = new BigInteger(1, xBytes);
BigInteger y = new BigInteger(1, yBytes);
// AlgorithmParametersから標準のP-256曲線を使用
java.security.AlgorithmParameters parameters = java.security.AlgorithmParameters.getInstance("EC");
parameters.init(new java.security.spec.ECGenParameterSpec("secp256r1"));
ECParameterSpec ecParameterSpec = parameters.getParameterSpec(ECParameterSpec.class);
// ECDSA公開鍵仕様を作成
ECPublicKeySpec spec = new ECPublicKeySpec(
new ECPoint(x, y),
ecParameterSpec
);
// 公開鍵を生成
KeyFactory keyFactory = KeyFactory.getInstance("EC");
return keyFactory.generatePublic(spec);
}
}
入力/出力例
入力
- JWTトークン: Overviewページからテストトークンをコピー
- 公開鍵ソース:
https://public-api.rokt.com/.well-known/jwks.json
出力
=== Java JWTバリデーター ===
トークン: eyJhbGciOiJFUzI1NiIsImtpZCI6InJva3Qtc2lnbmluZy1rZX...
JWKS URL: https://public-api.rokt.com/.well-known/jwks.json
ダウンロード中: https://public-api.rokt.com/.well-known/jwks.json
JWKSをキャッシュに保存: jwks_cache.json
JWKSのダウンロードとキャッシュが成功しました
✅ トークンの検証に成功しました!
キャンペーンID: 3436085368692408324
クリエイティブID: 3437732754935906308
RCLID: 7db958dbd232247a4a8285a34d22fe0f4e9affa463bf5ee54e26721ab0df0e23
発行日時: Wed Aug 20 15:10:01 AEST 2025 UTC
実行方法
Mavenを使用する場合(推奨)
pom.xmlでMavenプロジェクトを作成:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.rokt</groupId>
<artifactId>jwt-validator</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>15</maven.compiler.source>
<maven.compiler.target>15</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
- コードを
src/main/java/com/rokt/RoktJwtValidator.javaに保存 - 実行:
mvn compile exec:java -Dexec.mainClass="com.rokt.RoktJwtValidator"
JARファイルを直接使用する
- JJWT JARファイルをダウンロード
- コードを
RoktJwtValidator.javaに保存 - コンパイル:
javac -cp ".:jjwt-api-0.11.5.jar:jjwt-impl-0.11.5.jar:jjwt-jackson-0.11.5.jar" RoktJwtValidator.java - 実行:
java -cp ".:jjwt-api-0.11.5.jar:jjwt-impl-0.11.5.jar:jjwt-jackson-0.11.5.jar" RoktJwtValidator
注意事項
-
公開鍵はRoktのJWKSエンドポイントから取得されます
-
この例では署名検証にECDSA-256 (ES256)アルゴリズムを使用しています
-
パフォーマンスのために公開鍵をキャッシュすることを検討してください