HTTP-коэффициенты Как правильно создавать и парсить их

Опубликовано
HTTP-Куки: Как правильно создавать и парсить их 1
Реклама · УДАЛИТЬ?

HTTP-коэффициенты повсюду. Каждая сессия входа, корзина товаров и инструменты аналитики зависят от них. Тем не менее, большинство разработчиков копируют и вставляют заголовок и прекращают, не понимая, что делают атрибуты — или что происходит, когда они ошибаются. Set-Cookie Этот гайд охватывает анатомию куки, каждый значимый атрибут, как парсить строки куки и почему

является вашей защитой от CSRF. Если вы хотите сразу начать практиковать, попробуйте SameSite IO Tools Cookie Parser Cookie Builder или Что выглядит реальный куки.

Когда сервер хочет установить куки, он отправляет заголовок ответа:

Браузер сохраняет это и отправляет его обратно на последующие запросы как: Set-Cookie Это вся суть механизма. Сложность заключается в этих атрибутах.

Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Lax; Path=/; Max-Age=86400

Анатомия куки: разбор строки

Cookie: sessionId=abc123

Строка куки следует стандартному формату:

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

Атрибуты безопасности, которые вы должны правильно настроить

name=value; attribute1; attribute2=attributeValue; ...

The name=value HttpOnly Cookie предотвращает доступ JavaScript к куки через

. Это прямая защита от атак XSS, при которых куки сессии украдены.

Любая кука, которая аутентифицирует пользователя, должна иметь

HttpOnly . Нет хороших причин не делать этого. document.cookieозначает, что браузер отправляет куки только при HTTPS-соединениях. Без этого куки передаются в открытом виде при HTTP и могут быть перехвачены. В производственной среде сессионные куки всегда должны иметь

Set-Cookie: sessionId=abc123; HttpOnly

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

Безопасный

Secure управляет тем, когда браузер включает куки в запросы между сайтами. Это основная защита от атак CSRF. Три значения: Secure— куки никогда не отправляются при запросах между сайтами. Наиболее безопасно, но пользователи, кликнувшие по ссылке из письма, могут быть вылоггированы (куки не отправляются на первоначальном переходе). http://localhost— куки отправляются при переходах на верхнем уровне (запросы GET) с внешних сайтов, но не при встроенных запросах между сайтами или POST-запросах между сайтами. Это является стандартным поведением браузера для куки без явного атрибута

SameSite

SameSite .

  • Strict — куки отправляются на все запросы между сайтами. Необходимо для третьих сторон (OAuth-потоки, встроенные веб-компоненты). Должна быть связана с
  • Lax . Если вы отправляете SameSite , современные браузеры отклоняют куки полностью. Для большинства сессионных куки используйте
  • None — это сбалансирует безопасность и удобный процесс входа. Secure.
# Third-party / cross-site cookie (e.g., OAuth callback)
Set-Cookie: token=xyz; SameSite=None; Secure

Область: домен и путь SameSite=None без Secureатрибут указывает на домены, которые получают куки. SameSite=Lax С

куки отправляются на

Домен

The Domain и все поддомены (

Set-Cookie: user=alice; Domain=example.com

). Без атрибута Domain=example.comкуки отправляются только на точный источник, который их установил — не на поддомены. example.com Популярное заблуждение: установкаapi.example.com, app.example.comне ограничивает куки только для Domain . Оно расширяет область до поддоменов. Пропустите атрибут, если хотите, чтобы куки были для одного домена.

ограничивает пути, при которых куки отправляются. Domain=example.com Эта кука сопровождает запросы только к нет и путям ниже. Запрос к example.comне включает её. По умолчанию это

Путь

Path , что означает все пути.

Set-Cookie: adminToken=xyz; Path=/admin

Max-Age против Expires /admin Оба контролируют момент, когда куки истекают. Предпочитайте / или /api принимает абсолютную дату в формате HTTP даты. Это относится к календарному времени клиента, которое вы не контролируете. /принимает количество секунд от текущего момента:

на 24 часа. Относится к намерению сервера, а не к календарному времени клиента.

Когда оба присутствуют, Max-Age.

  • Expires принимает приоритет. Куки с ни одним из атрибутов — это
  • Max-Age сессионные куки Max-Age=86400 — они исчезают при закрытии браузера.

