Cookie и session безопасность

Protractor, как инструмент для автоматизированного тестирования веб-приложений на базе Angular и не только, предоставляет удобные механизмы работы с браузерными cookies и сессиями. Правильное управление этими данными критично для обеспечения стабильности тестов, а также для проверки аспектов безопасности приложения.


В Protractor доступ к cookie осуществляется через объект browser.manage().getCookie(), browser.manage().addCookie(), browser.manage().deleteCookie() и другие методы. Основные моменты:

  1. Чтение Cookie
const myCookie = await browser.manage().getCookie('session_id');
console.log(myCookie.value);
  • Метод getCookie(name) возвращает объект с информацией о cookie: name, value, path, domain, secure, expiry.
  • getCookies() возвращает массив всех cookie, доступных текущему домену.
  1. Добавление Cookie
await browser.manage().addCookie({
  name: 'test_cookie',
  value: '123456',
  path: '/',
  secure: true
});
  • secure: true гарантирует передачу cookie только по HTTPS.
  • httpOnly в браузерах управляется сервером, но важно учитывать его наличие при тестировании сессий.
  1. Удаление Cookie
await browser.manage().deleteCookie('test_cookie');
await browser.manage().deleteAllCookies();
  • Удаление конкретного cookie позволяет проверить корректное завершение сессии.
  • Полное удаление всех cookie часто используется для сброса состояния между тестами.

Управление сессиями

Сессии веб-приложений чаще всего связаны с cookie (например, session_id) или с токенами в localStorage/sessionStorage. Protractor позволяет управлять этими хранилищами:

  1. Очистка сессий
await browser.executeScript('window.sessionStorage.clear();');
await browser.executeScript('window.localStorage.clear();');
  • Очистка sessionStorage и localStorage гарантирует независимость тестов и предотвращает “утечку” состояния между ними.
  1. Симуляция авторизации через сессии

Иногда тесты требуют авторизованного состояния без прохождения UI-логина. Это достигается добавлением нужных cookie или токенов:

await browser.manage().addCookie({ name: 'auth_token', value: 'abcdef12345' });
await browser.get('/dashboard');
  • Такой подход ускоряет тесты и проверяет поведение приложения для авторизованных пользователей.

  1. Secure и HttpOnly
  • secure: true – cookie передается только по HTTPS.
  • httpOnly – cookie недоступно через JavaScript, что предотвращает XSS-атаки. Для тестов нужно учитывать, что Protractor не может напрямую модифицировать httpOnly cookie.
  1. Срок жизни cookie
  • Параметр expiry задает время жизни cookie. Тесты могут проверять корректное завершение сессии при истечении времени:
await browser.manage().addCookie({
  name: 'short_lived',
  value: 'test',
  expiry: Math.floor(Date.now() / 1000) + 5 // истечет через 5 секунд
});
  • Это позволяет автоматизировать проверку функциональности “автоматического выхода”.
  1. Изоляция тестов
  • Использование deleteAllCookies() перед каждым тестом предотвращает межтестовое взаимодействие и повышает надежность результатов.
  • Для сложных сценариев можно комбинировать очистку cookie с очисткой sessionStorage и localStorage.

Практические советы

  • Локализация проблем сессий: при нестабильных тестах проверка наличия нужных cookie и их значений помогает выявить ошибки.
  • Эмуляция различных браузерных политик: можно тестировать поведение приложения с cookie без secure или с разными доменами.
  • Тестирование безопасности: автоматизированно проверять, что cookie не доступны через JavaScript, что защищено HTTPS и что при удалении cookie сессия корректно завершается.

Примеры комплексного сценария

describe('Тестирование сессий', () => {
  beforeEach(async () => {
    await browser.manage().deleteAllCookies();
    await browser.executeScript('window.sessionStorage.clear();');
  });

  it('должен авторизовать пользователя через cookie', async () => {
    await browser.manage().addCookie({ name: 'auth_token', value: 'secure123', secure: true });
    await browser.get('/dashboard');
    const url = await browser.getCurrentUrl();
    expect(url).toContain('/dashboard');
  });

  it('должен завершать сессию после удаления cookie', async () => {
    await browser.manage().addCookie({ name: 'session_id', value: 'abc123' });
    await browser.manage().deleteCookie('session_id');
    await browser.get('/dashboard');
    const url = await browser.getCurrentUrl();
    expect(url).toContain('/login');
  });
});
  • Сценарий демонстрирует безопасное добавление, проверку и удаление cookie, а также управление состоянием сессии через Protractor.

Эффективное управление cookie и сессиями позволяет создавать стабильные тесты, проверять авторизацию и безопасность, а также эмулировать различные сценарии пользовательского взаимодействия без риска нарушить работу приложения.