Розуміння cors, spring по-русски!

Обробка простих CORS запитів

У найпростішому випадку, міждоменні взаємодії починаються з запиту GET, POST або HEAD до ресурсу на сервері. В даному випадку, тип вмісту POST запиту обмежений application / x-www-form-urlencoded. multipart / form-data або text / plain. Запит включає заголовок Origin. який вказує на походження клієнтського коду.

Сервер буде враховувати Origin запиту і приймати або відмовляти в обробці запиту. Якщо сервер прийняв запит, то він відповість запитуваною ресурсом в заголовку Access-Control-Allow-Origin. Цей заголовок буде вказувати клієнту з яким походженням клієнта буде дозволений доступ до ресурсу. Беручи до уваги, що Access-Control-Allow-Origin відповідає Origin запиту, браузер дозволить запит.

З іншого боку, якщо Access-Control-Allow-Origin відсутня у відповіді або якщо його немає в Origin запиту, то браузер не дозволить запит.

Наприклад, припустимо, що клієнтський код розташований на foo.client.com і відправляє запит на bar.server.com:

Додатково Access-Control-Allow-Origin може бути встановлений в "*", вказуючи на доступність всім. Це вважається небезпечною практикою, крім тих особливих випадків, де API повністю публічно і офіційно дозволений для використання будь-яким клієнтом.

передпольотний запити

Якщо запит може вплинути на призначені для користувача дані, то простого запиту недостатньо. Замість цього, предполентий CORS запит відправляється в перед відправкою відповідного запиту, щоб гарантувати безпеку відправки запиту. Передпольотний запити необхідні в тих випадках, коли будь-який HTTP метод, відмінний від GET, POST, HEAD або якщо тип вмісту POST запиту відмінний від application / x-www-form-urlencoded. multipart / form-data або text / plain. Також, якщо запит містить будь-які власні заголовки, то необхідний передпольотний запит.

Наприклад, припустимо, що клієнт, розташований на foo.client.com, виконує DELETE запит до ресурсів не bar.server.com. Передплатний запит приймає вид OPTIONS запиту з наступними заголовками:

Передплатний запит фактично запитує сервер про доступність DELETE запиту без фактичної відправки самого DELETE запиту. Якщо сервер дозволяє такий запит, то він відповість передпольотного запитом приблизно так:

Відповідь передпольотного запитом вказує (в заголовку Access-Control-Allow-Methods) на те, що клієнту доступний DELETE запит до переданому ресурсу. Тема Access-Control-Max-Age вказує на те, що цей передпольотний відповідь діє 84600 секунд або 1 день, після якого повинен бути виконаний новий передпольотний запит.

У той же час клієнтові буде доступно відправка справжнього DELETE запиту до ресурсу.

З оригінальним текстом уроку ви можете ознайомитися на spring.io.

Навчальні матеріали