Справочник по атрибутам куки Max-Age Атрибут Что делает Блокирует доступ JavaScript к куки

Не установлено

Всегда установлено для куки аутентификацииПередача только при HTTPSПо умолчаниюРекомендация
HttpOnlyВсегда установлено в производственной средеУправляет передачей между сайтамиЛакс (современные браузеры)
SecureЛакс для сессий; Нет + Безопасный для сторонних кукиУправляет передачей между сайтамиУстанавливает область домена
SameSiteТолько текущий доменПропускайте, если не требуется доступ к поддоменамУстанавливает область пути
DomainОставляйте как /, если нужно изолировать токены администратораСекунды до истеченияСессионная кука
PathПредпочтение перед Expires/Абсолютная дата истечения
Max-AgeИспользуйте Max-Age вместо этогоУстановка куки в кодеNode.js (Express)
ExpiresPython (FastAPI)Установка куки в кодеРучное парсинг заголовка куки

заголовок, который получает сервер, содержит только

пары, разделённые

app.post('/login', (req, res) => {
  // ... verify credentials ...

  res.cookie('sessionId', token, {
    httpOnly: true,
    secure: process.env.NODE_ENV === 'production',
    sameSite: 'lax',
    maxAge: 86400 * 1000, // milliseconds in Express
    path: '/',
  });

  res.json({ ok: true });
});

Чтобы ручно разобрать его: разделите на

from fastapi import FastAPI, Response

app = FastAPI()

@app.post("/login")
def login(response: Response):
    # ... verify credentials ...

    response.set_cookie(
        key="sessionId",
        value=token,
        httponly=True,
        secure=True,
        samesite="lax",
        max_age=86400,
        path="/",
    )
    return {"ok": True}

(точка-запятая + пробел), затем разделите каждую пару на

The Cookie первое name=value только. Значимые случаи, которые стоит знать: ; :

Cookie: sessionId=abc123; theme=dark; lang=en

Значения могут содержать ; (-- строки на основе base64, которые часто используются) — всегда разделяйте на первое только = Названия куки чувствительны к регистру

  • Пробелы вокруг разделителя могут варьироваться — обрезайте обе стороны с осторожностью = Вместо того чтобы писать собственную логику разделения, используйте = для декодирования любого
  • заголовка и проверки каждого значения, или
  • IO Tools Cookie Builder

для построения корректного Cookie Builder заголовка с правильными атрибутами. Cookie Куки и CSRF Атака Cross-Site Request Forgery использует тот факт, что браузеры автоматически включают куки при запросах к домену, даже если запрос инициирован другим сайтом. Малоугрозный сайт на может отправить форму на Set-Cookie , и если пользователь вошёл, браузер отправляет свой токен сессии вместе с поддельным запросом.

побеждает большинство векторов CSRF, потому что запросы между сайтами — типичный паттерн атаки — не включают куки.

ещё более тщательно, но может повлиять на удобство использования. evil.com Токены CSRF остаются действительными как дополнительная защита, особенно для высокоставших операций и когда bank.com/transferтребуется для контекста сторонних сервисов. Две защиты дополняют друг друга.

SameSite=Lax HTTP-куки: как правильно создавать и парсить их 2 SameSite=Strict HTTP-куки: как правильно создавать и парсить их 1

Токены CSRF остаются действительными как дополнительная защита, особенно для высокорисковых операций и при SameSite=None необходимости для контекста сторонних сервисов. Две защиты дополняют друг друга.

Хотите убрать рекламу? Откажитесь от рекламы сегодня

Установите наши расширения

Добавьте инструменты ввода-вывода в свой любимый браузер для мгновенного доступа и более быстрого поиска

в Расширение Chrome в Расширение края в Расширение Firefox в Расширение Opera

Табло результатов прибыло!

Табло результатов — это интересный способ следить за вашими играми, все данные хранятся в вашем браузере. Скоро появятся новые функции!

Реклама · УДАЛИТЬ?
Реклама · УДАЛИТЬ?
Реклама · УДАЛИТЬ?

новости с техническими моментами

Примите участие

Помогите нам продолжать предоставлять ценные бесплатные инструменты

Купи мне кофе
Реклама · УДАЛИТЬ?