Модуль Apache mod_session
| Описание: | Поддержка сеансов |
|---|---|
| Статус: | Расширение |
| Идентификатор модуля: | session_module |
| Исходный файл: | mod_session.c |
| Совместимость: | Доступен в Apache 2.3 и более поздних версиях |
Краткое описание
Предупреждение
Модули сеансов используют файлы cookie HTTP и поэтому могут подвергаться атакам межсайтового скриптинга или раскрывать клиентам потенциально конфиденциальную информацию. Прежде чем включать поддержку сеансов на сервере, убедитесь, что учтены соответствующие риски.
Этот модуль предоставляет поддержку интерфейса сеансов для отдельных пользователей на уровне всего сервера. Сеансы можно использовать для отслеживания того, вошёл ли пользователь в систему, а также для хранения другой информации о пользователе, которая должна оставаться доступной в течение нескольких запросов.
Сеансы могут храниться на сервере или в браузере. Для повышения безопасности их также можно шифровать. Эти возможности реализованы в нескольких модулях помимо 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 можно настроить для отслеживания сеансов отдельных пользователей, хранящихся на определённом сервере или группе серверов. Эта возможность аналогична сеансам, доступным в типичных серверах приложений.
Если эта возможность настроена, отслеживание сеансов выполняется с помощью идентификатора сеанса, который хранится в cookie или извлекается из параметров в строке запроса URL, как в типичном запросе GET.
Поскольку содержимое сеанса хранится исключительно на сервере, предполагается, что оно является конфиденциальным. Однако при большом количестве сеансов или необходимости совместного использования сеансов множеством веб-серверов это влияет на производительность и потребление ресурсов.
Модуль mod_session_dbd позволяет хранить сеансы пользователей в базе данных SQL с помощью mod_dbd.
Хранение сеансов в браузере
В средах с высокой нагрузкой, где отслеживание сеансов на сервере требует слишком много ресурсов или неудобно, содержимое сеанса можно хранить в cookie браузера клиента.
Преимущество этого подхода в том, что для отслеживания сеансов серверу требуется минимум ресурсов, а серверам в ферме не нужно обмениваться информацией о сеансах.
Однако содержимое сеанса становится доступным клиенту, что создаёт соответствующий риск нарушения конфиденциальности. Модуль mod_session_crypto можно настроить для шифрования содержимого сеанса перед его отправкой клиенту.
Модуль mod_session_cookie позволяет хранить сеансы пользователей в браузере в cookie HTTP.
Основные примеры
Создать сеанс так же просто, как включить его и выбрать место хранения. В этом примере сеанс будет храниться в браузере в cookie под названием 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.
Конфиденциальность сеанса
Используя функцию браузера «Показать cookie», вы увидите текстовое представление сеанса. Это может стать проблемой, если конечный пользователь не должен знать содержимое сеанса или если третья сторона может получить несанкционированный доступ к данным в сеансе.
Перед сохранением в браузере содержимое сеанса можно зашифровать с помощью модуля mod_session_crypto.
Зашифрованный сеанс на основе браузера
Session On SessionCryptoPassphrase secret SessionCookieName session path=/
Apache автоматически расшифровывает сеанс при загрузке и шифрует его при сохранении. Приложению, использующему сеанс, не нужно знать о выполняемом шифровании.
Сеансы, хранящиеся на сервере, а не в браузере, также можно шифровать при необходимости. Это позволяет обеспечить конфиденциальность при обмене потенциально чувствительной информацией между веб-серверами фермы с помощью модуля mod_session_dbd.
Конфиденциальность cookie
Механизм cookie HTTP также предоставляет возможности для защиты конфиденциальности, например возможность ограничить передачу cookie только страницами, защищёнными SSL, или запретить JavaScript в браузере получать доступ к содержимому cookie.
Предупреждение
Некоторые возможности защиты конфиденциальности cookie HTTP либо не являются стандартными, либо поддерживаются браузерами непоследовательно. Модули сеансов позволяют задавать параметры cookie, но не гарантируют, что браузер обеспечит конфиденциальность. Если безопасность имеет значение, используйте mod_session_crypto для шифрования содержимого сеанса или храните сеанс на сервере с помощью модуля mod_session_dbd.
Стандартные параметры cookie можно указать после имени cookie, как в приведённом ниже примере.
Настройка параметров cookie
Session On SessionCryptoPassphrase secret SessionCookieName session path=/private;domain=example.com;httponly;secure;
Если сервер Apache служит интерфейсом для внутренних исходных серверов, входящие заголовки HTTP можно очистить от cookie сеанса с помощью директивы SessionCookieRemove. Это не позволяет внутреннему серверу получить доступ к содержимому cookie сеанса.
Поддержка сеансов для аутентификации
Как и во многих серверах приложений, модули аутентификации могут использовать сеанс для хранения имени пользователя и пароля после входа в систему. Модуль 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и соответствующей конфигурацией. - Автономные приложения
- Приложения могут изменять сеанс без участия HTTP-сервера 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 в cookie 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 в cookie 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