← Назад ко всем вопросам

Что такое сессия и чем session-based auth отличается от token-based?

1️⃣ Как кратко ответить

Сессия — это временное взаимодействие между клиентом и сервером, в котором сервер хранит состояние пользователя. Session-based аутентификация использует серверное хранилище для управления состоянием сессии, тогда как token-based аутентификация использует токены, которые клиент хранит и отправляет с каждым запросом, не требуя серверного хранилища состояния.

2️⃣ Подробное объяснение темы

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

Session-based аутентификация:

  1. Создание сессии: Когда пользователь успешно аутентифицируется, сервер создает сессию и сохраняет информацию о пользователе на сервере. Сервер также генерирует уникальный идентификатор сессии (session ID) и отправляет его клиенту в виде cookie.

  2. Хранение состояния: Состояние пользователя хранится на сервере, что позволяет серверу отслеживать, кто пользователь и какие у него права доступа.

  3. Отправка session ID: При каждом последующем запросе клиент отправляет session ID в cookie, чтобы сервер мог идентифицировать сессию и предоставить соответствующий доступ.

  4. Недостатки: Требует серверного хранилища для управления сессиями, что может быть проблематично при масштабировании, так как необходимо синхронизировать сессии между серверами.

Token-based аутентификация:

  1. Создание токена: После успешной аутентификации сервер генерирует токен (например, JWT — JSON Web Token), который содержит информацию о пользователе и подписан сервером для обеспечения целостности.

  2. Хранение токена: Токен хранится на клиенте, например, в localStorage или sessionStorage, и отправляется с каждым запросом в заголовке Authorization.

  3. Без серверного состояния: Сервер не хранит состояние пользователя. Вместо этого он проверяет подпись токена и извлекает из него информацию о пользователе.

  4. Преимущества: Легче масштабировать, так как не требует синхронизации состояния между серверами. Токены могут быть использованы для аутентификации в разных доменах и сервисах.

Пример кода для token-based аутентификации:

# Пример использования Flask для создания токена
from flask import Flask, request, jsonify
import jwt
import datetime
​
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
​
# Эндпоинт для аутентификации пользователя
@app.route('/login', methods=['POST'])
def login():
    auth_data = request.get_json()
    if auth_data['username'] == 'user' and auth_data['password'] == 'pass':
        # Генерация токена с истечением через 30 минут
        token = jwt.encode({
            'user': auth_data['username'],
            'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=30)
        }, app.config['SECRET_KEY'], algorithm='HS256')
        return jsonify({'token': token})
    return jsonify({'message': 'Invalid credentials'}), 401
​
# Эндпоинт, защищенный токеном
@app.route('/protected', methods=['GET'])
def protected():
    token = request.headers.get('Authorization')
    if not token:
        return jsonify({'message': 'Token is missing!'}), 403
    try:
        # Декодирование токена
        data = jwt.decode(token, app.config['SECRET_KEY'], algorithms=['HS256'])
        return jsonify({'message': f'Welcome {data["user"]}!'})
    except jwt.ExpiredSignatureError:
        return jsonify({'message': 'Token has expired!'}), 403
    except jwt.InvalidTokenError:
        return jsonify({'message': 'Invalid token!'}), 403
​
if __name__ == '__main__':
    app.run()
  • login: Эндпоинт для аутентификации. Проверяет учетные данные и генерирует токен, если они верны.
  • protected: Эндпоинт, который требует токен для доступа. Проверяет наличие и валидность токена, возвращает приветственное сообщение, если токен действителен.
  • jwt.encode: Создает токен с информацией о пользователе и временем истечения.
  • jwt.decode: Проверяет токен и извлекает информацию о пользователе.

Token-based аутентификация позволяет клиенту хранить токен и использовать его для доступа к защищенным ресурсам без необходимости постоянного обращения к серверу для проверки состояния сессии.

Тема: API и протоколы
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки