Як реалізувати автентифікацію та авторизацію в мікросервісах
Structured Java interview answer with junior, middle, and senior-level explanation.
🟢 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
Типові помилки
- Токен в кожному сервісі:
Кожен сервіс валідує токен → 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]]