Архитектура безопасной авторизации на примере протоколов OAuth и OIDC

Иван Поддубный, CTO Вебпрактик

Архитектура безопасной авторизации на примере протоколов OAuth и OIDC

Иван Поддубный
CTO Вебпрактик

Кто я

  1. 14+ лет в вебе. Прошел путь fullstack, teamlead
  2. Работаю CTO в Вебпрактик (~140 человек)
  3. Член программного комитета TechLeadConf, Podlodka Crew
  4. Пишу на Typescript, Nodejs (Nest) и React, PHP
  5. Организатор Ростовского PHP-сообщества (500+ человек)
  6. Влюблен в Linux, OpenSource.

Вебпрактик — веб-интегратор для корпораций

Авторизация

Вопросы в зал

Проблемы первого раза для авторизации в SPA

Как следствие, мы можем встречать решения
с плохими практиками в области безопасности
на многих проектах

Ошибки авторизации
каждый год входят
в топ-10 разновидностей
уязвимостей OWASP

Терминология

Вас поставили пилить новый проект

Сессии, OIDC/OAuth, custom JWT

Custom JWT Auth

JWT

Stateful (session) аутентификация

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

Stateless (JWT)

Бэкендер выплевывает
JWT-токен
в ответе на метод авторизации...

Какие вопросы перед нами встают?

Где хранить JWT-токен на клиенте?

Local storage

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

Поэтому

Где хранить JWT-токен на клиенте?

В local storage В cookie HttpOnly
XSS уязвим защищен
SSR несовместим совместим
Место много ограничение 4кб

Как читать данные с токена?

В local storage В cookie HttpOnly
Плохо (XSS) невозможно, т.к. httpOnly

Сколько должен жить JWT-токен?

Best Practices: 1-15min

А как его обновлять?

Механика обновления access token

В local storage В cookie HttpOnly
response interceptor клиента на 401,
с перезапросом
происходит фоном на бэкенде

Ротация Refresh token

Как защитить токен от кражи? (Token Sidejacking)

Как отозвать токен?

JWT: другие проблемы

JWT: готовые решения

Разбор Auth.JS: Безопасность

Разбор Auth.JS: Функциональность

  1. Готовые обвязки с 50+ разными провайдерами авторизации

Разбор Auth.JS: Функциональность

  1. Готовые обвязки с 50+ разными провайдерами авторизации

Custom JWT авторизация: выводы

Session

Session-аутентификация

Session: выводы

OAuth/OIDC

OAuth/OIDC

Применимость: Когда нужен OIDC

Применимость: корпоративное или cервисное SSO


Применимость: корпоративное или cервисное SSO


Применимость: сторонние поставщики


Применимость: аутсорс сервис



Применимость

OAuth/OIDC — не один стандарт

OpenID Connect Protocol Suite

Различия: токены

Общие для OAuth и OIDC

Только OIDC

Различия: FLOW

Общие для OAuth и OIDC

Только OIDC

Authorization Code Flow

Способы защиты oAuth/OIDC

  1. Вспоминаем часть защиты JWT
  2. PKSE
  3. nonce, c_hash, at_hash

PKSE

  1. PKCE предотвращает атаку, при которой злоумышленник перехватывает authorization code, чтобы получить access-токен
  2. Когда нужно: когда нет доверия каналам клиентом и сервером

Защищаемся от векторов атак на клиенте:

nonce (Number used Once)

c_hash (Code Hash)

at_hash (Access Token Hash)

OAuth/OIDC серьезно поднимает
complexity (сложность)
вашего приложения

Готовые решения

  1. Гейткиперы (для ряда решений вроде Keycloack / Ory)
  2. Библиотеки

Гейткиперы

Гейткиперы

Где посмотреть подробнее:

Митап кейклоак x5group QR code

Готовые библиотеки

  1. Стоит доверять в первую очередь сертифицированным и обновляемым решениям
  2. Есть несколько сертифицированных поддерживаемых библиотек, но их реализацию под капотом рекомендую просмотреть.

Выводы

Полезные ссылки

Пожалуйста, оставьте свой отзыв

Иван Поддубный
CTO Вебпрактик

https://north-leshiy.github.io/spa-auth-sec