~/guides/toml-yaml-json-env-secrets-storage

.env

TOML, YAML, JSON или .env: где хранить секреты конфигурации

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

Вопрос “в каком формате хранить пароль от базы” звучит как второстепенный, пока не выясняется, что выбор формата влияет на то, насколько легко секрет случайно закоммитить, засветить в логах или отдать стороннему сервису.

Сравнение по практическим критериям

Формат Стандартное игнорирование в .gitignore Легко ли случайно закоммитить Поддержка комментариев
.env Да, повсеместная конвенция Средний риск, если забыли добавить в .gitignore Да
JSON (config.json) Нет единой конвенции Высокий риск, обычно не в списке игнора по умолчанию Нет
YAML (secrets.yaml) Нет единой конвенции Высокий риск Да
TOML (аналогично) Нет единой конвенции Высокий риск Да

Почему .env стал негласным стандартом именно для секретов

Экосистема dotenv и практика двенадцатифакторного приложения закрепили .env как место для конфигурации, отличной от кода. У этого формата уже есть повсеместная конвенция игнорирования в .gitignore — почти любой шаблон gitignore для любого стека включает .env по умолчанию, чего нельзя сказать про произвольный config.json или secrets.yaml.

Риск смешивания секретов с обычным конфигом

config.yaml:
  app_name: MyApp
  db_password: real-secret-here
  log_level: info

Секрет внутри обычного конфигурационного файла, который логично коммитить (app_name, log_level), создаёт риск: разработчик коммитит файл целиком, не задумываясь, что внутри есть один чувствительный ключ среди безобидных настроек.

Практическая рекомендация

Держите секреты физически отдельно от остального конфига — в .env, который по умолчанию игнорируется большинством шаблонов, а не смешанным с обычными настройками в одном YAML или JSON файле. Для передачи секретов между форматами (например, в MCP-сервер, ожидающий JSON) конвертируйте в момент необходимости, а не храните секрет постоянно в неудобном для игнорирования формате.

Как быстро проверить, не засветился ли секрет в конфиге

.env Mask Secrets маскирует значения перед демонстрацией содержимого, а Git History Secret-Scrub Dry-Run Simulator показывает, что попадёт под очистку, если секрет уже случайно закоммичен.

Итоговый чеклист

.env — практический стандарт для секретов именно благодаря повсеместной конвенции игнорирования в .gitignore, а не из-за особых технических свойств формата.

Смешивание секретов с обычным конфигом в одном YAML или JSON файле повышает риск случайного коммита всего файла целиком.

Конвертация в другой формат уместна в момент реальной необходимости (например, для MCP-сервера), а не как постоянное место хранения секрета.