← Назад к вопросам

Чем занимался в компании?

1.0 Junior🔥 171 комментариев
#Soft Skills и рабочие процессы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое 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:

  1. Браузер сохраняет эту cookie локально
  2. JavaScript не видит её (document.cookie её не показывает)
  3. Браузер автоматически отправляет её в каждом HTTP-запросе к серверу
  4. Сервер может читать значение из заголовка 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

  1. Защита от XSS - JavaScript не может получить токен даже при компрометации
  2. Автоматическое отправление - не нужно вручную добавлять в заголовки
  3. Безопасное хранение - токены не лежат в localStorage или sessionStorage
  4. Стандартный подход - рекомендуется для токенов аутентификации

Недостатки

  1. Сложнее отладивать - JavaScript не может видеть значение
  2. CSRF уязвимость - нужно использовать SameSite флаг
  3. CORS проблемы - нужно правильно настроить credentials

Когда использовать

  • Токены аутентификации - ВСЕГДА используй HttpOnly
  • Сессионные ID - рекомендуется HttpOnly
  • Конфиденциальные данные - используй HttpOnly
  • Публичные данные (например, тема оформления) - можно без HttpOnly

Вывод

HttpOnly Cookies - это критичный механизм безопасности для хранения токенов аутентификации. Они защищают от XSS-атак, недоступны для JavaScript и автоматически отправляются с каждым запросом. Всегда используй HttpOnly=True для всех чувствительных данных, включая токены аутентификации и сессионные ID.