Использовали ли вы токены в REST API?

«Использовали ли вы токены в REST API?» — вопрос из категории Сети, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, я использовал токены для аутентификации в REST API, в основном JWT (JSON Web Tokens) и Bearer-токены. Это стандартный подход для stateless-аутентификации.

Сетевой аспект и практика:

  • Передача токена: Токен передается в HTTP-заголовке Authorization: Bearer <token>. Это чистая реализация на уровне протокола HTTP.
  • Безопасность: Критически важно использовать HTTPS (TLS) для шифрования всего трафика, иначе токен может быть перехвачен. Я настраивал срок жизни токена (TTL) и использовал refresh-токены для обновления сессии без повторного ввода логина/пароля.
  • Пример проверки на стороне сервера (Node.js с Express):
const jwt = require('jsonwebtoken');
const express = require('express');
const app = express();

// Middleware для проверки токена
function authenticateToken(req, res, next) {
    const authHeader = req.headers['authorization'];
    const token = authHeader && authHeader.split(' ')[1]; // Извлекаем Bearer <token>

    if (!token) return res.sendStatus(401); // Unauthorized

    jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, (err, user) => {
        if (err) return res.sendStatus(403); // Forbidden (токен невалиден)
        req.user = user;
        next();
    });
}

// Защищенный маршрут
app.get('/api/protected-data', authenticateToken, (req, res) => {
    res.json({ data: 'Секретные данные для пользователя ' + req.user.id });
});

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