JWT — это стандарт (RFC 7519) для создания токенов доступа, которые позволяют безопасно передавать информацию между клиентом и сервером в виде JSON-объекта.
{
"alg": "HS256",
"typ": "JWT"
}
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
После успешного входа, сервер возвращает JWT, который нужно сохранить:
async function login(username, password) {
const response = await fetch('/api/auth', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, password })
});
const data = await response.json();
// Сохраняем токен в localStorage или httpOnly куки
localStorage.setItem('token', data.token);
}
При каждом запросе к защищенным endpoint'ам:
async function fetchProtectedData() {
const token = localStorage.getItem('token');
const response = await fetch('/api/protected', {
headers: {
'Authorization': `Bearer ${token}`
}
});
if (!response.ok) {
// Обработка ошибки (например, токен истек)
throw new Error('Request failed');
}
return response.json();
}
JWT часто содержит срок действия (exp - expiration time):
function isTokenExpired(token) {
const payload = JSON.parse(atob(token.split('.')[1]));
return payload.exp * 1000 < Date.now();
}
Для продления сессии без повторного входа:
async function refreshToken() {
const refreshToken = localStorage.getItem('refreshToken');
const response = await fetch('/api/refresh', {
method: 'POST',
headers: { 'Authorization': `Bearer ${refreshToken}` }
});
const data = await response.json();
localStorage.setItem('token', data.newToken);
}
Пример использования jwt-decode:
import jwt_decode from 'jwt-decode';
const token = 'eyJhbGci...';
const decoded = jwt_decode(token);
console.log(decoded.name); // John Doe
JWT — удобный стандарт для аутентификации в React-приложениях. Важно правильно реализовать хранение, передачу и обновление токенов, соблюдая меры безопасности. Для production-приложений рекомендуется использовать httpOnly куки + CSRF-токены для максимальной защиты.