Spec-Zone.ru › Apache HTTP Server

Модуль Apache mod_session

Описание: Поддержка сессий
Статус: Расширение
Идентификатор модуля: session_module
Файл исходного кода: mod_session.c
Совместимость: Доступен в Apache 2.3 и более поздних версиях

Краткое описание

Предупреждение

Модули сессий используют HTTP-куки, и, следовательно, могут стать жертвами атак типа Cross-Site Scripting или раскрыть потенциально конфиденциальную информацию клиентам. Пожалуйста, убедитесь, что соответствующие риски учтены перед включением функциональности сессий на вашем сервере.

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

Сессии могут храниться на сервере или в браузере. Сессии также могут быть необязательно зашифрованы для повышения безопасности. Эти функции разделены на несколько модулей помимо mod_session; mod_session_crypto, mod_session_cookie и mod_session_dbd. В зависимости от требований сервера загружайте соответствующие модули на сервер (статически во время компиляции или динамически через директиву LoadModule).

Сессии могут быть обработаны другими модулями, зависящими от сессии, или сессия может быть прочитана и записана с использованием переменных окружения и HTTP-заголовков, по мере необходимости.

Что такое сессия?

В основе интерфейса сессий лежит таблица пар «ключ-значение», которые доступны в запросах браузера. Эти пары могут быть установлены на любую допустимую строку, в соответствии с потребностями приложения, использующего сессию.

«Сессия» — это строка application/x-www-form-urlencoded, содержащая эти пары «ключ-значение», как определено в спецификации HTML.

Сессия необязательно может быть зашифрована и закодирована в base64 перед записью в механизм хранения, как определено администратором.

Кто может использовать сессию?

Интерфейс сессии в первую очередь разработан для использования другими модулями сервера, такими как mod_auth_form, однако приложения на основе CGI могут получить доступ к содержимому сессии через переменную окружения HTTP_SESSION. Сессии могут быть изменены и/или обновлены путем вставки в HTTP-ответ заголовка с новыми параметрами сессии.

Хранение сессий на сервере

Apache может быть настроен на отслеживание сессий каждого пользователя, хранящихся на конкретном сервере или группе серверов. Эта функциональность похожа на сессии в типичных приложениях-серверах.

При настройке сессии отслеживаются с помощью идентификатора сессии, хранящегося в куки или извлечённого из параметров, вставленных в строку запроса URL, как в типичном запросе GET.

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

Модуль mod_session_dbd позволяет хранить сессии пользователей в базе данных SQL через mod_dbd.

Хранение сессий в браузере

В средах с высокой нагрузкой, где отслеживание сессий на сервере слишком ресурсоёмко или неудобно, существует возможность хранить содержимое сессии в куки на клиентском браузере вместо этого.

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

Однако содержимое сессии открыто для клиента, что влечёт за собой соответствующий риск нарушения конфиденциальности. Модуль mod_session_crypto может быть настроен на шифрование содержимого сессии перед записью сессии клиенту.

Модуль mod_session_cookie позволяет хранить сессии пользователей в браузере в HTTP-куках.

Основные примеры

Создание сессии так же просто, как включение сессии и выбор места хранения сессии. В данном примере сессия будет храниться в браузере в куки под названием session.

Сессия на базе браузера

Session On
SessionCookieName session path=/

Сессия бесполезна, если ею нельзя воспользоваться для записи или чтения. Следующий пример показывает, как можно ввести значения в сессию с помощью заранее определенного HTTP-заголовка ответа под названием X-Replace-Session.

Запись в сессию

Session On
SessionCookieName session path=/
SessionHeader X-Replace-Session

Заголовок должен содержать пары «имя-значение», выраженные в том же формате, что и строка запроса в URL, как в примере ниже. Установка ключа в пустую строку эквивалентна удалению этого ключа из сессии.

CGI для записи в сессию

#!/bin/bash
echo "Content-Type: text/plain"
echo "X-Replace-Session: key1=foo&key2=&key3=bar"
echo
env

При необходимости сессия может быть считана из переменной окружения HTTP_SESSION. По умолчанию сессия конфиденциальна, поэтому это нужно явно включить с помощью директивы SessionEnv.

Чтение из сессии

Session On
SessionEnv On
SessionCookieName session path=/
SessionHeader X-Replace-Session

После чтения переменная CGI HTTP_SESSION должна содержать значение key1=foo&key3=bar.

Конфиденциальность сессии

Используя функцию «Показать куки» в браузере, вы увидели бы текстовое представление сессии. Это может стать проблемой, если пользователю нужно скрыть содержимое сессии или если у третьих лиц будет несанкционированный доступ к данным в сессии.

