Что такое сессия и чем session-based auth отличается от token-based?
1️⃣ Как кратко ответить
Сессия — это временное взаимодействие между клиентом и сервером, в котором сервер хранит состояние пользователя. Session-based аутентификация использует серверное хранилище для управления состоянием сессии, тогда как token-based аутентификация использует токены, которые клиент хранит и отправляет с каждым запросом, не требуя серверного хранилища состояния.
2️⃣ Подробное объяснение темы
Сессия — это временный период, в течение которого клиент взаимодействует с сервером. В контексте веб-приложений сессия начинается, когда пользователь входит в систему, и заканчивается, когда он выходит или когда сессия истекает. Сессии позволяют серверу "помнить" пользователя между запросами, что необходимо для обеспечения персонализированного опыта.
Session-based аутентификация:
-
Создание сессии: Когда пользователь успешно аутентифицируется, сервер создает сессию и сохраняет информацию о пользователе на сервере. Сервер также генерирует уникальный идентификатор сессии (session ID) и отправляет его клиенту в виде cookie.
-
Хранение состояния: Состояние пользователя хранится на сервере, что позволяет серверу отслеживать, кто пользователь и какие у него права доступа.
-
Отправка session ID: При каждом последующем запросе клиент отправляет session ID в cookie, чтобы сервер мог идентифицировать сессию и предоставить соответствующий доступ.
-
Недостатки: Требует серверного хранилища для управления сессиями, что может быть проблематично при масштабировании, так как необходимо синхронизировать сессии между серверами.
Token-based аутентификация:
-
Создание токена: После успешной аутентификации сервер генерирует токен (например, JWT — JSON Web Token), который содержит информацию о пользователе и подписан сервером для обеспечения целостности.
-
Хранение токена: Токен хранится на клиенте, например, в localStorage или sessionStorage, и отправляется с каждым запросом в заголовке Authorization.
-
Без серверного состояния: Сервер не хранит состояние пользователя. Вместо этого он проверяет подпись токена и извлекает из него информацию о пользователе.
-
Преимущества: Легче масштабировать, так как не требует синхронизации состояния между серверами. Токены могут быть использованы для аутентификации в разных доменах и сервисах.
Пример кода для 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 аутентификация позволяет клиенту хранить токен и использовать его для доступа к защищенным ресурсам без необходимости постоянного обращения к серверу для проверки состояния сессии.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться