Игра вроде Змейки готова — и теперь хочется, чтобы у каждого игрока был свой аккаунт: сохранялся рекорд, открывался магазин скинов, работала таблица лидеров. Значит, нужно научить приложение узнавать пользователя. Классический путь — попросить придумать пароль. Но пароли легко забыть, ещё легче украсть, а хранить их безопасно — отдельная наука. В курсе skillmake для входа используется код на почту: ты вводишь email, получаешь шестизначный код, вводишь его — и ты внутри. Разберёмся, как работает такая авторизация, что происходит с сессией, зачем нужны cookie и токены и почему от паролей можно отказаться.
Содержание
- Зачем отказываться от паролей в простом приложении
- OTP: одноразовый пароль на почту
- Что такое сессия
- Cookie: как браузер запоминает сессию
- Токен: когда приложение общается с API
- Как это работает вместе на примере Змейки
- Практический блок: как применить и проверить
- Частые ошибки новичков
- Заключение + чек-лист
Зачем отказываться от паролей в простом приложении
Пароль кажется простым: придумал, запомнил, ввёл. На деле он создаёт несколько проблем.
- Пользователи выбирают слабые пароли.
123456,qwerty, дни рождения — всё это легко подбирается. - Пароли повторяются. Если один сервис утёк, злоумышленники пробуют те же данные на других.
- Хранить пароли сложно. Даже захешированный пароль требует соли, медленных алгоритмов и постоянной бдительности. Ошибка в одной строчке — и база данных раскрыта.
- Пароль нужно восстанавливать. Забыл — жди письма, кликай ссылку, придумывай новый.
В небольшом проекте, где ты и сам разрабатываешь бэкенд, проще и безопаснее переложить проверку личности на почту или на внешний сервис вроде Google. Ты не хранишь секрет пользователя у себя — значит, не можешь его потерять.
Главная мысль: пароль — это секрет, который должен знать только пользователь. Если ты как разработчик не хранишь этот секрет, у тебя меньше ответственности и меньше рисков.
OTP: одноразовый пароль на почту
OTP расшифровывается как One-Time Password, то есть «одноразовый пароль». Это код, который действует короткое время и подходит только для одного входа.
В сценарии из курса работает так:
- Пользователь вводит свой email в форму входа.
- Приложение просит Supabase отправить письмо с кодом.
- На почту приходит шестизначный код, обычно с коротким сроком жизни — например, 10 минут.
- Пользователь вводит код в приложение.
- Supabase проверяет код: если он правильный и не просроченный, считает, что человек действительно владеет почтой.
Почта здесь выступает каналом проверки. Код — это не пароль, его нельзя использовать дважды и нет смысла запоминать. Если кто-то перехватит старый код, он уже не сработает.
Представь это как вход в подъезд по звонку в concierge: ты говоришь свой адрес, concierge звонит тебе на мобильный, ты называешь код из СМС — дверь открывается. Код работает один раз, и concierge не хранит у себя твои ключи.
Важно: OTP защищён ровно настолько, насколько защищена почта. Если у злоумышленника есть доступ к почтовому ящику, он сможет войти. Поэтому важные ящики лучше защищать двухфакторной аутентификацией самой почты.
Что такое сессия
После успешной проверки кода приложению нужно помнить, что ты уже вошёл. Иначе при каждом клике пришлось бы вводить email и код заново.
Сессия — это временное состояние «пользователь авторизован». Сервер создаёт запись о том, что вот этот конкретный посетитель успешно прошёл проверку, и даёт ей уникальный номер — идентификатор сессии.
У сессии есть срок жизни. Например, две недели. Пока сессия активна, приложение считает тебя своим и показывает персональные данные: твой рекорд в Змейке, купленные скины, место в таблице лидеров. Когда срок истекает, сессия удаляется, и пользователю снова нужно войти.
Сессии хранятся на сервере. Это удобно, потому что сервер может в любой момент отозвать сессию: например, если увидит подозрительную активность или если пользователь нажал «Выйти на всех устройствах».
Cookie: как браузер запоминает сессию
Браузер и сервер общаются по HTTP — протоколу, в котором каждый запрос по сути независимый. Без дополнительных механизмов сервер не отличит новый запрос от продолжения старого разговора.
Cookie — это маленький фрагмент данных, который сервер просит браузер сохранить и присылать с каждым следующим запросом. В случае авторизации в cookie обычно хранится идентификатор сессии.
Когда ты вошёл по коду, сервер говорит браузеру:
«Сохрани вот эту печеньку с номером сессии. Присылай её мне при каждом обращении, и я буду понимать, кто ты.»
Важные свойства cookie:
- HttpOnly — cookie недоступна JavaScript на странице. Это защищает от XSS-атак, когда злоумышленник пытается украсть данные через вредоносный скрипт.
- Secure — cookie передаётся только по HTTPS, то есть в зашифрованном виде.
- SameSite — ограничивает, когда cookie отправляется с запросами с других сайтов. Это защита от CSRF-атак.
- Expires / Max-Age — время жизни cookie. Обычно совпадает со сроком сессии.
Cookie не содержат пароль и не дают прямого доступа к данным. Это просто «пропуск», по которому сервер находит активную сессию.
Токен: когда приложение общается с API
Cookie хороши для классических веб-страниц, но современные приложения часто общаются с сервером через API. Здесь удобнее использовать токен.
Токен — это подписанная строка, которая подтверждает личность пользователя. Самый распространённый формат — JWT (JSON Web Token). Он состоит из трёх частей:
- Заголовок — информация о типе токена и алгоритме подписи.
- Полезная нагрузка — данные о пользователе, например ID и срок действия.
- Подпись — криптографическая проверка, что токен не подделали.
Токен выдаётся после входа. Приложение сохраняет его в памяти или в безопасном хранилище и прикрепляет к каждому запросу к API, обычно в заголовке Authorization: Bearer <токен>.
Сервер, получив токен, проверяет подпись и срок действия. Если всё в порядке — выполняет запрос. Если токен просрочен или подделан — отказывает.
Supabase использует собственную схему токенов для доступа к базе данных и API. Когда ты входишь через OTP, Supabase возвращает токены, и твой код использует их для запросов к таблицам — например, чтобы записать новый рекорд именно для этого пользователя.
Разница в двух словах: сессия — это состояние на сервере, cookie — способ передать ID сессии в браузере, токен — самодостаточный пропуск, который проверяется без хранения состояния.
Как это работает вместе на примере Змейки
Представь, что в Змейке появилась таблица лидеров. Игрок хочет, чтобы его результат сохранялся под именем, а не терялся при закрытии вкладки.
- Игрок открывает игру и нажимает «Войти».
- Вводит email, нажимает «Отправить код».
- Supabase отправляет на этот адрес одноразовый код.
- Игрок вводит код, Supabase проверяет его.
- После успеха Supabase создаёт сессию и возвращает токены.
- Браузер сохраняет идентификатор сессии в cookie.
- Приложение сохраняет токен для запросов к API.
- Когда игрок бьёт рекорд, приложение отправляет результат в Supabase с токеном.
- Supabase видит по токену, кто именно установил рекорд, и записывает его в таблицу лидеров.
- При следующем открытии игры браузер пришлёт cookie, Supabase найдёт сессию, и игрок снова окажется внутри — до тех пор, пока сессия не истечёт.
Пароль при этом нигде не фигурирует. Ты не хранишь его в базе, не проверяешь сложность, не восстанавливаешь. Вся ответственность за подтверждение личности лежит на почтовом сервисе и на механизме OTP, который предоставляет Supabase.
Практический блок: как применить и проверить
Если ты собираешь авторизацию в своём проекте, пройди по этому чек-листу:
- Выбери провайдера аутентификации. Supabase — удобный вариант для проектов курса: в нём уже есть OTP, сессии, токены и защита cookie. Официальная документация: supabase.com/docs/guides/auth.
- Настрой отправку писем. В Supabase это делается в разделе Auth → Email Templates. Письмо можно отредактировать под свой проект.
- Используй готовый клиент. Supabase предоставляет JavaScript-библиотеку, которая берёт на себя работу с cookie, токенами и обновлением сессии.
- Проверь защиту cookie. В настройках сессии должны быть включены HttpOnly и Secure для продакшена.
- Задай разумный срок жизни сессии. Для игры подойдёт несколько дней или недель. Для банковского приложения — минуты.
- Проверь выход. Кнопка «Выйти» должна не просто стирать данные на клиенте, но и инвалидировать сессию на сервере.
- Тестируй в режиме инкогнито. Открой игру, войди, закрой вкладку, открой снова — ты должен оставаться авторизованным. Затем нажми «Выйти» и убедись, что доступ к личным данным пропал.
Важно: никогда не пиши свой собственный криптографический механизм для сессий и токенов. Используй проверенные библиотеки и сервисы. Ошибки в самодельной аутентификации — один из самых частых источников уязвимостей.
Частые ошибки новичков
Ошибка 1. Хранить пароли в localStorage
localStorage доступен любому JavaScript на странице. Если злоумышленник внедрит вредоносный код, он легко заберёт токен или пароль. Для сессионных данных лучше использовать cookie с флагом HttpOnly.
Ошибка 2. Не проверять срок действия токена
Токены не вечны. Если приложение не обновляет токен и не обрабатывает ошибку «истёк», пользователь внезапно увидит страницу, на которой ничего не работает.
Ошибка 3. Доверять данным на клиенте
Нельзя решать на стороне браузера, что пользователь может видеть чужой рекорд. Правила доступа должны проверяться на сервере — например, через Row Level Security в Supabase.
Ошибка 4. Забывать про кнопку «Выйти»
Выход должен работать полностью: и на фронтенде, и на бэкенде. Иначе сессия останется активной, и кто-то другой сможет ей воспользоваться.
Заключение + чек-лист
Авторизация без пароля через OTP — простой и безопасный способ узнавать пользователей в небольших приложениях. Вместо того чтобы придумывать и хранить секреты, ты передаёшь проверку личности почте и внешнему сервису. Сессия запоминает, что человек вошёл, cookie помогает браузеру её передать, а токен позволяет безопасно обращаться к API.
Для проекта вроде Змейки, где нужны аккаунты и таблица лидеров, этот подход идеален: он работает «из коробки» в Supabase, не требует ручного управления паролями и понятен новичкам.
Чек-лист «Авторизация настроена правильно»
- Вход реализован через OTP или внешнего провайдера, пароли не хранятся в проекте.
- Сессия имеет разумный срок жизни и отзывается при выходе.
- Cookie настроены с флагами HttpOnly, Secure и SameSite.
- Токены обновляются автоматически и проверяются на сервере.
- Правила доступа к данным настроены на бэкенде, а не только на клиенте.
- Проверено: после закрытия вкладки пользователь остаётся авторизованным.
- Проверено: после нажатия «Выйти» доступ к личным данным пропадает.
- В письмо с кодом добавлены понятный текст и срок действия кода.
Итог: не усложняй то, что уже придумано до тебя. Используй OTP, сессии и токены через проверенный сервис, и у тебя получится безопасный вход без головной боли с паролями.
Читай дальше
Все статьиНе просто статьи — тебя доведут до результата
В практикуме за 1999 ₽ рядом живая команда практикующих разработчиков и маркетологов: ведём по шагам до твоего работающего приложения. Не «ролики и сам разбирайся» — помогаем на каждом затыке.
Перейти к практикуму