Вопрос 23 · Раздел 17

Как реализовать аутентификацию и авторизацию в микросервисах

Structured Java interview answer with junior, middle, and senior-level explanation.

Версии по языкам: English Russian Ukrainian

🟢 Junior Level

Аутентификация — кто ты? (проверка личности)

Авторизация — что тебе можно? (проверка прав)

Самый популярный подход — JWT токены:

1. Клиент → Login Service → логин/пароль
2. Login Service → JWT токен
3. Клиент → JWT токен → API Gateway → проверка токена
4. API Gateway → forwarding к сервисам + userId в заголовке

JWT токен содержит:

  • Кто пользователь (userId, roles)
  • Подпись (чтобы нельзя было подделать)

🟡 Middle Level

JWT в API Gateway

@Component
public class AuthFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, 
                                    HttpServletResponse response, 
                                    FilterChain chain) {
        String token = request.getHeader("Authorization");
        
        if (token != null && token.startsWith("Bearer ")) {
            try {
                // JwtUtil — пример utility-класса. В production используйте Spring Security JWT
                // или библиотеку типа java-jwt (Auth0) / nimbus-jose-jwt.
                Claims claims = JwtUtil.parseToken(token.substring(7));
                request.setAttribute("userId", claims.get("userId"));
                request.setAttribute("roles", claims.get("roles"));
            } catch (JwtException e) {
                response.setStatus(HttpStatus.UNAUTHORIZED.value());
                return;
            }
        }
        
        chain.doFilter(request, response);
    }
}

OAuth 2.0 / OpenID Connect

Client → Auth Server (Keycloak) → Authorization Code
Client → Auth Server → Access Token + ID Token
Client → API Gateway + Access Token → Service

Типичные ошибки

  1. Токен в каждом сервисе:
    Каждый сервис валидирует токен → cryptographic overhead (подпись JWT — RSA/ECDSA).
    При 10K req/s на 20 сервисов = 200K HMAC/RSA операций. Решение: API Gateway
    валидирует один раз и передаёт результат через header.
    

Когда НЕ использовать JWT

  • Высокие требования к отзыву — JWT сложно отозвать (нужен blacklist)
  • Session-based лучше когда нужно мгновенное завершение сессии
  • OAuth2 Device Flow для устройств без браузера

🔴 Senior Level

Token propagation

Gateway → Service A → Service B
         Access Token передаётся по цепочке

mTLS (mutual TLS)

Service A ↔ Service B: взаимная проверка сертификатов
Дополнительная защита service-to-service коммуникации

Production Experience

Keycloak + Spring Security:

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: http://keycloak:8080/realms/myrealm
          jwk-set-uri: http://keycloak:8080/realms/myrealm/protocol/openid-connect/certs

Best Practices

✅ Валидация токена в Gateway
✅ HTTPS всегда
✅ Short-lived access tokens
✅ Refresh tokens
✅ mTLS для service-to-service
✅ Rotation signing keys

❌ Хранение секретов в токене
❌ Без expiration
❌ Валидация в каждом сервисе
❌ HTTP для токенов

🎯 Шпаргалка для интервью

Обязательно знать:

  • Аутентификация = кто ты, авторизация = что тебе можно
  • JWT токен: userId + roles + подпись, передаётся в Authorization: Bearer header
  • API Gateway валидирует токен один раз — сервисы получают результат через header (избегаем crypto overhead)
  • OAuth 2.0 / OpenID Connect — стандартный подход с Auth Server (Keycloak)
  • mTLS для service-to-service — взаимная проверка сертификатов
  • Short-lived access tokens + refresh tokens — баланс безопасности
  • НЕ использовать JWT при высоких требования к отзыву (нужен blacklist)

Частые уточняющие вопросы:

  • Почему не валидировать в каждом сервисе? RSA/ECDSA подпись — дорого. При 10K req/s на 20 сервисов = 200K HMAC операций.
  • Как отозвать JWT? JWT сложно отозвать — нужен blacklist или short-lived tokens. Для мгновенного отзыва — session-based лучше.
  • JWT vs OAuth2? JWT — формат токена, OAuth2 — протокол. OAuth2 может использовать JWT как access token.
  • Что такое mTLS? Mutual TLS — оба сервиса проверяют сертификаты друг друга — защита service-to-service.

Красные флаги (НЕ говорить):

  • “Каждый сервис валидирует JWT” — нет, crypto overhead, Gateway валидирует один раз
  • “JWT можно хранить секреты” — нет, JWT подписан но НЕ зашифрован (payload читаем)
  • “Access token без expiration” — нет, при утечке злоумышленник имеет вечный доступ
  • “HTTP для внутренних сервисов” — нет, токены всегда по HTTPS

Связанные темы:

  • [[9. Что такое API Gateway и какие задачи он решает]]
  • [[15. Как организовать коммуникацию между микросервисами]]
  • [[7. Что такое Service Discovery и зачем он нужен]]
  • [[26. Какие инструменты используются для оркестрации микросервисов]]
  • [[22. Что такое distributed tracing]]