Что такое токен и для чего он используется в веб-безопасности и API?

«Что такое токен и для чего он используется в веб-безопасности и API?» — вопрос из категории Тестирование безопасности, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Токен — это цифровой ключ (строка символов), который выдается для подтверждения прав доступа (аутентификации/авторизации) вместо постоянных учетных данных, таких как логин и пароль.

Основные цели использования:

  1. Аутентификация сессии:

    • После успешного ввода пароля сервер выдает клиенту токен доступа (например, JWT — JSON Web Token).
    • Клиент отправляет этот токен в заголовке каждого последующего запроса:
      Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
  2. Повышение безопасности:

    • Ограниченное время жизни: Токены имеют срок действия (expiry), что снижает риски при утечке.
    • Отсутствие хранения пароля на клиенте: Не нужно постоянно передавать пароль.
    • Делегирование прав (OAuth 2.0): Токены могут предоставлять доступ к определенным ресурсам (scope) без раскрытия пароля пользователя стороннему приложению.
  3. Защита от 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 (токенизация данных карт).