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 Также в библиотеке
Работа с датами в Swift (iOS/macOS): библиотеки и фреймворки
SwiftyUserDefaults для Swift: полное руководство с примерами
Очереди задач в Rust: Обзор библиотек для асинхронной обработки
Тестирование в Go (Golang): фреймворки и инструменты — полное руководство
Мониторинг TypeScript-приложений: инструменты и библиотеки