Содержимое сессии необязательно можно зашифровать перед размещением в браузере с помощью модуля mod_session_crypto.

Зашифрованная сессия на базе браузера

Session On
SessionCryptoPassphrase secret
SessionCookieName session path=/

Сессия автоматически расшифруется при загрузке и шифруется при сохранении Apache, приложению, использующему сессию, не нужно знать, что происходит шифрование.

Сессии, хранящиеся на сервере, а не в браузере, также могут быть зашифрованы по мере необходимости, обеспечивая конфиденциальность, когда потенциально конфиденциальная информация обменивается между веб-серверами в ферме серверов с использованием модуля mod_session_dbd.

Конфиденциальность куки

Механизм HTTP-куки также предлагает функции конфиденциальности, такие как возможность ограничить передачу куки только защищенными SSL страницами или предотвратить доступ браузерного JavaScript к содержимому куки.

Предупреждение

Некоторые из функций конфиденциальности HTTP-куки являются либо нестандартными, либо не реализованы последовательно в различных браузерах. Модули сессий позволяют устанавливать параметры куки, но не гарантируют, что конфиденциальность будет соблюдена браузером. Если безопасность является проблемой, используйте mod_session_crypto для шифрования содержимого сессии или храните сессию на сервере с помощью модуля mod_session_dbd.

Стандартные параметры куки можно указать после имени куки, как в примере ниже.

Установка параметров куки

Session On
SessionCryptoPassphrase secret
SessionCookieName session path=/private;domain=example.com;httponly;secure;

В случаях, когда веб-сервер Apache выступает в качестве фронтэнда для серверов-источников бэкэнда, можно удалить куки сессии из входящих HTTP-заголовков с помощью директивы SessionCookieRemove. Это предотвращает доступ к содержимому куки сессии на сервере бэкэнда.

Поддержка сессий для аутентификации

Как и во многих приложениях-серверах, модули аутентификации могут использовать сессию для хранения имени пользователя и пароля после входа в систему. Модуль mod_auth_form сохраняет имя пользователя и пароль пользователя в сессии.

Аутентификация по форме

Session On
SessionCryptoPassphrase secret
SessionCookieName session path=/
AuthFormProvider file
AuthUserFile "conf/passwd"
AuthType form
AuthName "realm"
#...

См. модуль mod_auth_form для документации и полных примеров.

Интеграция сессий с внешними приложениями

Чтобы сессии были полезны, необходимо возможность обмена содержимым сессии с внешними приложениями и возможность внешнему приложению записывать собственную сессию.

Типичным примером может быть приложение, которое изменяет пароль пользователя, установленный mod_auth_form. Это приложение должно прочитать текущее имя пользователя и пароль из сессии, внести необходимые изменения в пароль пользователя и записать новый пароль в сессию, чтобы обеспечить плавный переход к новому паролю.

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

Модули Apache
Модули на сервере, которым требуется доступ к сессии, могут использовать API mod_session.h для чтения и записи в сессию. Этот механизм используется модулями, такими как mod_auth_form.
CGI-программы и языки сценариев
Приложения, выполняемые в веб-сервере, могут получить значение сессии из переменной окружения HTTP_SESSION. Сессия должна быть закодирована как строка application/x-www-form-urlencoded, как описано в спецификации HTML. Переменная окружения контролируется настройкой директивы SessionEnv . Сценарий может записать сессию, вернув ответный заголовок application/x-www-form-urlencoded с именем, заданным директивой SessionHeader. В обоих случаях все шифрование или дешифрование и чтение/запись сессии в выбранный механизм хранения обрабатываются модулями mod_session и соответствующей конфигурацией.
Приложения за mod_proxy
Если используется директива SessionHeader для определения заголовка HTTP-запроса, сессия, закодированная как строка application/x-www-form-urlencoded, будет доступна приложению. Если тот же заголовок предоставляется в ответе, значение этого заголовка ответа будет использоваться для замены сессии. Как и выше, все шифрование или дешифрование и чтение/запись сессии в выбранный механизм хранения обрабатываются модулями mod_session и соответствующей конфигурацией.
Автономные приложения
Приложения могут выбрать обработку сессии вне контроля веб-сервера Apache. В этом случае приложение отвечает за чтение сессии из выбранного механизма хранения, дешифрование сессии, обновление сессии, шифрование сессии и запись сессии в выбранный механизм хранения, по мере необходимости.

Директива Session

Описание: Включает сеанс для текущей директории или расположения
Синтаксис:
Session On|Off
Значение по умолчанию:
Session Off
Контекст: настройка сервера, виртуальный хост, директория, .htaccess
Переопределение: AuthConfig
Статус: Расширение
Модуль: mod_session

