Мне любопытно, как действительно Помнит Меня работа и как она работает в безопасности Spring?
Я понимаю, что сервер отправляет долговечные cookie клиенту. И затем клиент передает cookie обратно, и сервер может распознать клиент, потому что существует что-то как карта хеша на сервере с отношениями cookie --> session
.
Я не понимаю, как делает сервер [приложение серверной стороны] распознает клиент cookie после того, как сервер [Tomcat] был перезапущен.
Как и где безопасность Spring сохраняет cookie-session
карта перед завершением работы сервера? Действительно ли это является определенным для сервера (т.е. что-то другое происходится в Tomcat, Причал и т.д.)?
P.S. еще одна связанная проблема с безопасностью Spring и повторным развертыванием: даже если я не отсчитываю RememberMe
и войдите в систему, я все еще распознан после повторного развертывания в течение приблизительно 3 минут. Действительно ли это является закрепляемым?
В документации Spring Security обсуждается , как это на самом деле работает.
Этот подход использует хеширование для достижения полезной стратегии «запомнить меня». По сути, файл cookie отправляется в браузер после успешной интерактивной аутентификации, причем файл cookie состоит из следующего:
base64 (username + ":" + expirationTime + ":" + md5Hex (username + ":" + expirationTime + " : "пароль +": "+ ключ))
...
Таким образом, токен" запомнить меня "действителен только в течение указанного периода и при условии, что имя пользователя, пароль и ключ не меняются. Примечательно, что это имеет потенциальную проблему безопасности, поскольку захваченный токен «запомнить меня» будет использоваться любым пользовательским агентом до тех пор, пока не истечет срок действия токена. Это та же проблема, что и при дайджест-аутентификации.
Обычно cookie содержит имя пользователя, пароль, срок действия и ключ (который вы указываете), все из которых хешируются вместе. Когда ваш браузер отправляет содержимое этого файла cookie на сервер, Spring Security:
md5Hex ()
имени пользователя / пароля / и т. Д. из базы данных и сравнивает его со значением в cookie Основное предположение здесь заключается в том, что хеш-функция - часть md5Hex ()
выше - предоставляет способ легко кодировать часть данных в одном направлении, но ее невероятно сложно и непрактично отменить (восстановить пароль из текста md5Hex
).
Не путайте файлы cookie сеанса с файлами cookie "Запомнить меня".
Файл cookie сеанса отправляется сервером (например, Tomcat) и используется для связывания входящего запроса с сеансом.
Файл cookie «Запомнить меня» отправляется Spring Security для аутентификации клиента в различных сеансах (например,после истечения исходного сеанса или после перезапуска сервера).
Для аутентификации пользователя с помощью файла cookie «Запомнить меня» Spring Security предоставляет 2 стратегии:
TokenBasedRememberMeServices
- используется по умолчанию, менее безопасный - файл cookie содержит хэш пароля и другие данные PersistentTokenBasedRememberMeServices
- более безопасный, требует доступа к базе данных - cookie содержит уникальный идентификатор, хранящийся в базе данных