Локальная разработка Taskflow: HTTPS, куки и прокси

Этот документ описывает, как настроить локальное окружение для фронтенд-разработки так, чтобы оно максимально соответствовало продакшену, работало с реальными куками аутентификации и не требовало постоянных деплоев на дев-сервер.

1. Уведомление о безопасности (важно прочитать)

Прежде чем начать, важно понять, что именно вы устанавливаете на свою машину и какие риски с этим связаны.

1.1. Что такое локальный центр сертификации (CA)

mkcert создает локальный корневой центр сертификации (CA) и устанавливает его в системное хранилище доверенных сертификатов. Все сертификаты, подписанные этим CA, ваш браузер и система будут считать доверенными. Это позволяет использовать HTTPS для локальной разработки без предупреждений браузера.

1.2. Ключевые риски и как они минимизируются

1.3. Как это связано с SameSite и CORS

Проблема, которую решает данная настройка, связана с политикой безопасности кук SameSite. Атрибут SameSite=Lax (значение по умолчанию в современных браузерах) разрешает отправку куки при переходах на верхнем уровне, но запрещает ее отправку в кросс-сайтовых подзапросах (например, fetch с localhost на api.thescript.agency).

Итог по безопасности:

Установка mkcert на машину разработчика — это стандартная и безопасная практика, если следовать правилам: не делиться приватным ключом CA, использовать только для локальной разработки и понимать, что доверие к сертификату ограничено вашей машиной.

2. Подготовка окружения (пошагово)

Выполните эти шаги один раз для своей операционной системы.

2.1. Настройка локального домена (файл hosts)

Нужно «научить» вашу машину, что local.taskflow.thescript.agency — это вы сами.

Проверка: в терминале выполните ping local.taskflow.thescript.agency. Должны увидеть ответ от 127.0.0.1.

2.2. Установка mkcert и доверие к локальному CA

  1. Установите mkcert (требуются права администратора):

    • Windows: Откройте PowerShell от имени администратора и выполните:
      choco install mkcert -y
      
    • macOS: brew install mkcert
    • Linux (Debian/Ubuntu): sudo apt install mkcert
  2. Установите локальный CA (это нужно сделать один раз на машину):

    • Windows: В PowerShell от имени администратора выполните mkcert -install.
    • macOS / Linux: В терминале выполните mkcert -install.

    Вы увидите сообщение об успешной установке. Windows может показать системное предупреждение — подтвердите его.

2.3. Генерация сертификата для проекта

Перейдите в корневую папку вашего проекта и выполните:

mkcert local.taskflow.thescript.agency

В папке появятся два файла: local.taskflow.thescript.agency.pem (сертификат) и local.taskflow.thescript.agency-key.pem (приватный ключ). Добавьте их в .gitignore.

3. Настройка проксирования (Vite и другие)

3.1. Для Vite

Обновите vite.config.js (рекомендуется переименовать в .mjs, чтобы избежать предупреждений):

import { defineConfig } from 'vite';
import fs from 'fs';

export default defineConfig({
    server: {
        host: 'local.taskflow.thescript.agency',
        https: {
            key: fs.readFileSync('./local.taskflow.thescript.agency-key.pem'),
            cert: fs.readFileSync('./local.taskflow.thescript.agency.pem'),
        },
        proxy: {
            '/api': {
                target: 'https://api.taskflow.thescript.agency',
                changeOrigin: true,
                secure: true,
                rewrite: (path) => path.replace(/^\/api/, ''),
            },
        },
    },
});

Как это работает: Vite запускает HTTPS-сервер. Запросы с фронтенда на /api/auth/introspect идут на тот же origin, поэтому браузер прикладывает куки. Vite-прокси перехватывает эти запросы и перенаправляет их на реальный API, сохраняя заголовки, включая Cookie.

3.2. Для других менеджеров (Webpack Dev Server, Parcel и т.д.)

Принцип аналогичен: настройте https (передав пути к сгенерированным файлам) и proxy.

4. Возможные проблемы и их решение

4.1. Ошибка "Отказано в доступе" при установке mkcert (Windows)

Это самая распространенная проблема. Она возникает, когда команда выполняется в обычном PowerShell без прав администратора.

Решение: Всегда запускайте choco install mkcert и mkcert -install в окне PowerShell, открытом от имени администратора. Если ошибка уже возникла и остались «залоченные» файлы, может помочь ручное удаление папки C:\ProgramData\chocolatey\lib-bad (также с правами администратора).

4.2. Браузер не отправляет куки (статус 400 "Access token is missing")

Даже после настройки, если кука имеет флаг Secure, браузер не отправит ее по http://. Убедитесь, что вы открываете фронтенд по https://local.taskflow.thescript.agency:5173/, а не по http.

Проверка в DevTools → Network → запрос /api/auth/introspect: в Request Headers должен быть заголовок Cookie.

4.3. Сертификат все равно не доверенный

4.4. Прокси Vite не пробрасывает куки

В vite.config.js для прокси не нужно никаких дополнительных настроек для кук — они пересылаются по умолчанию. Если куки не доходят, проблема почти всегда в том, что браузер их не отправил изначально (см. пункт 4.2) или в неправильном домене куки на бэкенде.

5. Часто задаваемые вопросы (FAQ)

Вопрос: Это безопасно? Мне не придется переживать за свои данные?

Ответ: Да, если следовать инструкции. mkcert создает сертификат, который доверяется только вашей машиной. Этот сертификат не может быть использован для атак на других пользователей или на продакшен. Риск заключается только в сохранности вашего приватного ключа CA (rootCA-key.pem), который mkcert хранит в защищенной папке. Не делитесь этим файлом — и все будет в порядке.

Вопрос: Почему нельзя просто использовать http://localhost?

Ответ: Потому что продакшен-API устанавливает куки с флагом Secure, который требует HTTPS. Браузер отказывается отправлять такие куки по незащищенному соединению. Кроме того, политика SameSite блокирует куки для кросс-сайтовых запросов (localhost vs api.domain.com).

Вопрос: Что делать, если я использую другой фреймворк (Next.js, Nuxt и т.д.)?

Ответ: Принцип тот же. Вам нужно найти в конфигурации вашего dev-сервера опции для https и proxy. Синтаксис будет немного отличаться, но идея — предоставить сертификаты и настроить перенаправление запросов — универсальна.

6. Чек-лист для проверки

  1. https://local.taskflow.thescript.agency:5173/ открывается с иконкой замка без предупреждений.
  2. В DevTools → Application → Cookies для https://api.taskflow.thescript.agency кука taskflow_access_token имеет Domain=.thescript.agency и Secure=true.
  3. Запрос к /api/auth/introspect в DevTools → Network имеет статус 200 OK и в Request Headers присутствует заголовок Cookie.
  4. Ответ интроспекции содержит {"active":true,...}.