devopscodepro
Язык
Работает полностью в браузере — данные не покидают страницу.

CORS-генератор

Соберите корректную CORS-политику и получите её как конфиг Nginx, Go (Chi/Gin), Express или Caddy — либо вставьте заголовки ответа и узнайте, что из них сделает браузер.

location /api/ {
    add_header Access-Control-Allow-Origin "https://app.example.com" always;
    add_header Vary "Origin" always;

    if ($request_method = OPTIONS) {
        add_header Access-Control-Allow-Origin "https://app.example.com" always;
        add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" always;
        add_header Access-Control-Allow-Headers "Content-Type, Authorization" always;
        add_header Access-Control-Max-Age 86400 always;
        return 204;
    }

    # proxy_pass … ;
}

CORS, который браузеры действительно принимают

Опишите политику один раз — origin, методы, заголовки, credentials, кеш preflight — и получите её как конфиг там, где реально живёт ваш edge: location Nginx с origin-белым списком через map, middleware Go для Chi или Gin, пакет cors для Express или блок Caddyfile. Генератор отказывается выдавать сочетания, которые браузеры отвергают, — например, wildcard origin вместе с credentials.

Режим разбора работает в обратную сторону: вставьте заголовки ответа, которые вы реально получили (из devtools или curl -i), и посмотрите, что из них сделает браузер, — с теми же предупреждениями.

Почему API работает в curl, но падает в браузере с ошибкой CORS?

CORS применяют только браузеры — curl его не проверяет вовсе. Браузер отправил preflight OPTIONS или проверил Access-Control-Allow-Origin ответа, и сервер ответил неправильно. Ошибка — это честная обратная связь о конфигурации, а не несостыковка curl и браузера.

Почему нельзя * вместе с cookie?

Потому что такое сочетание позволило бы любому сайту в интернете делать аутентифицированные запросы от имени посетителя. Спецификация требует конкретный origin, когда разрешены credentials: отражайте origin запроса только если он в вашем белом списке, и добавляйте Vary: Origin, чтобы кеши различали варианты.

CORS — это защита моего API?

Он защищает пользователей браузеров, а не API: небраузерные клиенты игнорируют его полностью. Настоящую работу по-прежнему делают аутентификация и авторизация; CORS лишь определяет, каким веб-страницам можно читать ответы через браузер посетителя.

Что реально экономит Max-Age?

Он позволяет браузеру закешировать вердикт preflight, и повторные запросы обходятся без лишнего OPTIONS-круга. Обычный потолок — 86400 (сутки); браузеры всё равно режут больше (Chrome — до 2 часов), так что большие значения ничего не дают.

Смежные инструменты: HTTP-заголовки, Security-заголовки и CSP-анализатор.