Можно ли при валидации JWT проверить только подпись, игнорируя claims?

«Можно ли при валидации JWT проверить только подпись, игнорируя claims?» — вопрос из категории Безопасность, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, можно. Библиотеки для работы с JWT обычно предоставляют методы для проверки только криптографической подписи токена, без валидации стандартных claims (например, exp, iss, aud).

Пример с библиотекой jjwt (Java JWT):

import io.jsonwebtoken.*;

// Декодируем и проверяем ТОЛЬКО подпись
Jws<Claims> jws = Jwts.parserBuilder()
    .setSigningKey(secretKey) // Ключ для проверки подписи
    .build()
    .parseClaimsJws(token); // Выбросит SignatureException при невалидной подписи

// Claims доступны, но их срок действия и другие поля НЕ проверялись
Claims claims = jws.getBody();

Пример с библиотекой java-jwt (Auth0):

import com.auth0.jwt.*;
import com.auth0.jwt.algorithms.Algorithm;

// 1. Декодируем токен без проверки
DecodedJWT decodedJWT = JWT.decode(token);

// 2. Проверяем только подпись
Algorithm algorithm = Algorithm.HMAC256("secret");
algorithm.verify(decodedJWT); // Выбросит SignatureVerificationException при ошибке

Важно: Проверка только подписи — это операция низкого уровня. В реальных сценариях аутентификации/авторизации всегда необходимо также проверять claims (особенно exp и iss), чтобы избежать уязвимостей, связанных с использованием просроченных или выданных недоверенным источником токенов.