2016-08-31 2 views
-1

Есть что-то около Cross Origin Resource Sharing (CORS), что я никогда не понимал по-настоящему, а именно, что с HTTP-запросом кросс-происхождения клиент не может решить, какой сервер (ы) он хочет доверять; вместо этого сервер объявляет (в заголовке ответа Access-Control-Allow-Origin), что доверяет ему один или несколько конкретных клиентов (истоков). Браузер с поддержкой CORS будет только доставлять ответ сервера на приложение, если сервер говорит, что клиент доверяет серверу. Это похоже на обратный путь установления отношений доверия между двумя сторонами HTTP.С CORS, почему серверы объявляют, какие клиенты могут доверять ему, а не клиенты, объявляющие, на каких серверах они доверяют?

Что для меня имеет смысл, так это механизм, подобный следующему: клиент объявляет список источников, которым он доверяет; например, через некоторый вымышленный элемент <meta allow-cross-origin="https://another-site:1234"/> в <head>. (Конечно, браузер должен был бы обеспечить, чтобы эти элементы были доступны только для чтения и не могут быть удалены, изменены или дополнены с помощью сценариев.)

Что я не понимаю о CORS? Почему заявление о доверенном происхождении на стороне клиента не работает? Почему серверы могут подтвердить, какие клиенты (источники) могут доверять своим ответам? Кто на самом деле защищен от КОРС? Защищает ли сервер или клиент?

(Это очень много вопросов. Я надеюсь, что это ясно, что я не ожидал ответа на каждый из них, а просто ответ, который указывает на мое фундаментальное непонимание.)

+0

В случае с downvoter, я был бы признателен за то, что не так с моим вопросом. Я с удовольствием отредактировал его, объясню дальше или уберу вопрос, если он действительно неуместен. – stakx

+1

Веб-сайт, на котором размещен JavaScript, неявно утверждает, что он доверяет сайту, на котором он пытается получить данные, путем запроса данных с этого URL-адреса в первую очередь. – Quentin

+1

"сервер объявляет (в заголовке ответа Access-Control-Allow-Origin), что один или несколько конкретных клиентов (истоков) доверяют ему" - Нет, он заявляет, что доверяет этим источникам, а не тем, что они ему доверяют. – Quentin

ответ

0

Клиент не имеет ничего общего с этим. С заголовком CORS вы сообщаете клиенту, кому доверяют другие серверы. Тогда вы можете поделиться своими ресурсами, и клиент не будет помнить.

Например, если у вас есть два домена, которые вы указываете клиенту, чтобы ваши ресурсы использовались вашим вторым веб-сайтом, вы не говорите, что я доверяю вам как клиенту.

Таким образом, вы защищаете сервер, а не клиент. Вы не хотите, чтобы конечные точки API AJAX были доступны по сценариям, размещенным в любой точке мира.

Клиент не имеет ничего, чтобы выиграть от этого. Его единственная защита для серверов, потому что использование AJAX всех URL-адресов хорошо видно для всех, и если бы не эта защита, любой мог бы запустить свой интерфейс с помощью вашего API, только серверы должны проиграть от этого, чтобы они решили которые могут использовать свои ресурсы.

+0

Вопрос заключается в неправильном использовании термина «клиент», означающего «Веб-сайт, на котором размещена страница, содержащая JavaScript, которая заставляет клиента инициировать запрос» – Quentin

+0

Вы говорите, что CORS на самом деле там, чтобы защитить сервер, который попросил дать ответ, а не клиент, делающий запрос. Но для меня это не имеет смысла. Почему CORS нужно вообще? HTTP-сервер может просто посмотреть, кто сделал запрос, а затем отправить код состояния «2xx' /' 3xx »или (например,« 401 Unauthorized »). Но с CORS я понимаю, что сервер будет давать ответ в любом случае, но с заголовком, который позволяет браузеру на стороне клиента решить, обрабатывать ли/как ответ. Учитывая, что мое понимание верное, как CORS добавляет защиту сервера в простой ответ «401»? – stakx

+0

Итак, вы не думаете, что сможете поделиться своими ресурсами между двумя разными доменами, которыми владеете? Если это дело CORS не для вас. CORS там, чтобы облегчить обход ограничения на доступ, когда вы намереваетесь. –

Смежные вопросы