← Назад к вопросам

Считаются ли разные порты разными доменами

2.0 Middle🔥 141 комментариев
#JavaScript Core#Архитектура и паттерны

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разные порты и их отношение к доменам

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

Техническая перспектива: порты как часть домена

С технической точки зрения, домен (или hostname) и порт являются отдельными компонентами URL согласно спецификации URI. Например, в URL http://example.com:8080/api:

  • example.com — это домен (hostname).
  • 8080 — это порт.

Таким образом, разные порты одного домена не считаются разными доменами. Они являются частью одного и того же origin (источника), но с разными портами. Однако важно отметить, что в определении origin в веб-стандартах порт играет особую роль.

Концепция Origin и Same-Origin Policy

Ключевым понятием здесь является Same-Origin Policy (Политика одинакового источника), которая определяет правила безопасности для доступа к ресурсам между разными источниками. Согласно стандартам (например, RFC 6454), origin состоит из трех компонентов:

  1. Схема (protocol) — например, http или https.
  2. Домен (hostname) — например, example.com.
  3. Порт — например, 80 (для HTTP) или 443 (для HTTPS).

Если два URL имеют одинаковые схему, домен и порт, они считаются same-origin. Если хотя бы один компонент отличается (включая порт), они считаются cross-origin.

Пример сравнения origins:

// Same-origin:
const url1 = 'http://example.com:80/page1';
const url2 = 'http://example.com:80/page2';

// Cross-origin (разный порт):
const url3 = 'http://example.com:80/page1';
const url4 = 'http://example.com:8080/page2';

Таким образом, для Same-Origin Policy порт 80 и порт 8080 на домене example.com считаются разными origins, что означает, что ресурсы между ними будут ограничены этой политикой безопасности.

Практическое значение для Frontend Developer

Для разработчика это имеет следующие важные следствия:

  • CORS (Cross-Origin Resource Sharing): Когда frontend-приложение, работающее на http://example.com:80, пытается сделать AJAX-запрос к API на http://example.com:8080, браузер будет рассматривать это как cross-origin запрос. Без правильной конфигурации CORS на сервере (например, заголовков Access-Control-Allow-Origin), такой запрос будет заблокирован браузером.

    Пример заголовков CORS для разрешения запросов с разных портов:

    // На сервере (например, Node.js Express):
    app.use((req, res, next) => {
      res.header('Access-Control-Allow-Origin', 'http://example.com:80');
      res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
      next();
    });
    
  • Cookie и сессии: Cookies, установленные для домена example.com, обычно (по умолчанию) доступны для всех портов этого домена, если не указан конкретный порт в атрибутах cookie. Однако некоторые браузеры могут применять более строгие правила в контексте безопасности.

  • WebSocket и другие протоколы: При использовании WebSocket (ws://example.com:8080) или других протоколов, браузер также учитывает порт как часть origin, что может требовать дополнительной конфигурации безопасности.

Исключения и особые случая

  1. Порт по умолчанию: Если порт не указан в URL, браузер использует порт по умолчанию для схемы (80 для HTTP, 443 для HTTPS). Таким образом, http://example.com и http://example.com:80 считаются same-origin.

  2. Разработка и тестирование: В локальной разработке часто используются разные порты для клиента (например, localhost:3000) и сервера (localhost:8080). Это требует настройки CORS или использования прокси (например, в webpack dev server) для обхода ограничений.

  3. Браузерные различия: Хотя стандарты четко определяют роль порта, некоторые браузеры в прошлом имели различия в обработке портов, особенно для файлов (file://). Однако для современных браузеров поведение стандартизировано.

Заключение

Таким образом, разные порты одного домена не считаются разными доменами в техническом смысле (hostname), но считаются разными origins согласно Same-Origin Policy. Это означает, что для взаимодействия между разными портами одного домена в веб-приложениях необходимо учитывать ограничения безопасности, такие как CORS, и правильно конфигурировать серверные ответы.

Для frontend разработчика понимание этой разницы критически важно при работе с API, микросервисами (которые часто запускаются на разных портах) и при настройке инфраструктуры разработки. Рекомендуется всегда явно указывать разрешенные origins в CORS заголовках и тестировать взаимодействие между портами в различных браузерах.