Sobes.tech
Назад к вопросам
Junior — Middle
57

Почему рекомендуется сохранять JSON Web Token в файле cookie вместо других способов хранения?

Компании, где спрашивали
ИнфоТехСервис

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Рекомендуют хранить JWT в cookie, потому что браузер может сам отправлять его на сервер, а cookie можно защитить флагами HttpOnly, Secure и SameSite. Это снижает риск кражи токена через XSS по сравнению с хранением в localStorage или sessionStorage. При этом важно помнить про защиту от CSRF, если cookie используется для аутентификации.

Определение:

JSON Web Token — это токен, который часто используют для подтверждения личности пользователя и передачи информации о сессии. Если хранить его в cookie, браузер автоматически прикладывает его к запросам на нужный домен. Дополнительные атрибуты cookie позволяют ограничить доступ к токену из JavaScript и уменьшить поверхность атаки.

Пример использования:

После логина сервер выдаёт JWT и отправляет его в cookie с флагами безопасности. При следующих запросах браузер автоматически передаёт cookie, а сервер проверяет токен и определяет пользователя.

from flask import Flask, request, make_response

app = Flask(__name__)

@app.post("/login")
def login():
    token = "eyJhbGciOi..."  # JWT, сгенерированный сервером
    resp = make_response({"status": "ok"})
    resp.set_cookie(
        "access_token",
        token,
        httponly=True,
        secure=True,
        samesite="Lax",
    )
    return resp

@app.get("/profile")
def profile():
    token = request.cookies.get("access_token")
    if not token:
        return {"error": "unauthorized"}, 401
    return {"user": "alice"}

Пояснение кода:

  1. На /login сервер формирует JWT после успешной аутентификации.
  2. Токен кладётся в cookie через set_cookie.
  3. Флаг httponly=True запрещает доступ к cookie из JavaScript, что защищает от кражи токена через XSS.
  4. Флаг secure=True означает, что cookie будет отправляться только по HTTPS.
  5. Флаг samesite="Lax" помогает уменьшить риск CSRF, ограничивая отправку cookie в кросс-сайтовых сценариях.
  6. На /profile сервер читает JWT из request.cookies и решает, авторизован ли запрос.

Ключевые моменты:

  • HttpOnly защищает токен от чтения через JavaScript.
  • Secure не даёт отправлять cookie по HTTP.
  • SameSite помогает снизить риск CSRF.
  • Браузер сам отправляет cookie, поэтому не нужно вручную добавлять токен в заголовки.
  • По сравнению с localStorage cookie обычно безопаснее от XSS-кражи токена, но требует отдельного внимания к CSRF.
  • Хранение в cookie удобно для классической серверной аутентификации и web-приложений.