Как реализовать аутентификацию и авторизацию в микросервисах
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]]