Чем занимался в компании?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое HttpOnly Cookies
HttpOnly Cookies - это механизм безопасности для хранения чувствительных данных (обычно токенов аутентификации) в браузере. Это флаг, который устанавливается при создании cookie и ограничивает доступ к ней.
Основное определение
HttpOnly Cookie - это cookie, у которой установлен флаг HttpOnly, что означает, что она недоступна для JavaScript кода (document.cookie) и может быть передана только в HTTP-запросах к серверу. Это защита от XSS-атак (Cross-Site Scripting).
Как работают обычные Cookies
Обычные cookies доступны из JavaScript:
// Чтение всех cookies
console.log(document.cookie);
// Output: sessionId=abc123; userId=456; theme=dark
// Установка cookie
document.cookie = 'token=mytoken123';
Это опасно, потому что если код на странице скомпрометирован (XSS), атакующий может получить доступ к cookies.
HttpOnly Cookies
HttpOnly cookies не доступны из JavaScript. Они автоматически отправляются вместе с HTTP-запросами, но JavaScript не может их читать или изменять:
// Попытка доступа к HttpOnly cookie из JavaScript
console.log(document.cookie);
// HttpOnly cookies не будут показаны!
// Невозможно установить HttpOnly cookie из JavaScript
document.cookie = 'HttpOnly=value'; // Не сработает
Как устанавливать HttpOnly Cookies
HttpOnly cookies должны быть установлены только с сервера в заголовке Set-Cookie:
Python (FastAPI или Flask)
// FastAPI пример
from fastapi import FastAPI
from fastapi.responses import JSONResponse
app = FastAPI()
@app.post('/login')
async def login():
response = JSONResponse({'status': 'ok'})
response.set_cookie(
key='authToken',
value='your-secret-token-here',
httponly=True, # Главный флаг!
secure=True, # Только HTTPS
samesite='Strict', # CSRF защита
max_age=3600 # Время жизни в секундах
)
return response
Node.js (Express)
app.post('/login', (req, res) => {
res.cookie('authToken', 'your-secret-token', {
httpOnly: true, // Флаг HttpOnly
secure: true, // Только HTTPS
sameSite: 'strict', // CSRF защита
maxAge: 3600000 // Время жизни в миллисекундах
});
res.json({ status: 'ok' });
});
HTTP заголовок (сырой пример)
SET-COOKIE: authToken=abc123def456; HttpOnly; Secure; SameSite=Strict; Max-Age=3600
Как браузер обрабатывает HttpOnly Cookies
Когда установлена HttpOnly cookie:
- Браузер сохраняет эту cookie локально
- JavaScript не видит её (document.cookie её не показывает)
- Браузер автоматически отправляет её в каждом HTTP-запросе к серверу
- Сервер может читать значение из заголовка Cookie
// На клиенте
fetch('/api/protected')
.then(response => response.json())
// HttpOnly cookie автоматически отправилась с запросом!
// На сервере
@app.get('/api/protected')
def protected(request: Request):
token = request.cookies.get('authToken')
# Токен получен из HttpOnly cookie
return {'data': 'secret'}
Флаги безопасности для HttpOnly Cookies
Obычно HttpOnly cookies используются с дополнительными флагами:
response.set_cookie(
key='authToken',
value='token123',
httpOnly=True, # Недоступна для JavaScript
secure=True, # Передается только по HTTPS
samesite='Strict', # Защита от CSRF
path='/', # Путь, где доступна cookie
domain='.example.com', # Домен, где доступна cookie
max_age=3600 # Время жизни
)
HttpOnly vs Secure vs SameSite
HttpOnly
- Защита от XSS-атак
- JavaScript не может получить доступ
- Передается только в HTTP-запросах
Secure
- Передается только по HTTPS
- Защита от Man-in-the-Middle атак
- В production всегда должна быть True
SameSite
- Защита от CSRF-атак (Cross-Site Request Forgery)
- Значения: Strict, Lax, None
Пример: Безопасная схема аутентификации
// 1. Пользователь логинится
fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email: 'user@example.com', password: '...' })
})
.then(res => res.json())
.then(data => {
// Сервер установил HttpOnly cookie
// В response нет токена (он в HttpOnly cookie)
console.log('Logged in successfully');
});
// 2. При запросе защищенного ресурса
fetch('/api/protected')
// HttpOnly cookie автоматически отправилась!
.then(res => res.json())
.then(data => console.log(data));
// 3. На сервере
@app.post('/login')
async def login(credentials: LoginRequest):
# Проверяем учетные данные
user = authenticate(credentials)
response = JSONResponse({'message': 'logged in'})
# Устанавливаем HttpOnly cookie вместо возврата токена
response.set_cookie(
key='authToken',
value=generate_token(user),
httpOnly=True,
secure=True,
samesite='Strict'
)
return response
@app.get('/api/protected')
async def protected(request: Request):
# Читаем HttpOnly cookie
token = request.cookies.get('authToken')
user = verify_token(token)
return {'data': 'secret information'}
Преимущества HttpOnly Cookies
- Защита от XSS - JavaScript не может получить токен даже при компрометации
- Автоматическое отправление - не нужно вручную добавлять в заголовки
- Безопасное хранение - токены не лежат в localStorage или sessionStorage
- Стандартный подход - рекомендуется для токенов аутентификации
Недостатки
- Сложнее отладивать - JavaScript не может видеть значение
- CSRF уязвимость - нужно использовать SameSite флаг
- CORS проблемы - нужно правильно настроить credentials
Когда использовать
- Токены аутентификации - ВСЕГДА используй HttpOnly
- Сессионные ID - рекомендуется HttpOnly
- Конфиденциальные данные - используй HttpOnly
- Публичные данные (например, тема оформления) - можно без HttpOnly
Вывод
HttpOnly Cookies - это критичный механизм безопасности для хранения токенов аутентификации. Они защищают от XSS-атак, недоступны для JavaScript и автоматически отправляются с каждым запросом. Всегда используй HttpOnly=True для всех чувствительных данных, включая токены аутентификации и сессионные ID.