Вопрос проверяет понимание механизма аутентификации и авторизации в одностраничных приложениях с использованием токенов, что критично для обеспечения безопасного доступа к защищённым ресурсам.
Авторизация в одностраничных приложениях (SPA) через токены, такие как JSON Web Token (JWT), представляет собой современный, бесстатусный подход, который устраняет необходимость хранения сессий на сервере. Это делает приложение более масштабируемым и упрощает интеграцию с микросервисной архитектурой.
Процесс начинается, когда пользователь вводит свои учётные данные (например, логин и пароль) в форму входа. SPA отправляет эти данные на сервер аутентификации (обычно через HTTPS POST-запрос).
Полученный токен (часто называемый access token) должен быть сохранён на стороне клиента для последующего использования. Существует два основных подхода:
После сохранения, SPA должен прикладывать этот токен к каждому запросу к защищённому API. Обычно это делается через заголовок HTTP Authorization с префиксом Bearer.
// Пример отправки запроса с токеном в JavaScript (fetch API)
const token = localStorage.getItem('accessToken');
fetch('https://api.example.com/protected-data', {
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
}
})
.then(response => response.json())
.then(data => console.log(data));Когда защищённый эндпоинт сервера получает запрос с токеном, он должен:
exp).// Пример проверки JWT на сервере (Node.js с библиотекой jsonwebtoken)
const jwt = require('jsonwebtoken');
const secretKey = process.env.JWT_SECRET;
function verifyToken(req, res, next) {
const authHeader = req.headers.authorization;
if (!authHeader) return res.sendStatus(401);
const token = authHeader.split(' ')[1]; // Извлекаем часть после 'Bearer'
jwt.verify(token, secretKey, (err, decoded) => {
if (err) return res.sendStatus(403); // Неверный или истёкший токен
req.user = decoded; // Добавляем данные пользователя в объект запроса
next(); // Передаём управление следующему middleware/обработчику
});
}Access token обычно имеют короткий срок жизни (минуты или часы) для минимизации рисков в случае утечки. Для получения нового access token без повторного ввода пароля используется refresh token. Это отдельный, долгоживущий токен, который хранится более безопасно (например, в HttpOnly cookie) и отправляется на специальный эндпоинт сервера для получения новой пары токенов.
Итог: Авторизация через JWT в SPA — это эффективный бесстатусный механизм, идеально подходящий для масштабируемых RESTful API и микросервисов. Его стоит применять, когда нужно избежать хранения состояния сессии на сервере и обеспечить простую интеграцию между различными сервисами. Однако важно правильно реализовать безопасное хранение токенов на клиенте, использовать HTTPS и короткие сроки жизни access token в сочетании с refresh token для баланса между удобством пользователя и безопасностью.