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 и опирается на реальные контракты официальной документации.

Sources

Related topics