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) |
Expires | Python (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 необходимости для контекста сторонних сервисов. Две защиты дополняют друг друга.
Установите наши расширения
Добавьте инструменты ввода-вывода в свой любимый браузер для мгновенного доступа и более быстрого поиска
恵 Табло результатов прибыло!
Табло результатов — это интересный способ следить за вашими играми, все данные хранятся в вашем браузере. Скоро появятся новые функции!
Подписаться на новости
все Новые поступления
всеОбновлять: Наш последний инструмент was added on Май 22, 2026
