Ошибка аутентификации при подключении к веб-приложению чаще всего возникает из-за отсутствующей или не отправленной cookies, истекшей сессии, отказа reverse proxy либо ошибки обработки заголовков Authorization. Начните с проверки фактического HTTP-запроса в DevTools Network: найдите запрос входа, ответ сервера, заголовок Set-Cookie и следующий запрос к защищенному ресурсу.
Затем сравните вход в обычном и приватном окне, проверьте статус ответа и сопоставьте access log reverse proxy с application log. Код 401 обычно указывает на отсутствие или отклонение учетных данных, 403 сообщает об отказе в доступе или провале CSRF-проверки, а 302 на страницу входа часто показывает, что приложение не признало сессию. Точную причину определяют по телу ответа, заголовкам и журналам.
Практический маршрут диагностики выглядит так: браузер и cookies, состояние сессии, путь через proxy, передача заголовков, обработчик приложения и серверное хранилище сессий. Для первичной проверки учетных данных и токенов можно свериться с материалом «Ошибка аутентификации при подключении: базовая диагностика».
Не удается войти в веб-приложение: что проверить сначала
Быстрый алгоритм локализации сбоя
- Запишите точное время ошибки с часовым поясом, адрес приложения, браузер и версию приложения.
- Откройте DevTools, перейдите на вкладку Network и повторите вход. Зафиксируйте метод, путь, статус, response body, заголовки запроса и ответа.
- Проверьте, появился ли в ответе входа заголовок Set-Cookie и передается ли соответствующий Cookie в следующем запросе.
- Повторите операцию в приватном окне или в другом браузере. Такой тест исключает часть проблем с профилем, расширениями и устаревшими cookies.
- Если архитектура это допускает, сравните доступ через публичный адрес с прямым внутренним подключением. Сопоставьте host, схему HTTP или HTTPS, путь, cookies и статус ответа.
- По времени запроса найдите одну запись в access log proxy и одну запись в application log. Если запрос отсутствует в application log, расследование нужно продолжать на proxy-слое.
Перезапуск приложения не должен быть первым действием. Он удалит часть диагностического контекста и может временно скрыть проблему с хранилищем сессий, не устранив ее причину.
Что означает код 401, 403 или 302
| Статус | Частый сценарий | Следующая проверка |
|---|---|---|
401 Unauthorized | Нет заголовка Authorization, не передана сессионная cookie, токен просрочен или приложение отклонило учетные данные. | Проверить Authorization, Cookie, срок действия токена, запись сессии и тело ответа. |
403 Forbidden | Запрос распознан, но доступ запрещен. Причиной бывают права, CSRF-токен, Origin, Referer или правило proxy. | Сравнить ответ proxy и приложения, проверить права пользователя и параметры CSRF. |
302 Found | Приложение отправляет клиента на страницу входа, потому что не видит действующую сессию. | Проверить цепочку редиректов, Set-Cookie, Cookie, Domain, Path и доступ к session backend. |
Один статус не доказывает источник сбоя. Например, reverse proxy может вернуть собственный 401, а приложение при том же сценарии никогда не получит запрос. Смотрите заголовки Server, формат тела ответа, upstream status и записи обоих компонентов.
Cookies: почему не работает авторизация в браузере
Какая cookie отвечает за сессию
Cookies - небольшие технические записи, которые браузер сохраняет после ответа сервера. По ним приложение связывает последующие запросы с текущей сессией пользователя и поддерживает вход в аккаунт.
У cookie сессии нет универсального имени. В одном приложении это может быть session ID, в другом - подписанное значение или токен. Ищите имя в заголовке Set-Cookie ответа на запрос входа либо в документации конкретного приложения. Наличие cookie в хранилище браузера еще не подтверждает ее пригодность: она может быть просрочена, привязана к другому пути или не отправляться на нужный host.
Не смешивайте обязательные технические cookies с аналитическими и рекламными. Полный запрет необходимых cookies способен нарушить вход, работу корзины и оформление заказа. Необязательные cookies могут быть отключены без влияния на серверную сессию, если приложение корректно разделяет эти категории.
Проверка Domain, Path, Secure и SameSite
Откройте в DevTools раздел Storage или Application и проверьте параметры cookie:
- Domain определяет, для какого домена и его поддоменов браузер отправит cookie. Ошибка появляется, когда cookie создана для внутреннего имени, а пользователь обращается через публичный host.
- Path ограничивает пути запроса. Cookie с Path, заданным для
/login, может не передаваться на/admin. - Secure разрешает отправку только по HTTPS. При тесте через HTTP такая cookie останется в хранилище, но не попадет в запрос.
- SameSite ограничивает передачу cookie в межсайтовых сценариях. Слишком строгая политика способна нарушить вход через SSO или работу приложения после перехода с другого домена.
- Expires и Max-Age задают срок хранения. Истекшая cookie может выглядеть сохраненной до обновления вкладки или очистки хранилища.
- Third-party cookies могут блокироваться настройками браузера. Это критично для схем, где авторизация или iframe работают на другом домене.
Сопоставьте две точки наблюдения: вкладку Storage, где видны сохраненные cookies, и вкладку Network, где видно, ушел ли заголовок Cookie в конкретном запросе. Разница между этими данными сразу показывает, проблема в создании cookie или в условиях ее отправки.
Как проверить вход в DevTools Network
- Откройте DevTools до повторного входа и включите сохранение сетевых запросов.
- Удалите cookies только для тестового домена, чтобы исключить старую сессию и не затронуть другие сайты.
- Отправьте форму входа и откройте запрос авторизации. Проверьте статус, response body и наличие Set-Cookie.
- Найдите первый запрос к защищенному адресу, например к панели или профилю. В Request Headers проверьте Cookie либо Authorization.
- Если сервер вернул 302, раскройте цепочку редиректов и найдите запрос, после которого сессия исчезла.
- Проверьте предупреждения браузера о заблокированной cookie, несоответствии Secure или нарушении SameSite.
Если Set-Cookie отсутствует, приложение могло завершить проверку логина ошибкой или proxy удалил заголовок ответа. Если Set-Cookie есть, но последующий запрос не содержит Cookie, ищите несоответствие Domain, Path, Secure, SameSite или срок действия.
Сессия истекла или повреждена: как подтвердить причину
Признаки истекшей или недействительной сессии
Сбой сессии отличается от неверного пароля повторяемым поведением после успешной отправки формы. Типовые признаки:
- форма входа возвращает успешный ответ, но следующий запрос получает 302 на страницу входа;
- после ввода правильных данных приложение показывает панель на долю секунды, затем снова просит войти;
- в одном браузере вход работает, а в другом нет;
- ошибка появляется после длительного простоя и исчезает после удаления cookies;
- вход перестает работать сразу после рестарта приложения или переключения на другой узел балансировщика;
- один пользователь не может войти, а новые пользователи проходят аутентификацию без ошибок.
Успешный ответ формы не всегда означает, что сессия создана корректно. Приложение может проверить пароль, записать сессию с ошибкой, выдать cookie для другого домена или потерять запись между двумя запросами.
TTL, хранилище сессий и время на серверах
Жизненный цикл сессии состоит из четырех шагов: приложение проверяет учетные данные, создает запись в хранилище, отправляет идентификатор в cookie, а затем ищет эту запись в каждом защищенном запросе. Ошибка возникает на любом из этапов.
Проверьте следующие параметры:
- TTL записи в Redis или другом session backend. Сравните его с Max-Age или Expires cookie.
- Наличие записи по идентификатору сессии сразу после входа и во время неудачного запроса.
- Доступность Redis, базы данных или другого хранилища со всех экземпляров приложения.
- Единый секрет подписи на всех узлах. После случайной смены секрета старые подписанные cookies перестают проходить проверку.
- Синхронизацию времени через NTP. Расхождение часов меняет оценку срока действия токена и сессии.
- Поведение после рестарта. Локальное хранилище в памяти теряет активные сессии при остановке процесса.
Срок хранения зависит от настроек приложения. В отдельных системах сессия и связанные данные могут сохраняться до 7 дней с момента последнего обращения, а отдельная техническая cookie может иметь более короткий срок.
Проверяйте время на клиенте, proxy и каждом узле приложения. Для события с timestamp 14:05:10 на клиенте запись в application log может оказаться в 14:05:04, если сервер отстает на 6 секунд. Такая разница мешает сопоставлению событий и иногда приводит к ошибочному выводу о TTL.
Безопасный сброс старой сессии
Для одного пользователя сначала удалите cookies конкретного домена, закройте старые вкладки и выполните новый вход. Затем повторите проверку в приватном окне. Если новый сеанс работает, сохраните параметры старой cookie и время сбоя для дальнейшего анализа.
Массовую очистку Redis или другого session backend проводите только после подтверждения, что записи повреждены или несовместимы с текущей версией приложения. Такая операция завершит активные сессии всех пользователей и может создать дополнительную нагрузку на сервис входа.
После logout проверьте, что сервер инвалидирует старую сессию, а браузер получает удаление cookie через Set-Cookie с истекшим сроком. Если старый идентификатор продолжает работать, проблема касается серверной логики выхода, а не браузера.
Как определить, где ломается запрос: браузер, proxy или приложение
Сбой только в одном браузере
Если вход работает в приватном окне, другом браузере или на другом компьютере, серверные настройки не меняйте сразу. Сначала проверьте профиль браузера, расширения, блокировщики, системное время и сохраненные cookies.
Сравните два запроса в DevTools: успешный и неуспешный. Обратите внимание на Cookie, Origin, Referer, User-Agent, редиректы и предупреждения браузера. Расширение может удалять заголовок, блокировать запрос или менять поведение страницы после загрузки.
Для диагностики доступа к панели управления полезен отдельный материал «Диагностика и устранение проблем с доступом к веб-интерфейсу», где сетевые проверки отделены от проблем самого интерфейса.
Сбой только через публичный адрес
Сравните прямой внутренний адрес приложения с публичным адресом через reverse proxy, если такой тест разрешен архитектурой и политиками безопасности. Одинаковыми должны быть метод, путь, host, схема, cookies и обязательные заголовки. Разница хотя бы в одном параметре меняет поведение сессии.
Если напрямую вход работает, а через публичный адрес возвращается 401 или 302, проверьте TLS-терминацию, правила location, переписывание пути, передачу host и заголовки X-Forwarded-Proto и X-Forwarded-Host. При работе через HTTPS приложение должно получать корректный признак исходной схемы, иначе оно может выдать cookie с неподходящим атрибутом Secure или отправить редирект на внутренний адрес.
Для отдельного тестового стенда с VDS, базой данных или Kubernetes можно использовать облачную инфраструктуру Timeweb Cloud, но при проверке авторизации фиксируйте различия между внутренним и публичным маршрутом.
Сбой при прямом подключении к приложению
Если ошибка воспроизводится без proxy, сосредоточьтесь на обработчике входа, session backend, проверке учетных данных и серверных зависимостях. Зафиксируйте timestamp, request ID, имя узла и точный путь запроса.
В application log ищите результат проверки пароля, создание сессии, запись идентификатора и причину отказа на защищенном endpoint. Не записывайте в журнал пароли, bearer-токены, полные cookies и значения секретов.
Строка запроса вроде GET / HTTP/1.1 показывает, какой путь получил сервер. В реальном веб-приложении нужно проверить еще метод, host, query-параметры, cookies и заголовки авторизации. Ошибка маршрута может выглядеть как ошибка входа, если защищенный endpoint заменяется редиректом на форму авторизации.
Ошибка авторизации через reverse proxy: заголовки и схема запроса
Authorization и Cookie не доходят до upstream
Reverse proxy принимает HTTP-запрос от клиента и передает его upstream-приложению. На этом пути могут исчезнуть Authorization, Cookie, Host или заголовки, которые приложение использует для определения исходного запроса.
Сопоставьте три набора данных:
- заголовки, которые браузер отправил на публичный адрес;
- access log reverse proxy и его upstream status;
- заголовки и результат разбора запроса в application log.
Проверьте правила Nginx и директивы proxy_set_header. Отдельно ищите очистку Authorization, ограничение размера заголовков, несколько proxy подряд и правила, которые меняют путь. Для Bearer-токена приложение должно получить заголовок в ожидаемом формате:
Authorization: Bearer TOKENДля cookie проверяйте не только факт передачи заголовка, но и его размер. Слишком длинный набор cookies может превысить ограничения proxy и вызвать ошибку до обработки приложения.
X-Forwarded-Proto, X-Forwarded-Host и редиректы
При TLS-терминации proxy принимает HTTPS, а upstream получает внутренний HTTP. Приложению нужно передать исходную схему через X-Forwarded-Proto и внешний host через X-Forwarded-Host. Иначе оно может считать запрос небезопасным, сформировать неправильный callback или отправить клиента в циклический редирект.
Проверяйте:
- какое значение X-Forwarded-Proto получает приложение:
httpsилиhttp; - совпадает ли X-Forwarded-Host с адресом, по которому пользователь открыл приложение;
- не переписывает ли proxy Location на внутреннее имя;
- не выдается ли cookie для host, который недоступен клиенту;
- совпадает ли Path cookie с публичным путем после rewrite.
Проблемы маршрутизации часто маскируются под ошибку авторизации. Для проверки цепочки proxy, путей и кодов ответа используйте руководство по диагностике маршрутизации.
Разница между 401 от proxy и 401 от приложения
Сначала определите, какой компонент сформировал ответ. Сравните заголовки Server, тип и структуру response body, наличие upstream status и записи в журналах.
| Признак | 401 от proxy | 401 от приложения |
|---|---|---|
| Application log | Запрос может отсутствовать. | Есть запись о проверке сессии или учетных данных. |
| Тело ответа | Часто стандартная страница или формат proxy. | Формат API или интерфейса приложения. |
| Upstream status | Может отсутствовать. | Обычно содержит 401 от upstream. |
| Следующая проверка | Правила авторизации proxy, заголовки и маршрут. | Сессия, токен, права и серверное хранилище. |
Добавьте request ID на границе proxy и приложения, чтобы связать записи одного запроса. В логах храните идентификатор, время, метод, путь и статус, но маскируйте токены, пароли и полные значения cookies.
CSRF: когда вход успешен, но действие отклоняется
Признаки ошибки CSRF
CSRF-сбой возникает после успешной аутентификации, когда приложение отклоняет изменяющий запрос без корректной защиты от межсайтовой подделки. Пользователь может открыть GET-страницы, увидеть профиль и при этом получить 403 при POST, PUT или DELETE.
Типовые симптомы:
- панель открывается, но сохранение формы возвращает 403;
- GET-запросы работают, а изменение настроек или удаление объекта завершается отказом;
- в response body указано, что токен отсутствует, истек или не соответствует сессии;
- после переноса за HTTPS proxy проблема появляется из-за неверных Origin, Referer или SameSite;
- токен есть в HTML-форме, но JavaScript не передает его в ожидаемом поле или заголовке.
Такой отказ не доказывает, что пароль неверен. Сессионная cookie может быть действительной, а CSRF-токен для этой сессии отсутствовать или устареть.
Проверка токена и SameSite
Откройте запрос POST, PUT или DELETE в DevTools и проверьте наличие CSRF-токена там, где его ожидает приложение: в скрытом поле формы, заголовке или параметре запроса. Сопоставьте токен с текущей сессией и убедитесь, что страница не была открыта до logout или истечения cookie.
Проверьте Origin и Referer. Приложение может разрешать запросы только с публичного host, а proxy передает внутреннее имя. После изменения схемы на HTTPS отдельно проверьте SameSite, Secure и настройки доверенных источников.
Не отключайте CSRF-проверку для исправления единичного 403. Сначала определите, какой токен ожидает приложение и на каком участке цепочки он теряется.
Пошаговый чеклист диагностики ошибки входа в админ-панель
Проверка через DevTools
- Запишите URL без секретных query-параметров, время, браузер и версию приложения.
- Откройте Network и повторите вход с включенным сохранением запросов.
- Проверьте запрос формы: метод, путь, status code, response body и заголовки.
- Найдите Set-Cookie в ответе и сравните его Domain, Path, Secure, SameSite, Expires и Max-Age.
- Откройте следующий защищенный запрос и убедитесь, что Cookie или Authorization передается.
- Проверьте всю цепочку 301, 302 и 307, если приложение перенаправляет клиента.
- Сравните обычное и приватное окно, затем прямой и проксированный маршрут.
HAR-файл содержит cookies, токены и идентификаторы сессий. Перед передачей разработчику удалите эти значения или замените их на маркеры вроде REDACTED.
Проверка через curl
Командный тест помогает отделить поведение браузера от HTTP-контракта сервера. Используйте отдельный cookie jar и переменные окружения, чтобы не записывать секреты прямо в историю shell:
export BASE='адрес-приложения'
curl -i -c cookies.txt "$BASE/login"
curl -i -b cookies.txt -c cookies.txt "$BASE/admin"В JSON-строке выше кавычки вокруг переменной нужны shell, а в рабочей команде замените адрес-приложения на тестовое значение через переменную окружения. Для API с Bearer-токеном передайте заголовок в ожидаемом формате:
curl -i -H 'Authorization: Bearer TOKEN' "$BASE/api/protected"Форму входа отправляйте по документации приложения. Если нужен CSRF-токен, сначала получите страницу входа, извлеките токен и передайте его вместе с cookie. Проверяйте статус, Location, Set-Cookie и тело ответа, а значения токенов скрывайте при публикации вывода.
Какие данные собрать для разработчика
- точное время сбоя с часовым поясом;
- публичный URL, метод и путь без секретных параметров;
- status code, Location, request ID и безопасный фрагмент response body;
- факт наличия Set-Cookie и передачи Cookie без публикации ее значения;
- результат проверки в приватном окне, другом браузере и на другом компьютере;
- результат сравнения публичного адреса с прямым маршрутом;
- версию приложения, reverse proxy и конфигурацию session backend;
- фрагменты access log и application log с замаскированными токенами и идентификаторами.
Полезный отчет отвечает на три вопроса: какой запрос завершился ошибкой, какой компонент вернул ответ и что изменилось между успешным и неуспешным сценарием. Для сбоев после обновления дополнительно сравните версии, политики безопасности, настройки токенов и конфигурацию сессий. Отдельный чеклист есть в статье «Ошибка аутентификации после обновления».
Для чтения журналов по времени, request ID и статусам используйте пошаговое руководство по логам аутентификации. Оно помогает разделить записи клиента, proxy, приложения и внешнего сервиса входа.
Вывод: как быстрее сузить причину ошибки аутентификации
Минимальный набор проверок перед изменением конфигурации
- Зафиксируйте запрос, время, статус и тело ответа.
- Проверьте Set-Cookie и передачу Cookie в защищенном запросе.
- Убедитесь, что session ID не истек и соответствующая запись есть в хранилище.
- Определите источник ответа: браузер, reverse proxy или приложение.
- Сопоставьте Authorization, Cookie, Host, X-Forwarded-Proto и X-Forwarded-Host.
- Для 403 на изменяющем запросе отдельно проверьте CSRF-токен, Origin и Referer.
- Только после этих проверок меняйте TTL, правила proxy, секреты подписи или настройки cookies.
Наличие cookie не подтверждает валидность сессии. Статус 401 или 403 нужно связывать с конкретным компонентом, а перезапуск оправдан после проверки логов и состояния session backend.
Что сохранить после устранения сбоя
Запишите причину, затронутый компонент, версию приложения и proxy, диагностический признак и точное исправление. Добавьте безопасный пример запроса и ожидаемый статус, если он не содержит учетных данных.
Полезная запись для базы знаний выглядит так: «После обновления proxy удалял Authorization из запроса к upstream. В access log был 401, application log не содержал записи. Возврат заголовка через proxy_set_header устранил ошибку». Такой формат позволяет повторить проверку без доступа к действующим токенам.
| Симптом | Вероятный слой | Следующая проверка |
|---|---|---|
| В приватном окне вход работает | Браузер, cookies или расширение | Очистить cookies домена и сравнить параметры Set-Cookie. |
| Есть 302 на форму входа после успешной авторизации | Сессия или cookie | Проверить Cookie, TTL, запись session ID и секрет подписи. |
| Прямой адрес работает, публичный возвращает 401 | Reverse proxy | Сопоставить Authorization, Cookie, host, схему и upstream status. |
| GET работает, POST получает 403 | CSRF или права | Проверить CSRF-токен, Origin, Referer и права пользователя. |
| 401 есть, а в application log нет запроса | Proxy или внешний слой авторизации | Проверить правила доступа proxy и заголовки ответа. |
| Ошибка появилась после рестарта узла | Хранилище сессий или балансировка | Проверить Redis, общее хранилище, секрет подписи и распределение запросов. |