← Назад к вопросам

Какой алгоритм действий для получения 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: Сервер проверяет креденшалы

  1. Найти пользователя в БД по username
  2. Проверить пароль (сравнить хеши)
  3. Если неверно → вернуть 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 токена — это процесс аутентификации пользователя и выдачи ему самоподписанного токена, который затем используется для авторизации в защищённых ресурсах.