open atlas
↑ К треку
Безопасность SEC · 02 · 01

Что такое OAuth и почему пароли — не ответ

OAuth делегирует доступ без передачи паролей. Три стороны, два токена, одна модель доверия — объяснено через метафору выгульщика собак.

SEC Junior ◷ 7 min
Уровень
ОсновыJuniorMiddleSenior

Приложение для печати фото просит тебя “подключить Google Drive”. Ты вводишь свой пароль Google прямо в их форму. Теперь это приложение может читать каждый файл, письмо и фото в твоём аккаунте — навсегда. Одна утечка PrintPic — и все сервисы, подключённые через Google, скомпрометированы. OAuth существует потому, что это неправильный способ делиться доступом. К концу урока ты будешь точно понимать, как OAuth разделяет идентичность и доступ — и почему украденный токен в разы менее опасен, чем украденный пароль.

Три стороны

Каждый OAuth flow (процесс авторизации) вовлекает три стороны. Понять, кто кому доверяет и почему, — значит сразу видеть, где гарантии безопасности держатся, а где рвутся при инциденте.

  1. Клиент (твоё приложение, например PrintPic). Хочет ограниченного доступа к ресурсу от имени пользователя. Никогда не видит пароль пользователя.
  2. Authorization server (сервер авторизации, например Google). Аутентифицирует пользователя, выдаёт токены. Единственная сторона, хранящая пароль.
  3. Resource server (сервер ресурсов, например Google Drive). Принимает токены для обработки запросов. Валидирует токены через authorization server.

Вместе эти три роли означают: ни одна сторона не нуждается в полном доверии ко всем остальным. Клиент не узнаёт пароль, resource server не видит credential — только токен, подтверждающий разрешение. Без такого разделения компрометация одной стороны означала бы компрометацию всей системы.

Модель доверия трёх сторон OAuth
Клиент (App)
PrintPic — хочет загружать фото. Никогда не видит пароль. Держит access-токен.
Authorization Server
Google — держит пароль. Выдаёт access + ID-токены после согласия пользователя.
Resource Server
Google Drive — отдаёт файлы. Валидирует access-токены. Ничего не знает о пароле.
Пароль живёт только на authorization server. Токены текут к двум другим сторонам.

Метафора выгульщика собак

Ты нанимаешь выгульщика собак. Ты не даёшь ему ключ от дома. Вместо этого идёшь в key kiosk (authorization server) и говоришь “Фрэнк может выгуливать собаку по вторникам 9–10”. Киоск печатает Фрэнку single-use карту, открывающую только заднюю калитку, только по вторникам, только на час. Фрэнк потерял карту — без проблем, отзываешь в киоске. Карта — это access-токен. Задняя калитка — resource API.

Два токена, два назначения

Успешный OAuth + OpenID Connect flow выдаёт два разных токена:

  • Access token — авторизует API-вызовы. Клиент отправляет его в заголовке Authorization: Bearer. Говорит “держатель вправе делать X”. Resource server принимает его без знания identity пользователя.
  • ID token — доказывает кто пользователь (слой OpenID Connect). Всегда JWT. Содержит claims вроде sub (стабильный user ID), email, name. Клиент читает его, чтобы знать кто только что вошёл. Никогда не отправляется в API.

Access-токен отвечает: “может ли это приложение делать X?” ID-токен отвечает: “кто пользователь?”

Викторина

Почему OAuth безопаснее, чем отдать приложению username и пароль?

Викторина

В чём разница между access-токеном и OpenID Connect ID-токеном?

Расставь шаги по порядку

Поставь шаги 'Sign in with Google' в порядке:

  1. 1 Пользователь кликает 'Sign in with Google' в приложении
  2. 2 Приложение редиректит браузер на /authorize эндпоинт Google
  3. 3 Пользователь логинится в Google и одобряет запрошенные scope
  4. 4 Google редиректит браузер обратно в приложение с one-time кодом
  5. 5 Сервер приложения обменивает код на access-токен и ID-токен на /token эндпоинте Google
  6. 6 Приложение верифицирует подпись ID-токена и читает identity claims пользователя
Вспомните перед уходом
  1. 01
    Назови три стороны OAuth flow и по одному предложению о каждой.
  2. 02
    В чём разница между access-токеном и ID-токеном?
  3. 03
    Почему кража токена менее катастрофична, чем кража пароля?
Итог

OAuth решает проблему передачи учётных данных: вместо того чтобы отдавать пароль каждому приложению, ты авторизуешь identity provider выдать short-lived scoped токен. Три стороны — клиент, authorization server, resource server — делят доверие так, что ни одна не нуждается в доверии всем остальным. OpenID Connect добавляет identity-слой через подписанный ID-токен. Украденный токен имеет scope, short-lived и отзываем; украденный пароль — нет. Теперь, когда встретишь “Sign in with Google” в коде, сразу проверяй: валидируется ли ID-токен до доверия пользователю? Ограничен ли scope access-токена ровно тем, что нужно приложению — не больше?

Практика

Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 5 завершено
Связанные уроки
углубляется в
встречается в228

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

Примени это

Примени этот урок в реальном проекте.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.