Зарегистрируйтесь, чтобы продолжить обучение

Сессия JS: Веб-разработка

Сессия – это абстракция, созданная для удобной работы с индивидуальными пользователями. Она используется для идентификации пользователей и позволяет отличать их друг от друга. Например, аутентификация на сайтах построена поверх механизма сессии. В этом уроке мы обсудим сессии в контексте JavaScript.

Как работают сессии

Сессия использует куки для своей работы. Для каждого пользователя создается своя кука со специальным идентификатором, который сложно подобрать. Это происходит во время первого обращения к сессии. Больше кука никак не используется, все данные записываются в память рабочего приложения:

Cookie: JSESSIONID=node01lywaspcyuggy15sok9tw6q9eh0.node0

Для работы с сессиями в Fastify нужно подключить пакет:

npm i @fastify/session
import session from '@fastify/session'
import fastifyCookie from '@fastify/cookie'
import fs from 'fs'
import path from 'path'

await app.register(fastifyCookie)
await app.register(session, {
  secret: 'a secret with minimum length of 32 characters',
  cookie: { secure: false },
})

При подключении нужно указать секретный ключ из 32 символов.

Принцип работы с данными сессии очень похож на то, как идет работа с куками. Мы можем добавить данные в сессию и прочитать их:

app.get('/increment', (req, res) => {
  req.session.counter = req.session.counter || 0
  req.session.counter += 1
})

Добавленные данные хранятся в сессии до тех пор, пока не произойдет одно из следующих событий:

  • Кука будет удалена
  • Закончится время жизни куки
  • Данные сессии будут удалены на бэкенде

Как использовать сессии

Реализуем упрощенный пример аутентификации на сайте.

Аутентификация это процедура проверки подлинности, например:

  • Проверка подлинности пользователя путём сравнения введённого им пароля с паролем, сохранённым в базе данных пользователей;
  • Подтверждение подлинности электронного письма путём проверки цифровой подписи письма по открытому ключу отправителя;
  • Проверка контрольной суммы файла на соответствие сумме, заявленной автором этого файла.

Аутентификацию не следует путать с авторизацией (процедурой предоставления субъекту определённых прав) и идентификацией (процедурой распознавания субъекта по его идентификатору).

Разберем пример:

import encrypt from './encrypt.js'

app.post('/session', (req, res) => {
  // ...
  if (user.passwordDigest === encrypt(password)) {
    req.session.userId = user.id
    // ...
  }
  // ...
})

При совпадении паролей в сессию устанавливается идентификатор пользователя под ключом, который потом будет использоваться для проверки, аутентифицирован ли пользователь.

Обратите внимание на то, что в примере выше используется не сам пароль, а его хешированная версия. С точки зрения безопасности ни в коем случае нельзя хранить пароли в открытом виде. Поэтому при создании пользователя пароль специальным образом хешируется, и в хранилище уже сохраняется этот хеш. Во время процедуры аутентификации пароль, вводимый пользователем, хешируется тем же способом, что и при регистрации, а затем происходит сравнение хешей.

// encrypt.js
import crypto from 'crypto'

export default (text) => {
  const hash = crypto.createHmac('sha512', 'salt')
  hash.update(text)
  return hash.digest('hex')
}

Самостоятельная работа

  1. Проделайте все шаги из урока у себя на компьютере. Добавьте в приложение аутентификацию. Сделайте обработчик для отображения формы логина и для самого процесса логина, сделайте шаблон. Проверять пароль не нужно. Добавьте на главную страницу ссылку на страницу логина. Запустите приложение и убедитесь, что все работает
  2. Откройте в своем браузере инструменты разработчика, проверьте, какие куки устанавливаются. Найдите куку JSESSIONID. Попробуйте удалить ее

  3. Залейте изменения на GitHub

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff