Как сервер узнаёт авторизацию пользователя на сайте?
Пользователь авторизован на сайте. Как сервер узнает об этом с последующими другими заходами, что «я – авторизованный пользователь»?
Теория по задаче
Суть задачи: HTTP «без состояния»
HTTP является протоколом без состояния: каждый запрос обрабатывается независимо, поэтому «вход» должен быть привязан к последующим запросам через специальный идентификатор (session id) или токен, который клиент отправляет каждый раз.
Идея сводится к тому, что после успешной проверки логина/пароля сервер выдаёт клиенту «доказательство аутентификации», а затем при каждом новом запросе сервер проверяет это доказательство и восстанавливает контекст пользователя.
Варианты хранения состояния
На практике применяются два основных семейства подходов: «сессионный идентификатор в cookie и состояние на сервере» и «самодостаточный токен (например JWT) и минимум состояния на сервере».
В обоих случаях сервер «узнаёт» пользователя исключительно из того, что пришло в запросе (например, заголовок Cookie или Authorization), поскольку браузер должен повторно отправлять идентификатор при последующих заходах.
Ниже — компактная схема обмена для cookie-сессии (самый распространённый вариант для сайтов):
- POST /login (credentials)
- 200 OK + Set-Cookie: SID=...; Path=/; Secure; HttpOnly
- GET /profile + Cookie: SID=...
- Сервер читает SID -> находит сессию -> определяет userId/roles -> авторизует доступ
Правильная реализация: cookie + server-side session
Сервер после успешного логина генерирует криптографически случайный session id, сохраняет на сервере запись сессии (например, sid -> userId, expiresAt, roles) и отправляет sid браузеру через Set-Cookie, чтобы браузер автоматически возвращал его в Cookie на следующих запросах.
По спецификации cookies сервер может отправлять состояние через Set-Cookie, а клиент при последующих запросах возвращает его в заголовке Cookie в пределах области действия (domain/path) и срока жизни cookie.
Пример HTTP-обмена (ключевой «след» авторизации — cookie SID):
HTTP/1.1 200 OK
Set-Cookie: SID=31d4d96e407aad42; Path=/; Secure; HttpOnly
GET /account HTTP/1.1
Host: example.com
Cookie: SID=31d4d96e407aad42
Для защиты session id в cookie обычно фиксируются атрибуты, снижающие риск XSS/CSRF/утечки в сети: Secure (только HTTPS), HttpOnly (недоступно JS API), SameSite (ограничение на cross-site отправку cookie).HttpOnly ограничивает доступ к cookie из «не-HTTP API» (например, из JavaScript API браузера), что является ключевой мерой против кражи session id через XSS.
Практически важные правила жизненного цикла: session id следует регенерировать после смены уровня привилегий (особенно после логина), а при logout/истечении срока — инвалидировать сессию на сервере и очистить cookie на клиенте.
Таймауты необходимо обеспечивать на сервере (idle/absolute), поскольку клиентские ограничения времени могут быть подменены атакующим.
Таблица различий подходов (что именно «говорит» серверу, что пользователь авторизован):
| Подход | Что приходит в каждом запросе | Где хранится «кто это» | Типичные плюсы | Типичные минусы |
|---|---|---|---|---|
| Cookie-сессия (server-side) | Cookie: SID=... | В серверном хранилище сессий (Redis/DB/память) | Лёгкая инвалидация (удаление записи), меньше данных на клиенте | Нужна инфраструктура хранения/масштабирования сессий |
| Bearer token | Authorization: Bearer <token> | Обычно токен несёт права/идентичность или ключ к ним | Удобно для API и мобильных клиентов | «Кто владеет токеном — тот и пользователь», требуются меры защиты от утечки |
| JWT (частный случай токена) | Часто так же Authorization: Bearer ... | Часть состояния внутри JWT claims | Меньше запросов к БД на проверку сессии | Нужны строгие сроки (exp), сложнее отзыв/инвалидация без доп. механизмов |
exp задаёт момент, после которого токен не должен приниматься.Кратко: HTTP сам по себе не «помнит» логин; авторизация между запросами поддерживается передачей идентификатора (чаще cookie SID) в каждом запросе и проверкой этого идентификатора сервером по серверному хранилищу сессий или по токену (Bearer/JWT) с обязательными мерами защиты (Secure, HttpOnly, SameSite, таймауты, регенерация session id).