Директива Session включает сеанс для контейнера директории или расположения. Дополнительные директивы управляют тем, где будет храниться сеанс и как поддерживается конфиденциальность.

Директива SessionEnv

Описание: Управление тем, записываются ли содержимое сеанса в переменную окружения HTTP_SESSION
Синтаксис:
SessionEnv On|Off
Значение по умолчанию:
SessionEnv Off
Контекст: настройка сервера, виртуальный хост, директория, .htaccess
Переопределение: AuthConfig
Статус: Расширение
Модуль: mod_session

Если установлено значение On, директива SessionEnv заставляет содержимое сеанса записываться в переменную окружения CGI под названием HTTP_SESSION.

Строка записывается в формате запроса URL, например:

key1=foo&key3=bar

Директива SessionExclude

Описание: Определение префиксов URL, для которых сеанс игнорируется
Синтаксис:
SessionExclude path
Значение по умолчанию: none
Контекст: настройка сервера, виртуальный хост, директория, .htaccess
Статус: Расширение
Модуль: mod_session

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

Предупреждение

Эта директива имеет сходное назначение с атрибутом path в HTTP-куках, но не следует путать их. Данная директива не устанавливает атрибут path, который необходимо настроить отдельно.

Директива SessionExpiryUpdateInterval

Описание: Определение количества секунд, в течение которых срок действия сеанса может измениться без обновления сеанса
Синтаксис:
SessionExpiryUpdateInterval interval
Значение по умолчанию:
SessionExpiryUpdateInterval 0 (always update)
Контекст: настройка сервера, виртуальный хост, директория, .htaccess
Статус: Расширение
Модуль: mod_session
Совместимость: Доступно в Apache 2.4.41 и более поздних версиях

Директива SessionExpiryUpdateInterval позволяет сеансам избежать затрат, связанных с записью сеанса в каждом запросе, когда изменилось только время истечения срока действия. Это может быть использовано для повышения эффективности сайта или уменьшения нагрузки на базу данных при использовании mod_session_dbd. Сеанс всегда записывается, если данные, хранящиеся в сеансе, изменились или срок действия изменился более чем на заданный интервал.

Установка интервала в ноль отключает эту директиву, и срок действия сеанса обновляется для каждого запроса.

Эта директива действует только в сочетании с SessionMaxAge для включения срока действия сеанса. Сеансы без срока действия записываются только при изменении данных, хранящихся в сеансе.

Предупреждение

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

Директива SessionHeader

Описание: Импорт обновлений сеанса из заданного HTTP-заголовка ответа
Синтаксис:
SessionHeader header
Значение по умолчанию: none
Контекст: настройка сервера, виртуальный хост, директория, .htaccess
Переопределение: AuthConfig
Статус: Расширение
Модуль: mod_session

Директива SessionHeader определяет имя HTTP-заголовка ответа, который, если присутствует, будет обработан и записан в текущий сеанс.

Значение заголовка должно быть в формате запроса URL, например:

key1=foo&key2=&key3=bar

Где ключ установлен в пустую строку, этот ключ будет удален из сеанса.

Директива SessionInclude

Описание: Определение префиксов URL, для которых сеанс действителен
Синтаксис:
SessionInclude path
Значение по умолчанию:
all URLs
Контекст: настройка сервера, виртуальный хост, директория, .htaccess
Переопределение: AuthConfig
Статус: Расширение
Модуль: mod_session

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

Предупреждение

Эта директива имеет сходное назначение с атрибутом path в HTTP-куках, но не следует путать их. Данная директива не устанавливает атрибут path, который необходимо настроить отдельно.

Директива SessionMaxAge

Описание: Определение максимального срока действия сеанса в секундах
Синтаксис:
SessionMaxAge maxage
Значение по умолчанию:
SessionMaxAge 0
Контекст: настройка сервера, виртуальный хост, директория, .htaccess
Переопределение: AuthConfig
Статус: Расширение
Модуль: mod_session

Директива SessionMaxAge определяет временной лимит, в течение которого сеанс будет оставаться действительным. При сохранении сеанса этот лимит сбрасывается, и можно продолжить существующий сеанс. Если сеанс станет старше этого лимита без запроса к серверу для обновления сеанса, сеанс истечёт и будет удалён. В случае использования сеанса для хранения данных входа в систему пользователя, это приводит к автоматическому выходу пользователя после заданного времени.

Установка maxage в ноль отключает срок действия сеанса.

© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/mod/mod_session.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API