CORS это тема, где легко допустить ошибку в конфигурации и не заметить этого. Разрешить все origins через
*, забыть проверить preflight, или написать паттерн, который пропускает лишнее. Библиотека jub0bs/cors построена так, чтобы минимизировать такие сценарии.Что это такое
jub0bs/cors — мидлвара для стандартного net/http, которая реализует CORS-протокол строго по спецификации Fetch standard. Автор позиционирует её как более безопасную альтернативу популярной rs/cors: API спроектирован так, что небезопасные конфигурации просто не дают себя создать.Как это работает
Создаём мидлвару через
cors.NewMiddleware, передаём конфиг, оборачиваем нужный ServeMux:package main
import (
"io"
"log"
"net/http"
"github.com/jub0bs/cors"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("GET /hello", handleHello) // CORS здесь не настроен
corsMw, err := cors.NewMiddleware(cors.Config{
Origins: []string{"https://example.com"},
Methods: []string{http.MethodGet, http.MethodPost},
RequestHeaders: []string{"Authorization"},
})
if err != nil {
log.Fatal(err) // плохая конфигурация — ошибка сразу, не в рантайме
}
corsMw.SetDebug(true) // включить debug-режим при разработке
api := http.NewServeMux()
api.HandleFunc("GET /users", handleUsersGet)
api.HandleFunc("POST /users", handleUsersPost)
mux.Handle("/api/", http.StripPrefix("/api", corsMw.Wrap(api)))
if err := http.ListenAndServe(":8080", mux); err != http.ErrServerClosed {
log.Fatal(err)
}
}
Маршрут
/hello не попадает под CORS — мы явно применяем мидлвару только к /api/. Это позволяет настраивать CORS точечно, а не на всё приложение сразу.Что выделяет библиотеку
Валидация конфига происходит при старте. Если что-то не так —
NewMiddleware возвращает ошибку сразу, не в момент обработки запроса. Никаких сюрпризов в продакшне.Есть debug-режим: при включённом
SetDebug(true) мидлвара добавляет в ответ заголовки с объяснением, почему preflight провалился. Это удобно при разработке и легко отключается в продакшне.Мидлвару можно перенастраивать на лету через метод
Reconfigure без перезапуска сервера. Это потокобезопасно.Ошибки конфигурации можно обрабатывать программно через пакет
cfgerrors — например, для формирования ответа в формате RFC 9457 (Problem Details).По бенчмаркам автора библиотека быстрее
rs/cors, хотя для большинства проектов это не принципиально.Чего библиотека не умеет
Она намеренно ограничена. Нельзя задать произвольный паттерн для origins — только конкретные значения из заранее определённого набора форматов. Нельзя логировать каждый запрос через мидлвару. Нельзя менять статус-код preflight-ответа (всегда 204). Автор объясняет эти ограничения соображениями безопасности и соответствия спецификации.
Строгий по умолчанию, с валидацией на старте, debug-режимом и возможностью перенастройки без рестарта.
➡️ Репозиторий
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoToProduction
