Sobes.tech
Назад к вопросам
Junior — Middle
42

Какая информация должна быть доступна публично, а что необходимо держать в секрете?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

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

Определение:

Публичной должна быть информация, без которой нельзя нормально использовать систему: назначение функций, параметры, возвращаемые значения, форматы данных, примеры вызова, стабильные контракты. Секретом следует считать данные, которые позволяют атаковать систему, украсть доступ или раскрыть внутреннее устройство: пароли, токены, ключи, приватные сертификаты, персональные данные, внутренние адреса и детали реализации, если они не нужны пользователю.

В Python это особенно важно для модулей и библиотек: наружу обычно показывают только публичный API, а внутренние хелперы, служебные переменные и конфигурацию доступа прячут за соглашениями и средствами защиты.

Пример использования:

Например, в библиотеке для работы с API публично доступны функция get_user() и её документация, а токен доступа берётся из переменной окружения и не хранится в коде.

import os
import requests

API_URL = "https://api.example.com"

def get_user(user_id: int) -> dict:
    token = os.environ["API_TOKEN"]
    headers = {"Authorization": f"Bearer {token}"}
    response = requests.get(f"{API_URL}/users/{user_id}", headers=headers)
    response.raise_for_status()
    return response.json()

def _build_headers(token: str) -> dict:
    return {"Authorization": f"Bearer {token}"}

Пояснение кода:

  • get_user() — публичная функция: её можно вызывать из внешнего кода.
  • API_URL в примере не является секретом, если это обычный адрес сервиса; но внутренняя инфраструктура может требовать скрывать такие адреса.
  • API_TOKEN не хранится в исходниках, а читается из окружения, чтобы не утечь в репозиторий.
  • _build_headers() начинается с подчёркивания: это сигнал, что функция внутренняя и не предназначена для прямого использования снаружи.
  • Внешнему потребителю нужен контракт функции и результат, а не способ формирования заголовков или детали HTTP-запроса.

Ключевые моменты:

  • Публичным делают интерфейс, а не внутреннюю реализацию.
  • Секреты не должны попадать в репозиторий, логи и ошибки.
  • Пароли, токены, приватные ключи и персональные данные всегда нужно защищать.
  • В Python внутренние элементы обычно помечают соглашением _name, но это не защита, а только сигнал.
  • Чувствительные настройки лучше хранить в переменных окружения, секрет-хранилищах или конфигурации вне кода.
  • Чем меньше лишней информации доступно извне, тем меньше поверхность атаки.