FiberMiddleCoding
Как обрабатывать CORS в Fiber?
Используйте встроенный пакет github.com/gofiber/fiber/v2/middleware/cors: добавьте app.Use(cors.New(cors.Config{...})) с явными AllowOrigins, AllowMethods и AllowHeaders. Никогда не ставьте AllowOrigins: "*" вместе с AllowCredentials: true.
CORS в Fiber: встроенный middleware
Fiber поставляет готовый CORS-middleware в пакете github.com/gofiber/fiber/v2/middleware/cors. Он добавляет нужные заголовки ответа и автоматически отвечает на preflight-запросы (OPTIONS).
Установка и минимальный пример
package main
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cors"
)
func main() {
app := fiber.New()
// Разрешаем конкретный origin + credentials
app.Use(cors.New(cors.Config{
AllowOrigins: "https://app.example.com, https://admin.example.com",
AllowMethods: "GET,POST,PUT,PATCH,DELETE,OPTIONS",
AllowHeaders: "Origin, Content-Type, Accept, Authorization",
AllowCredentials: true,
MaxAge: 86400, // секунды кэширования preflight
}))
app.Get("/api/data", func(c *fiber.Ctx) error {
return c.JSON(fiber.Map{"ok": true})
})
app.Listen(":3000")
}
Конфигурационные поля cors.Config
AllowOrigins— строка с разрешёнными origins через запятую; поддерживаются wildcard-субдомены видаhttps://*.example.com.AllowMethods— HTTP-методы, разрешённые в preflight-ответе.AllowHeaders— заголовки, которые браузер может отправлять.ExposeHeaders— заголовки ответа, доступные JS-коду на клиенте (например,X-Total-Count).AllowCredentials— разрешаетwithCredentialsна клиенте (куки, Authorization).MaxAge— срок жизни preflight-ответа в секундах (экономит OPTIONS-запросы).AllowOriginsFunc— функцияfunc(origin string) boolдля динамической проверки origin.
Динамическая проверка origin
Если список origin хранится в БД или конфиге, используйте AllowOriginsFunc:
allowedSet := map[string]bool{
"https://app.example.com": true,
"https://beta.example.com": true,
}
app.Use(cors.New(cors.Config{
AllowOriginsFunc: func(origin string) bool {
return allowedSet[origin]
},
AllowCredentials: true,
AllowHeaders: "Content-Type, Authorization",
}))
Размещение middleware в цепочке
CORS-middleware должен быть зарегистрирован до любого роутинга и аутентификации. Preflight OPTIONS-запрос приходит без заголовка Authorization — если аутентификация стоит раньше CORS, preflight упадёт с 401.
app.Use(cors.New(...)) // 1. CORS
app.Use(logger.New()) // 2. Логирование
app.Use(jwtMiddleware) // 3. Аутентификация
app.Get("/", handler) // 4. Бизнес-логика
Подводные камни
- AllowOrigins: "*" + AllowCredentials: true — браузер блокирует такой ответ. При
AllowCredentials: trueнужно явно перечислять origins. - Порядок middleware — если JWT-middleware стоит перед CORS, preflight-запросы (без токена) получат 401 ещё до выставления CORS-заголовков.
- ExposeHeaders по умолчанию пуст — JS не увидит кастомные заголовки ответа (X-Request-Id, X-Total-Count), если не добавить их явно в
ExposeHeaders. - Wildcard-субдомены —
https://*.example.comне поддерживается стандартом CORS; Fiber обрабатывает его своей логикой, но поведение может отличаться от других фреймворков. - MaxAge игнорируется некоторыми браузерами — Chrome ограничивает максимум 7200 секунд (2 часа), Firefox — 86400 (24 часа).
- Несоответствие схемы —
http://app.example.comиhttps://app.example.com— разные origins; включение HTTP-варианта в продакшне создаёт угрозу безопасности. - Несколько групп роутов с разными CORS — создавайте отдельные группы
app.Group()с разными конфигурациями cors.New; глобальноеapp.Useприменяется ко всем маршрутам.
Common mistakes
- Давать ответ про CORS в Fiber только на уровне определения, не показывая поведение в реальном приложении.
- Игнорировать границы ответственности вокруг темы «CORS в Fiber»: кто отменяет работу, кто владеет ресурсом и где формируется ответ клиенту.
- Не связывать CORS в Fiber с observability, тестированием или безопасностью, когда это влияет на продакшен-поведение.
What the interviewer is testing
- Точно объясняет, что именно делает CORS в Fiber и где это используется в Go-коде.
- Связывает CORS в Fiber с корректным lifecycle запроса, отменой, конкурентностью или конфигурацией сервера там, где это уместно.
- Не изобретает API и опирается на реальные контракты официальной документации.