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