> Как обезопасить взаимодействие микросервисов при использовании REST или gRPC (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Black Wall Group (BWG)
Стек: Go
> Пример ответа
Основные меры безопасности взаимодействия микросервисов в Go:
-
TLS/mTLS - обязательное шифрование трафика. Для gRPC встроенная поддержка TLS, для REST - настройка HTTPS. mTLS обеспечивает двустороннюю аутентификацию сертификатами (например, через cert-manager или SPIRE).
-
Аутентификация и авторизация - использование JWT или OAuth2. В Go популярна библиотека
go-joseдля JWT. Каждый запрос проверяет токен через middleware (например, в gRPC перехватчики, в REST - HTTP middleware). -
API Gateway - единая точка входа, где выполняется валидация токенов, rate limiting, логирование. Пример: Envoy или Kong.
-
Service Mesh (Istio, Linkerd) - прозрачное шифрование mTLS, политики доступа, observability без изменения кода.
-
Валидация входных данных - использование protobuf валидаторов для gRPC (например,
protoc-gen-validate) или библиотек типаgo-playground/validatorдля REST. -
Rate Limiting и Circuit Breaker - защита от DDoS и каскадных отказов. В Go:
golang.org/x/time/rateдля лимитов,sony/gobreakerдля circuit breaker. -
Логирование и мониторинг - структурированные логи с корреляционными ID (через OpenTelemetry), метрики (Prometheus) для обнаружения аномалий.
Пример middleware для проверки JWT в Go:
GOfunc AuthMiddleware(next http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {token := r.Header.Get("Authorization")if !validateJWT(token) {http.Error(w, "Unauthorized", http.StatusUnauthorized)return}next.ServeHTTP(w, r)})}
Для gRPC аналогичный перехватчик:
GOfunc UnaryAuthInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {md, ok := metadata.FromIncomingContext(ctx)if !ok || !validateToken(md["authorization"]) {return nil, status.Error(codes.Unauthenticated, "invalid token")}return handler(ctx, req)}
Ключевой принцип - Zero Trust: не доверять ни одному запросу, даже внутри сети, и всегда проверять подлинность и права доступа.
> Похожие задачи по Go
Как выбирается канал при нескольких готовых сообщениях в select в Go
Есть ли общая память между разными процессами
Что нужно помнить при добавлении элементов в слайс Go без знания точного размера
Можно ли шарить данные между потоками
> Похожие задачи по backend
Как выбирается канал при нескольких готовых сообщениях в select в Go
Есть ли общая память между разными процессами
Что нужно помнить при добавлении элементов в слайс Go без знания точного размера
Можно ли шарить данные между потоками
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью