JWT токены в Java: Полное руководство по работе с JSON Web Tokens

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

JWT токены в Java: Полное руководство по работе с JSON Web Tokens

JSON Web Token (JWT) — это открытый стандарт (RFC 7519), который определяет компактный и самодостаточный способ передачи информации между сторонами в виде JSON-объекта. В Java существует несколько зрелых библиотек для работы с JWT, которые позволяют создавать, подписывать, проверять и декодировать токены. В этой статье мы подробно рассмотрим три основные библиотеки: JJWT, Auth0 java-jwt и Nimbus JOSE + JWT, а также разберем лучшие практики их использования.

Что такое JWT и зачем он нужен в Java?

JWT состоит из трех частей, разделенных точками:

  • Header — содержит информацию о типе токена и алгоритме подписи (например, HS256 или RS256).
  • Payload — содержит утверждения (claims): стандартные (iss, sub, exp, iat) и кастомные данные.
  • Signature — создается путем хеширования header + payload с использованием секретного ключа или пары RSA/ECDSA.

В Java JWT чаще всего используется для:

  • Аутентификации и авторизации в REST API (особенно в связке со Spring Security).
  • Передачи информации между микросервисами.
  • Реализации Single Sign-On (SSO).

Библиотека JJWT (io.jsonwebtoken)

JJWT — одна из самых популярных и хорошо документированных библиотек для Java. Она поддерживает все современные алгоритмы подписи и шифрования, а также предоставляет удобный fluent API.

Установка

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.12.6</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>0.12.6</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>0.12.6</version>
    <scope>runtime</scope>
</dependency>

Создание JWT с JJWT

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import javax.crypto.SecretKey;
import java.util.Date;

public class JwtExample {
    public static void main(String[] args) {
        // Генерация безопасного ключа для HS256
        SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256);

        String jwt = Jwts.builder()
                .subject("user123")
                .issuer("https://pythonlib.ru")
                .issuedAt(new Date())
                .expiration(new Date(System.currentTimeMillis() + 3600000)) // 1 час
                .claim("role", "ADMIN")
                .signWith(key)
                .compact();

        System.out.println("JWT: " + jwt);
    }
}

Проверка и парсинг JWT

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;

public class JwtParser {
    public static void main(String[] args) {
        String jwt = "eyJhbGciOiJIUzI1NiJ9..."; // ваш токен
        SecretKey key = ...; // тот же ключ, что использовался для подписи

        try {
            Jws<Claims> claimsJws = Jwts.parser()
                    .verifyWith(key)
                    .build()
                    .parseSignedClaims(jwt);
            
            Claims claims = claimsJws.getPayload();
            String subject = claims.getSubject();
            String role = claims.get("role", String.class);
            
            System.out.println("Subject: " + subject);
            System.out.println("Role: " + role);
        } catch (Exception e) {
            System.err.println("Invalid JWT: " + e.getMessage());
        }
    }
}

Библиотека Auth0 java-jwt

Auth0 предоставляет легковесную библиотеку с минимальным набором зависимостей. Она идеально подходит для простых проектов, где не требуется сложное шифрование.

Установка

<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>4.4.0</version>
</dependency>

Пример создания и проверки

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java                    

Рекомендаций