← Назад к вопросам
Какой алгоритм действий для получения JWT токена?
1.0 Junior🔥 211 комментариев
#REST API и микросервисы#Основы Java
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Алгоритм получения JWT токена
JWT (JSON Web Token) — это компактный, самодостаточный токен для аутентификации и авторизации. Процесс получения токена включает несколько шагов.
Основной алгоритм
Шаг 1: Пользователь отправляет учётные данные
Пользователь отправляет username и пароль на сервер через POST запрос к /auth/login.
Шаг 2: Сервер проверяет креденшалы
- Найти пользователя в БД по username
- Проверить пароль (сравнить хеши)
- Если неверно → вернуть 401 Unauthorized
Шаг 3: Сервер генерирует JWT токен
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class JwtTokenProvider {
private static final String SECRET_KEY = "your-secret-key";
private static final long EXPIRATION_TIME = 3600000;
public String generateToken(String username, String userId) {
Date now = new Date();
Date expiryDate = new Date(now.getTime() + EXPIRATION_TIME);
return Jwts.builder()
.setSubject(username)
.claim("userId", userId)
.claim("roles", "USER,ADMIN")
.setIssuedAt(now)
.setExpiration(expiryDate)
.signWith(SignatureAlgorithm.HS512, SECRET_KEY)
.compact();
}
}
Структура JWT токена
JWT состоит из 3 частей, разделённых точками:
- Header: {alg: HS512, typ: JWT}
- Payload: {sub: username, userId: 123456, roles: USER}
- Signature: HMAC-SHA512(header.payload, SECRET_KEY)
Шаг 4: Сервер возвращает токен клиенту
@PostMapping("/auth/login")
public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) {
User user = userService.authenticateUser(loginRequest.getUsername(), loginRequest.getPassword());
if (user == null) {
return ResponseEntity.status(401).body("Invalid credentials");
}
String token = jwtTokenProvider.generateToken(user.getUsername(), user.getId());
return ResponseEntity.ok(
new AuthResponse("success", token, "Bearer", 3600)
);
}
Использование токена
Клиент отправляет токен в каждом запросе в Authorization заголовке.
Проверка и валидация токена на сервере
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain)
throws ServletException, IOException {
String token = extractTokenFromRequest(request);
if (token != null && jwtTokenProvider.validateToken(token)) {
String username = jwtTokenProvider.getUsernameFromToken(token);
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(
userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
}
filterChain.doFilter(request, response);
}
}
Безопасность
- Secret key: Храни в .env или конфиге
- HTTPS: Передавай токены ТОЛЬКО по HTTPS
- Expiration: Устанавливай разумный TTL (15 мин - 1 час)
- Refresh tokens: Для долгоживущих сессий используй отдельные refresh токены
- Подпись: Используй сильные алгоритмы (HS512, RS256)
Итого
Получение JWT токена — это процесс аутентификации пользователя и выдачи ему самоподписанного токена, который затем используется для авторизации в защищённых ресурсах.