Питання 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]]