Как «Помни меня» работает в Spring Security? - PullRequest
12 голосов
/ 29 июня 2010

Мне интересно, как работает функция «Помни меня» и как она работает в Spring Security?

Я понимаю, что сервер отправляет долгоживущие куки клиенту. И тогда клиент отправляет cookie обратно, и сервер может распознать клиента, потому что на сервере есть что-то вроде hash-map со связями cookie --> session.

Я не понимаю, как сервер [серверное приложение] распознает клиента по cookie после перезапуска сервера [Tomcat].

Как и где Spring Security сохраняет cookie-session карту перед отключением сервера? Это зависит от сервера (то есть что-то другое происходит в Tomcat, Jetty и т. Д.)?

P.S. Еще одна проблема, связанная с Spring Security и повторным развертыванием: даже если я не отмечу RememberMe и войду в систему, я все еще узнаю после повторного развертывания в течение 3 минут. Это поправимо?

Ответы [ 2 ]

12 голосов
/ 29 июня 2010

В документации Spring Security обсуждается, как это на самом деле работает.

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

base64(username + ":" + expirationTime + ":" + md5Hex(username + ":" + expirationTime + ":" password + ":" + key))

...

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

Как правило, файл cookie содержит имя пользователя, пароль, время истечения срока действия и ключ (который вы указываете), все из которых хешированы вместе. Когда ваш браузер отправляет содержимое этого файла cookie на сервер, Spring Security:

  1. Извлекает пароль из бэкэнда для данного имени пользователя
  2. Вычисляет md5Hex() имени пользователя / пароля / и т. Д. Из базы данных и сравнивает его со значением в cookie
  3. Если они совпадают - вы вошли! Если нет совпадения, значит, вы указали поддельный файл cookie или один из имени пользователя / пароля / ключа был изменен.

Основное предположение здесь заключается в том, что хеш-функция - md5Hex() часть выше - обеспечивает способ легко кодировать часть данных в одном направлении, но невероятно сложно и непрактично повернуть (восстановить пароль из * 1030). * текст).

10 голосов
/ 29 июня 2010

Не путайте сессионные куки с куки Запомнить меня.

Файл cookie сеанса отправляется сервером (например, Tomcat) и используется для связи входящего запроса с сеансом.

Помните, что cookie отправляет Spring Security для проверки подлинности клиента в различных сеансах (например, после истечения исходного сеанса или после перезапуска сервера).

Для проверки подлинности пользователя с помощью Запомнить меняCookie Spring Security предоставляет 2 стратегии:

  • TokenBasedRememberMeServices - используется по умолчанию, менее безопасно - cookie содержит хэш пароля и другие данные
  • PersistentTokenBasedRememberMeServices - более безопасный, требует доступа к базе данных - cookie содержит уникальный идентификатор, хранящийся в базе данных
...