JWT-CPP
JWT-CPP
概要
JWT-CPPは、C++11でJSON Web Token(JWT)を作成および検証するためのヘッダーオンリーライブラリです。Thalhammer氏によって開発され、JWT標準(RFC 7519)の包括的な実装を提供します。2025年現在、すべてのJWT標準アルゴリズム(HMAC、RSA、ECDSA、EdDSA、PSS)をサポートし、OpenSSL、LibreSSL、wolfSSLなど複数のSSL実装に対応しています。ヘッダーオンリー設計により、外部依存関係を最小限に抑えながら高いパフォーマンスを実現し、PicoJSON、nlohmann/json、Boost.JSONなど複数のJSONライブラリとの統合が可能です。
特徴
JWT-CPPは、jwt::create、jwt::decode、jwt::verifyというコアコンポーネントを中心に構築された包括的なJWTライブラリです。主な特徴として、トレイトベースのアプローチによる複数のJSONライブラリとの統合、jwt::basic_claimクラスによる様々なデータ型のクレーム処理、OpenSSL、LibreSSL、wolfSSLなどの複数SSL実装サポートを提供します。時間処理にはstd::chrono::system_clock::time_pointを使用し、set_issued_now()とset_expires_in()メソッドによりタイムゾーンの問題を回避できます。ヘッダーオンリー設計により、コンパイル時の最適化が可能で、C++ネイティブの高いパフォーマンスを実現しています。
主な機能
- 完全なJWT標準サポート: HMAC、RSA、ECDSA、EdDSA、PSS対応
- ヘッダーオンリー設計: 外部依存関係の最小化と簡単な統合
- 複数JSON対応: PicoJSON、nlohmann/json、Boost.JSON等
- マルチSSL対応: OpenSSL、LibreSSL、wolfSSL対応
- 高いパフォーマンス: C++ネイティブの最適化された実装
- 豊富なクレーム処理: カスタムクレームと標準クレームの完全サポート
使用例
インストール
# CMakeLists.txt
find_package(jwt-cpp REQUIRED)
target_link_libraries(your_target jwt-cpp::jwt-cpp)
基本的なJWT操作
#include <jwt-cpp/jwt.h>
#include <iostream>
int main() {
try {
// JWTトークンの作成
auto token = jwt::create()
.set_issuer("myapp")
.set_type("JWS")
.set_payload_claim("username", jwt::claim(std::string("testuser")))
.set_payload_claim("role", jwt::claim(std::string("user")))
.set_issued_now()
.set_expires_in(std::chrono::hours{1})
.sign(jwt::algorithm::hs256{"my-secret-key"});
std::cout << "Generated Token: " << token << std::endl;
// JWTトークンのデコード
auto decoded = jwt::decode(token);
std::cout << "Issuer: " << decoded.get_issuer() << std::endl;
std::cout << "Username: " << decoded.get_payload_claim("username").as_string() << std::endl;
// JWTトークンの検証
auto verifier = jwt::verify()
.allow_algorithm(jwt::algorithm::hs256{"my-secret-key"})
.with_issuer("myapp");
verifier.verify(decoded);
std::cout << "Token is valid!" << std::endl;
} catch (const jwt::token_verification_exception& e) {
std::cout << "Token verification failed: " << e.what() << std::endl;
}
return 0;
}
RSA署名による認証
#include <jwt-cpp/jwt.h>
#include <fstream>
#include <sstream>
class RSAJWTService {
private:
std::string private_key;
std::string public_key;
public:
RSAJWTService(const std::string& private_key_path, const std::string& public_key_path) {
private_key = readFile(private_key_path);
public_key = readFile(public_key_path);
}
std::string createToken(const std::string& userId, const std::string& email) {
return jwt::create()
.set_issuer("rsa-service")
.set_subject(userId)
.set_audience("api-clients")
.set_payload_claim("email", jwt::claim(email))
.set_issued_now()
.set_expires_in(std::chrono::hours{2})
.sign(jwt::algorithm::rs256{public_key, private_key, "", ""});
}
bool validateToken(const std::string& token) {
try {
auto decoded = jwt::decode(token);
auto verifier = jwt::verify()
.allow_algorithm(jwt::algorithm::rs256{public_key, "", "", ""})
.with_issuer("rsa-service")
.with_audience("api-clients");
verifier.verify(decoded);
return true;
} catch (const jwt::token_verification_exception&) {
return false;
}
}
private:
std::string readFile(const std::string& filepath) {
std::ifstream file(filepath);
std::stringstream buffer;
buffer << file.rdbuf();
return buffer.str();
}
};
高度なクレーム処理
#include <jwt-cpp/jwt.h>
#include <map>
#include <vector>
class AdvancedJWTService {
private:
std::string secret;
public:
AdvancedJWTService(const std::string& secret_key) : secret(secret_key) {}
std::string createAdvancedToken(
const std::string& userId,
const std::map<std::string, std::string>& custom_claims,
const std::vector<std::string>& permissions
) {
auto builder = jwt::create()
.set_issuer("advanced-service")
.set_subject(userId)
.set_audience("api")
.set_issued_now()
.set_expires_in(std::chrono::hours{8});
// カスタムクレームの追加
for (const auto& claim : custom_claims) {
builder.set_payload_claim(claim.first, jwt::claim(claim.second));
}
// 権限の追加
builder.set_payload_claim("permissions", jwt::claim(permissions));
return builder.sign(jwt::algorithm::hs256{secret});
}
bool hasPermission(const std::string& token, const std::string& required_permission) {
try {
auto decoded = jwt::decode(token);
auto permissions_claim = decoded.get_payload_claim("permissions");
if (permissions_claim.get_type() == jwt::json::type::array) {
for (const auto& perm : permissions_claim.as_array()) {
if (perm.get_type() == jwt::json::type::string &&
perm.as_string() == required_permission) {
return true;
}
}
}
return false;
} catch (const std::exception&) {
return false;
}
}
};
比較・代替手段
優位性
- ヘッダーオンリー設計による簡単な統合
- C++ネイティブの高いパフォーマンス
- 完全なJWT標準サポート
- 複数のSSLライブラリとの互換性
- 豊富なアルゴリズム対応
注意点
- C++環境でのみ利用可能
- 複雑なテンプレートによるコンパイル時間の増加
- SSLライブラリの依存関係
- 高度な機能の学習コスト
類似ライブラリ比較
- jose-cpp: C++用のJOSE(JSON Object Signing and Encryption)ライブラリ
- jsonwebtoken: Node.js用のJWTライブラリ
- PyJWT: Python用のJWTライブラリ
学習リソース
公式ドキュメント
参考資料
まとめ
JWT-CPPは、C++アプリケーションにJWT機能を統合するための包括的で高性能なライブラリです。ヘッダーオンリー設計による簡単な統合、完全なJWT標準サポート、複数のSSLライブラリとの互換性により、セキュアな認証システムを効率的に構築できます。特に、C++ネイティブの最適化された実装により、高いパフォーマンスが要求されるアプリケーションに最適です。複数のJSONライブラリとの統合サポートにより、既存のC++プロジェクトにも容易に組み込むことができます。