Аутентификация отвечает на вопрос «кто ты» (проверка личности — логин, пароль, токен). Авторизация — «что тебе можно» (какие действия и данные разрешены). Это разные вещи, и их постоянно путают. OAuth2 — стандарт, позволяющий стороннему приложению получить доступ к вашим данным в другом сервисе, не отдавая ему пароль: вместо пароля приложение получает временный access token. JWT — популярный формат такого токена: самодостаточная строка из трёх частей (header.payload.signature), внутри которой зашита информация о пользователе и правах, подписанная сервером. Scopes — это перечень того, что токену разрешено («только читать профиль», «читать и писать заказы»).
Однажды на ревью спеки я спросил: «А что значит „пользователь авторизован“ в этом сценарии — он вошёл или ему можно сюда?» Повисла пауза. Выяснилось, что бэкендер имел в виду «вошёл в систему», а аналитик — «имеет право видеть этот раздел». В коде это два разных места, две разные ошибки (401 и 403), и из-за смешения этих слов сценарий был дырявым. С тех пор я развожу эти два понятия в спеке жёстко.
Аутентификация и авторизация: «кто ты» против «что можно»
Самая частая путаница в этой теме — и стоит она дорого, потому что слова похожи, а смысл разный.
Аутентификация (authentication) — проверка, кто вы. Вы показываете удостоверение, система убеждается, что вы — это вы. Логин с паролем, код из СМС, токен — всё это про аутентификацию. Если не прошли — сервер отвечает 401 Unauthorized (несмотря на название, это про «не представился»).
Авторизация (authorization) — проверка, что вам разрешено. Вы уже известны системе, вопрос в правах: можете ли вы открыть этот раздел, удалить этот заказ, увидеть чужие данные. Если прав нет — сервер отвечает 403 Forbidden («ты известен, но сюда нельзя»). Коды ответов разбираются подробнее в записи про REST API.
Аналогия с офисом
Аутентификация — охранник на входе сверяет ваш пропуск с лицом: «да, это вы». Авторизация — тот же пропуск открывает дверь в бухгалтерию, но не открывает серверную. Сначала система узнаёт, кто вы; потом решает, куда вас пускать. Два разных шага, и в требованиях их надо разделять.
OAuth2 на пальцах: доступ без пароля
Представьте: приложение-планировщик хочет читать ваш календарь Google, чтобы не назначать встречи внахлёст. Отдать ему ваш пароль от Google — безумие: он получит доступ ко всей почте, и пароль придётся менять, чтобы его отозвать. OAuth2 придуман ровно для этого: дать одному сервису ограниченный доступ к вашим данным в другом, не показывая пароль.
В OAuth2 четыре роли — их полезно знать наизусть, потому что в любой спеке на интеграцию вы будете расставлять, кто здесь кто:
- Владелец ресурса — вы, пользователь, чьи данные защищены.
- Клиент — приложение, которое хочет доступ (тот самый планировщик).
- Сервер авторизации — тот, кто проверяет вас и выдаёт токены (например, аккаунты Google).
- Сервер ресурсов — где лежат данные и кто отдаёт их по токену (API календаря).
Ключевая идея: вместо пароля клиент получает access token — временный пропуск с ограниченными правами. Токен можно отозвать, он протухает сам, и он не открывает доступ ни к чему сверх разрешённого. Пароль остаётся только между вами и Google.
Типичный сценарий: authorization code flow
sequenceDiagram participant U as Пользователь participant C as Клиент (приложение) participant A as Сервер авторизации participant R as Сервер ресурсов (API) U->>C: «Подключить мой календарь» C->>A: редирект: дай доступ к календарю (scope) A->>U: страница входа + «разрешить приложению?» U->>A: ввёл пароль, нажал «разрешить» A-->>C: код авторизации (одноразовый) C->>A: меняю код на access token (+ секрет клиента) A-->>C: access token (scope: calendar.read) C->>R: запрос к API + access token R-->>C: данные календаря
Схема описывает самый распространённый сценарий OAuth2 — authorization code flow. Пользователь нажимает «подключить календарь» в приложении. Приложение не спрашивает пароль само, а перенаправляет пользователя на сервер авторизации (Google) с указанием, какой доступ нужен (scope). Google показывает свою страницу входа и спрашивает «разрешить этому приложению читать календарь?». Пользователь вводит пароль на стороне Google и соглашается — приложение пароль не видит. В ответ приложение получает одноразовый код авторизации и тут же меняет его на access token, подтверждая при этом и свою личность секретом клиента. Дальше приложение ходит в API календаря, прикладывая токен, и получает данные. Пароль за всю цепочку ни разу не попал в чужие руки.
JWT: самодостаточный токен
Токен бывает разный. Один из самых популярных форматов — JWT (JSON Web Token). Это строка из трёх частей, разделённых точками: header.payload.signature.
- Header — что это за токен и каким алгоритмом подписан.
- Payload — полезная нагрузка: кто пользователь, его id, права, когда токен истекает. Это обычный JSON, закодированный в строку (не зашифрованный — кто угодно может прочитать, поэтому пароли туда не кладут).
- Signature — подпись, которой сервер заверяет, что содержимое не подменили.
Главная фишка JWT — он самодостаточный. Внутри уже лежит всё, что нужно: кто пользователь и что ему можно. Сервер проверяет подпись и доверяет содержимому, не заглядывая в базу при каждом запросе. Это снимает нагрузку и позволяет не хранить состояние сессии на сервере — удобно, когда серверов много.
Обратная сторона самодостаточности
Раз сервер не ходит в базу, чтобы проверить токен, он не может и легко его отозвать. Выдали JWT на час — он будет действовать час, даже если пользователя забанили пять минут назад. Поэтому JWT делают короткоживущими и придумывают обходные пути (списки отзыва, refresh-токены). Если в спеке есть требование «мгновенно разлогинить пользователя» — это прямой вопрос к выбору JWT, и его стоит проговорить с командой.
Scopes и ролевая модель
Scope — это конкретное разрешение, выданное токену. Не «полный доступ», а перечень: calendar.read (только читать календарь), orders.write (создавать заказы). Когда приложение запрашивает доступ, оно перечисляет нужные scopes, пользователь видит их на экране согласия («приложение хочет: читать ваш календарь») и соглашается осознанно. Это и есть авторизация в действии: токен носит с собой ровно те права, что ему дали.
Scopes часто связывают с ролевой моделью (RBAC): пользователю назначают роль (например, «менеджер»), а роль уже разворачивается в набор прав. В требованиях полезно описывать именно матрицу «роль → что можно», а scopes — это техническая форма, в которой эта матрица доезжает до API.
Откуда это взялось
Проблема «дать доступ, не отдавая пароль» остро встала в середине 2000-х, когда соцсети начали интегрироваться друг с другом и сторонние приложения просили доступ к аккаунтам. OAuth 1.0 родился около 2007 года в этой среде (заметную роль сыграл Twitter и его экосистема) — но был сложным из-за криптографических подписей на стороне клиента. OAuth 2.0 переработали и оформили как RFC 6749 в 2012 году: проще, гибче, опирается на HTTPS вместо ручных подписей. Формат JWT стандартизировали чуть позже — RFC 7519. Эта связка и стала сегодняшним стандартом входа «через Google / GitHub / VK».
Частые вопросы
Чем аутентификация отличается от авторизации?
Аутентификация отвечает на вопрос «кто ты» — это проверка личности (логин, пароль, токен, код из СМС). Авторизация отвечает «что тебе можно» — это проверка прав на конкретное действие или данные. Сначала система убеждается, что вы — это вы (аутентификация), потом решает, куда вас пускать (авторизация). В HTTP им соответствуют коды 401 (не представился) и 403 (представился, но нельзя).
Что такое JWT простыми словами?
JWT (JSON Web Token) — это формат токена в виде строки из трёх частей через точку: header.payload.signature. В payload зашита информация о пользователе и его правах, signature — подпись сервера, подтверждающая, что данные не подменили. JWT самодостаточен: сервер проверяет подпись и доверяет содержимому, не заглядывая в базу. Минус — такой токен трудно отозвать досрочно, поэтому его делают короткоживущим.
Что такое scope в OAuth2?
Scope — это конкретное разрешение, которое получает токен: например, calendar.read (только читать календарь) или orders.write (создавать заказы). Приложение запрашивает нужные scopes, пользователь видит их на экране согласия и осознанно разрешает. Scopes ограничивают, что именно может делать токен, и часто связаны с ролевой моделью, где роль пользователя разворачивается в набор прав.