Токены в веб-приложениях используются для аутентификации и авторизации пользователей. Их неправильное хранение или передача может привести к компрометации безопасности приложения. На практике токены чаще всего представляют собой JSON Web Tokens (JWT), но подходы к безопасности применимы к любым типам токенов.
Ключевые принципы безопасной работы с токенами:
Минимизация времени жизни токена Токены с коротким временем жизни снижают риск злоупотребления в случае их компрометации. Для долгосрочной аутентификации рекомендуется использовать refresh-токены, которые хранятся отдельно и используются только для получения нового access-токена.
Хранение токена на клиенте
Передача токена через HTTPS Токены должны передаваться только по HTTPS, чтобы предотвратить их перехват в процессе передачи. Любая отправка по HTTP открывает путь для атак типа Man-in-the-Middle.
Использование CSRF-защиты При хранении токена в cookie важно включать SameSite и CSRF-токены для защиты от межсайтовой подделки запросов.
Riot.js не предоставляет встроенного механизма управления токенами, но позволяет удобно интегрировать сторонние решения и контролировать жизненный цикл токена через компоненты и состояния приложения.
Структура хранения и передачи токенов в Riot.js может выглядеть так:
import { observable } from 'riot';
const authStore = observable({
token: null,
setToken(newToken) {
this.token = newToken;
},
clearToken() {
this.token = null;
}
});
observable используется для реактивного обновления
компонентов при изменении токена.setToken и clearToken позволяют
централизованно управлять состоянием аутентификации.Пример безопасного запроса с токеном:
async function fetchData() {
const response = await fetch('/api/data', {
method: 'GET',
headers: {
'Authorization': `Bearer ${authStore.token}`
},
credentials: 'include' // если используется cookie
});
return response.json();
}
Authorization передает токен на сервер.credentials: 'include' необходима для отправки
cookie при кросс-доменных запросах.При использовании refresh-токенов логика обновления токена может быть встроена в хранилище состояния:
async function refreshToken() {
const response = await fetch('/api/refresh', {
method: 'POST',
credentials: 'include'
});
const data = await response.json();
authStore.setToken(data.accessToken);
}
XSS (Cross-Site Scripting):
CSRF (Cross-Site Request Forgery):
SameSite атрибута cookie ограничивает его
отправку сторонними сайтами.Защита от утечки через сторонние скрипты:
document.cookie или localStorage.Authorization.Такой подход обеспечивает высокий уровень безопасности и позволяет Riot.js-приложению управлять сессиями пользователей без уязвимостей, связанных с неправильной обработкой токенов.