Ответ
Токен — это цифровой ключ (строка символов), который выдается для подтверждения прав доступа (аутентификации/авторизации) вместо постоянных учетных данных, таких как логин и пароль.
Основные цели использования:
-
Аутентификация сессии:
- После успешного ввода пароля сервер выдает клиенту токен доступа (например, JWT — JSON Web Token).
- Клиент отправляет этот токен в заголовке каждого последующего запроса:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
-
Повышение безопасности:
- Ограниченное время жизни: Токены имеют срок действия (expiry), что снижает риски при утечке.
- Отсутствие хранения пароля на клиенте: Не нужно постоянно передавать пароль.
- Делегирование прав (OAuth 2.0): Токены могут предоставлять доступ к определенным ресурсам (scope) без раскрытия пароля пользователя стороннему приложению.
-
Защита от CSRF (Cross-Site Request Forgery):
- Используются специальные токены, которые проверяются на сервере для подтверждения легитимности запроса с формы.
Пример работы с JWT в Python (PyJWT):
import jwt
import datetime
# Секретный ключ (должен храниться безопасно на сервере)
SECRET_KEY = 'your-secret-key'
# 1. Генерация токена с полезной нагрузкой (payload) и сроком действия
payload = {
'user_id': 123,
'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1) # срок действия
}
token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
print(f"JWT Token: {token}")
# 2. Проверка и декодирование токена на сервере
try:
decoded_payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
print(f"Decoded payload: {decoded_payload}") # {'user_id': 123, 'exp': ...}
except jwt.ExpiredSignatureError:
print("Token has expired.")
except jwt.InvalidTokenError:
print("Invalid token.")
Типы токенов: Access Token (для доступа к API), Refresh Token (для обновления Access Token), CSRF Token, Payment Token (токенизация данных карт).