HTTP Authorization Header: Полное руководство по авторизации в REST API
Введение: пропуск на объект 🪪
Authorization header — это «пропуск» в HTTP‑запросе: мы показываем его и получаем доступ.
💡 Совет: пароль не должен уходить в сторонние приложения.
✅ Вывод: стандартный заголовок делает авторизацию предсказуемой.
💡 Совет: пароль не должен уходить в сторонние приложения.
✅ Вывод: стандартный заголовок делает авторизацию предсказуемой.
Проблема → решение
Проблема: токены утекают, статусы путаются, доступ реализуют «как получится».
Решение: единый формат Authorization, правильные схемы, корректные 401/403.
✅ Вывод: единые правила = меньше ошибок.
Решение: единый формат Authorization, правильные схемы, корректные 401/403.
✅ Вывод: единые правила = меньше ошибок.
Чем помогает и как работает
Authorization header помогает:
- передавать доступ стандартно;
- не светить пароль и не таскать токены в URL;
- безопасно работать с короткими access token.
Как это работает (по шагам):
- Система выдаёт постоянный ключ (API Key или refresh token) после регистрации/логина.
- Клиент получает временный access token на короткий срок (минуты/часы).
- Каждый запрос к API содержит
Authorization: Bearer <access_token>. - Access token истёк — клиент обновляет его через refresh token.
- Если токена нет или прав мало — сервер отвечает 401/403.
✅ Вывод: Authorization header — центральная точка контроля доступа.
Ключевые термины (простыми словами)
- Authorization Header — место, где передаём доступ.
- Scheme — тип авторизации (Bearer, Basic, ApiKey).
- Bearer Token — access token.
- Basic Auth — логин:пароль в заголовке.
- API Key — ключ приложения.
- WWW-Authenticate — подсказка клиенту.
- 401/403 — статусы отказа.
Самое важное (must‑know)
- Формат:
Authorization: <scheme> <credentials>. - 401 возвращаем с
WWW-Authenticate. - 403 — прав недостаточно.
- Токен нельзя передавать в URL.
- Basic только через HTTPS.
- В логах Authorization маскируем.
1. Authorization Header — формат
Назначение: передать доступ стандартно.
Простыми словами: кладём ключ в специальный заголовок.
Аналогия: пропуск на входе.
Простыми словами: кладём ключ в специальный заголовок.
Аналогия: пропуск на входе.
Пример:
GET /orders/42Authorization: Bearer eyJhbGciOi...🔎 Как это происходит на практике:
- Клиент добавляет
Authorization. - Сервер извлекает схему и данные.
- Ответ — 200, 401 или 403.
Характеристики:
- ✅ единый формат;
- ✅ схема + данные;
- ✅ подходит для любых клиентов.
Когда использовать: все защищённые запросы.
✅ Вывод: Authorization — главный контейнер доступа.
✅ Вывод: Authorization — главный контейнер доступа.
2. Bearer Token — стандарт OAuth
Назначение: передать access token.
Простыми словами: временный пропуск.
Аналогия: браслет на мероприятии.
Простыми словами: временный пропуск.
Аналогия: браслет на мероприятии.
Пример:
Authorization: Bearer <token>🔎 Как это происходит на практике:
- Клиент получает токен.
- Отправляет Bearer в заголовке.
- API проверяет токен и scope.
Характеристики:
- ✅ токен секретный;
- ✅ короткий TTL;
- ✅ может быть JWT.
Когда использовать: OAuth 2.0 клиенты.
✅ Вывод: Bearer — основной вариант.
✅ Вывод: Bearer — основной вариант.
3. Basic Auth — логин и пароль
Назначение: быстро авторизовать внутренние сервисы.
Простыми словами: пароль в Base64.
Аналогия: сказать пароль вслух.
Простыми словами: пароль в Base64.
Аналогия: сказать пароль вслух.
Пример:
Authorization: Basic dXNlcjpwYXNz🔎 Как это происходит на практике:
- Клиент кодирует
user:pass. - Отправляет в Authorization.
- Сервер декодирует и проверяет.
Характеристики:
- ✅ Base64 не шифрует;
- ✅ только HTTPS;
- ✅ только internal.
Когда использовать: сервис‑to‑сервис.
✅ Вывод: Basic прост, но рискован.
✅ Вывод: Basic прост, но рискован.
4. API Key — доступ для приложений
Назначение: идентифицировать сервис без пользователя.
Простыми словами: ключ для приложения.
Аналогия: пропуск подрядчика.
Простыми словами: ключ для приложения.
Аналогия: пропуск подрядчика.
Пример:
Authorization: ApiKey a1b2c3🔎 Как это происходит на практике:
- Сервис получает ключ.
- Передаёт его в заголовке.
- API проверяет и лимитирует.
Характеристики:
- ✅ ключ можно отозвать;
- ✅ подходит для server‑to‑server.
Когда использовать: публичные API.
✅ Вывод: ApiKey удобен для машин.
✅ Вывод: ApiKey удобен для машин.
5. 401 vs 403
Назначение: правильно объяснить отказ.
Простыми словами: 401 — «не показал пропуск», 403 — «пропуск есть, но нельзя».
Аналогия: охранник у двери.
Простыми словами: 401 — «не показал пропуск», 403 — «пропуск есть, но нельзя».
Аналогия: охранник у двери.
Пример:
HTTP/1.1 401 UnauthorizedWWW-Authenticate: Bearer realm="api"🔎 Как это происходит на практике:
- Нет токена → 401.
- Нет прав → 403.
- Клиент понимает причину.
Характеристики:
- ✅ 401 с WWW-Authenticate;
- ✅ 403 без него.
Когда использовать: все защищённые эндпоинты.
✅ Вывод: статусы — часть UX.
✅ Вывод: статусы — часть UX.
6. Хранение токена
Назначение: защитить токен от утечек.
Простыми словами: ключи не кладём на витрину.
Аналогия: держим пропуск в кармане.
Простыми словами: ключи не кладём на витрину.
Аналогия: держим пропуск в кармане.
Пример:
Set-Cookie: access_token=...; HttpOnly; Secure; SameSite=Lax🔎 Как это происходит на практике:
- Сервер кладёт токен в HttpOnly cookie.
- Браузер отправляет его сам.
- JS не может украсть токен.
Характеристики:
- ✅ не передавать в URL;
- ✅ HttpOnly + Secure + SameSite;
- ✅ маскировать в логах.
Когда использовать: браузерные клиенты.
✅ Вывод: хранение критично.
✅ Вывод: хранение критично.
Сравнение: схемы
| Схема | Плюсы | Минусы |
|---|---|---|
| Bearer | стандарт OAuth | нужно защищать токен |
| Basic | простота | Base64 не защищает |
| ApiKey | удобно для сервисов | нет пользователя |
Сравнение: 401 vs 403
| Код | Когда |
|---|---|
| 401 | нет/неверный токен |
| 403 | прав недостаточно |
Типичные ошибки
Ошибка 1: Токен в URL
❌ Неправильно:
✅ Правильно:
Почему: URL попадает в логи.
/api?token=....✅ Правильно:
Authorization: Bearer ....Почему: URL попадает в логи.
Ошибка 2: Basic без HTTPS
❌ Неправильно: Basic по HTTP.
✅ Правильно: только HTTPS.
Почему: Base64 не защита.
✅ Правильно: только HTTPS.
Почему: Base64 не защита.
Ошибка 3: localStorage
❌ Неправильно: хранить токен в localStorage.
✅ Правильно: HttpOnly cookie.
Почему: XSS.
✅ Правильно: HttpOnly cookie.
Почему: XSS.
Ошибка 4: 403 вместо 401
❌ Неправильно: 403 когда токена нет.
✅ Правильно: 401 + WWW-Authenticate.
Почему: клиенту нужна подсказка.
✅ Правильно: 401 + WWW-Authenticate.
Почему: клиенту нужна подсказка.
Ошибка 5: Логи с токенами
❌ Неправильно: логировать Authorization.
✅ Правильно: маскировать.
Почему: логи — источник утечек.
✅ Правильно: маскировать.
Почему: логи — источник утечек.
Best Practices
- Всегда HTTPS.
- Bearer только в Authorization.
- 401 с WWW-Authenticate.
- Короткий access token + защищённый refresh.
- Маскировать токены в логах.
- Документировать схему.
Часто спрашивают на собеседованиях
- Чем Bearer отличается от Basic?
- Почему 401 возвращает WWW-Authenticate?
- Почему нельзя токен в URL?
- Что безопаснее: localStorage или HttpOnly?
- JWT шифруется или подписывается?
✅ Вывод: лекция закрывает базовые интервью‑вопросы.
Заключение
Authorization header — стандартный и безопасный способ авторизации.
✅ Вывод: соблюдайте формат и правила хранения.
✅ Вывод: соблюдайте формат и правила хранения.