Какой встроенный middleware включает Echo (Logger, Recover, CORS, JWT и др.)?
Echo включает Logger, Recover, CORS, BasicAuth, KeyAuth, JWT (отдельный модуль с v4.10), RateLimiter, Gzip, RequestID, Timeout, Static — подключаются через e.Use() из пакета middleware.
Встроенный middleware в Echo
Echo поставляется с богатым набором готового middleware в пакете github.com/labstack/echo/v4/middleware. Все они подключаются через e.Use() глобально или через group.Use() для группы маршрутов.
Logger
Логирует каждый HTTP-запрос: метод, путь, статус, латентность, IP, user-agent.
e.Use(middleware.Logger())
// Кастомный формат
e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{
Format: "${method} ${uri} -> ${status} (${latency_human})\n",
}))
Recover
Ловит panic в обработчиках и возвращает 500 вместо краша всего процесса.
e.Use(middleware.Recover())
CORS
Управляет заголовками Access-Control-Allow-*. Принимает список допустимых origins, методов и заголовков.
e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
AllowOrigins: []string{"https://example.com", "https://app.example.com"},
AllowMethods: []string{http.MethodGet, http.MethodPost, http.MethodPut, http.MethodDelete},
AllowHeaders: []string{echo.HeaderContentType, echo.HeaderAuthorization},
}))
JWT
Проверяет Bearer-токен из заголовка Authorization и кладёт распарсенный *jwt.Token в контекст.
import "github.com/labstack/echo-jwt/v4"
e.Use(echojwt.WithConfig(echojwt.Config{
SigningKey: []byte("secret"),
}))
// Доступ к claims:
token := c.Get("user").(*jwt.Token)
claims := token.Claims.(jwt.MapClaims)
Внимание: начиная с Echo v4.10+ JWT middleware вынесен в отдельный репозиторий github.com/labstack/echo-jwt/v4.
BasicAuth
e.Use(middleware.BasicAuth(func(username, password string, c echo.Context) (bool, error) {
return username == "admin" && password == "secret", nil
}))
KeyAuth
Проверяет API-ключ из заголовка, query-параметра или cookie.
e.Use(middleware.KeyAuth(func(key string, c echo.Context) (bool, error) {
return key == os.Getenv("API_KEY"), nil
}))
RateLimiter
e.Use(middleware.RateLimiter(middleware.NewRateLimiterMemoryStore(20)))
// 20 запросов/секунду на IP
Gzip
e.Use(middleware.GzipWithConfig(middleware.GzipConfig{Level: 5}))
RequestID
Генерирует уникальный UUID для каждого запроса и добавляет в заголовок X-Request-ID.
e.Use(middleware.RequestID())
// Получить в обработчике:
id := c.Response().Header().Get(echo.HeaderXRequestID)
Timeout
e.Use(middleware.TimeoutWithConfig(middleware.TimeoutConfig{
Timeout: 30 * time.Second,
}))
StaticFile / Static
e.Static("/static", "public") // папка public -> /static/*
e.File("/favicon.ico", "public/favicon.ico")
Подводные камни
- JWT middleware был частью основного пакета до v4.10, потом вынесен в отдельный модуль — обновляйте импорт при обновлении Echo.
- Порядок вызовов
e.Use()определяет порядок выполнения middleware: Logger нужно ставить первым, Recover — сразу после него, иначе паники не будут залогированы. - CORS с
AllowOrigins: []string{"*"}иAllowCredentials: trueневалидна по спецификации браузеров — выбирайте что-то одно. - RateLimiter с in-memory store не работает в multi-instance окружении — за горизонтальным масштабированием нужен Redis-бекенд.
- Recover перехватывает panic только в той же горутине — паники в фоновых горутинах обработчика всё равно падают процесс.
- Gzip middleware не сжимает ответы меньше порогового размера (~1 KB по умолчанию), поэтому тесты с короткими телами могут ввести в заблуждение.
- Middleware добавленный через
e.Use()применяется ко всем маршрутам, включая ещё незарегистрированные — убедитесь, что он не ломает health-check эндпоинты без аутентификации.
Common mistakes
- Давать ответ про встроенные middleware Echo только на уровне определения, не показывая поведение в реальном приложении.
- Игнорировать границы ответственности вокруг темы «встроенные middleware Echo»: кто отменяет работу, кто владеет ресурсом и где формируется ответ клиенту.
- Не связывать встроенные middleware Echo с observability, тестированием или безопасностью, когда это влияет на продакшен-поведение.
What the interviewer is testing
- Точно объясняет, что именно делает встроенные middleware Echo и где это используется в Go-коде.
- Связывает встроенные middleware Echo с корректным lifecycle запроса, отменой, конкурентностью или конфигурацией сервера там, где это уместно.
- Не изобретает API и опирается на реальные контракты официальной документации.