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

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

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

Начать курс

JWT токены в Java: создание, проверка и использование

JSON Web Token (JWT) — это компактный и самодостаточный способ передачи информации между сторонами в виде JSON-объекта. В Java JWT активно используется для аутентификации, авторизации и обмена данными в REST API и микросервисной архитектуре. В этой статье мы разберём две самые популярные библиотеки для работы с JWT в Java — JJWT (Java JWT) от Stormpath и java-jwt от Auth0, а также рассмотрим интеграцию с Spring Security.

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

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

  • Header — заголовок, содержащий тип токена и алгоритм подписи (например, HS256 или RS256).
  • Payload — полезная нагрузка с утверждениями (claims), такими как идентификатор пользователя, роли, срок действия.
  • Signature — подпись, созданная на основе header, payload и секретного ключа.

В Java JWT чаще всего применяется для:

  • Аутентификации пользователей без сохранения сессий на сервере (stateless).
  • Передачи прав доступа между микросервисами.
  • Одноразовых токенов для сброса пароля или подтверждения email.

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

JJWT — это самая популярная библиотека для работы с JWT в Java. Она проста в использовании, поддерживает все стандартные алгоритмы (HS256, RS256, ES256) и активно обновляется.

Подключение JJWT через Maven

<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 токена

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 token = Jwts.builder()
            .subject("user123")
            .claim("role", "admin")
            .issuedAt(new Date())
            .expiration(new Date(System.currentTimeMillis() + 3600000)) // 1 час
            .signWith(key)
            .compact();

        System.out.println("Созданный JWT: " + token);
    }
}

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

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

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

        try {
            Jws<Claims> claimsJws = Jwts.parser()
                .verifyWith(key)
                .build()
                .parseSignedClaims(jwtToken);

            Claims claims = claimsJws.getPayload();
            System.out.println("Subject: " + claims.getSubject());
            System.out.println("Role: " + claims.get("role"));
            System.out.println("Expiration: " + claims.getExpiration());
        } catch (JwtException e) {
            System.out.println("Токен недействителен: " + e.getMessage());
        }
    }
}

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

java-jwt (com.auth0) — это лёгкая и быстрая библиотека, которая также широко используется в Java-проектах, особенно в связке с Spring Boot.

Подключение через Maven

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

Создание JWT с помощью Auth0

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import java.util.Date;

public class Auth0JwtExample                    

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