JWT-CPP

認証C++JWTJSON Web Token暗号化OpenSSLヘッダーオンリーセキュリティ

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::createjwt::decodejwt::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++プロジェクトにも容易に組み込むことができます。