tl; dr: Це все з міркувань безпеки.
OAuth 2.0 хотів відповідати цим двом критеріям:
- Ви хочете дозволити розробникам використовувати URI для перенаправлення без HTTPS, оскільки не всі розробники мають сервер із підтримкою SSL, і якщо вони роблять, це не завжди правильно налаштовано (непідписані самостійно, надійні сертифікати SSL, синхронізований серверний годинник ...).
- Ви не хочете, щоб хакери могли вкрасти доступ / оновити маркери, перехоплюючи запити.
Деталі нижче:
Неявний потік можливий лише в середовищі браузера з міркувань безпеки:
У неявному потоці маркер доступу передається безпосередньо як хеш-фрагмент (а не як параметр URL). Важлива річ щодо хеш-фрагмента - це те, що після переходу посилання, що містить хеш-фрагмент, лише браузер знає про хеш-фрагмент. Браузери передадуть хеш-фрагмент безпосередньо до цільової веб-сторінки (URI переспрямування / веб-сторінки клієнта). Фрагмент хешу має такі властивості:
- Вони не є частиною запиту HTTP, тому сервери їх не можуть читати, і через це вони не можуть перехоплюватися посередницькими серверами / маршрутизаторами (це важливо).
- Вони існують лише на веб-переглядачі - клієнті - тому єдиний спосіб прочитати хеш-фрагмент - це використання JavaScript, який працює на сторінці.
Це дає можливість передавати токен доступу безпосередньо клієнту, не ризикуючи перехопити його посередницьким сервером. Це має застереження, що це лише можлива сторона клієнта, і для використання маркера доступу потрібен JavaScript, що працює на клієнті.
Неявний потік також має проблеми із безпекою, що вимагає додаткової логіки для вирішення / уникання, наприклад:
- Зловмисник може отримати маркер доступу від користувача на іншому веб-сайті / додатку (скажімо, якщо він є власником іншого веб-сайту / програми), увімкніть маркер на своєму веб-сайті, а потім передайте його як парам-параметр URL на своєму веб-сайті. тому видає себе за користувача на вашому веб-сайті. Щоб уникнути цього, вам потрібно перевірити ідентифікатор клієнта, пов’язаний з маркером доступу (наприклад, для Google ви можете використовувати кінцеву точку tokeninfo), щоб переконатися, що маркер видано з вашим власним ідентифікатором клієнта (тобто, власним додатком) або перевірити підпис якщо ви використовуєте IDToken (але для цього потрібен секрет вашого клієнта).
- Якщо запит на отримання автентичності не походить з вашого власного ресурсу (звані атаки виправлення сеансу), щоб уникнути цього, вам потрібно буде генерувати випадковий хеш із вашого веб-сайту, зберегти його у файлі cookie та передати цей самий хеш у параметр URL-адреси стану запит на аутентифікацію, коли користувач повертається, ви перевіряєте параметр стану з файлом cookie, і він повинен відповідати.
У потоці коду авторизації неможливо передати маркер доступу безпосередньо в параметрі URL, оскільки параметри URL є частиною HTTP-запиту, тому будь-який посередник / маршрутизатор, через який проходитиме ваш запит (може бути сотнями), зможе читайте маркер доступу, якщо ви не використовуєте зашифроване з'єднання (HTTPS), що дозволяє називати атаки "людина-в-середині".
Передача маркера доступу безпосередньо в парам-адресі URL теоретично може бути можливим, але автентичний сервер повинен переконатися, що URI перенаправлення використовує HTTPS з TLS-шифруванням та "довіреним" SSL-сертифікатом (як правило, з сертифікаційного органу, який не є безкоштовним) щоб бути впевненим, що цільовий сервер є законним і що HTTP-запит повністю зашифрований. Якщо всі розробники придбають сертифікат SSL і правильно налаштувати SSL для свого домену, це буде величезним болем і дуже сповільнить прийняття. Ось чому посередницький "код авторизації" для одноразового використання надається лише тим, що законний приймач зможе обмінятися (тому що вам потрібен секрет клієнта) і що код буде марний потенційним хакерам, що перехоплюють запити за незашифрованими транзакціями (тому що вони не '
Ви також можете стверджувати, що неявний потік є менш захищеним, існують потенційні вектори атаки, такі як підробка домену при переадресації - наприклад, викрадення IP-адреси веб-сайту клієнта. Це одна з причин того, що неявний потік надає лише маркери доступу (які, як передбачається, мають обмежене використання часу) і ніколи не оновлює жетони (які необмежені у часі). Щоб вирішити цю проблему, раджу розміщувати веб-сторінки на сервері з підтримкою HTTPS, коли це можливо.