Есть ли способ, которым я могу установить максимальный возраст для этого куки или сделать так, чтобы он истек после истечения сеанса?
Не должно быть необходимости изменять максимальный возраст кукипотому что по умолчанию CookieCsrfTokenRepository
создает его так, чтобы оно не сохранялось постоянно.Обычно он удаляется при закрытии браузера:
cookie.setMaxAge(-1);
Но если вы ДЕЙСТВИТЕЛЬНО хотите изменить его, вам придется написать собственную реализацию CsrfTokenRepository
, потому что хотя было бы неплохо простопереопределить saveToken(...)
метод CookieCsrfTokenRepository
, вы не можете, потому что это final
класс.Вместо этого вы могли бы использовать состав и иметь делегат вашей реализации в объекте CookieCsrfTokenRepository
для каждого вызова метода, кроме saveToken(...)
, где вы должны были бы написать свою собственную логику cookie.Затем добавьте его в свой WebSecurityConfigurerAdapter
:
protected void configure(HttpSecurity http) throws Exception {
http.
...
.and().csrf()
.csrfTokenRepository(new MyCustomCookieCsrfTokenRepository());
}
Опять дважды подумайте, нужно ли это.
Должен ли я хранить токен XSRF в сеансе вместо cookieдля большей безопасности?
Что ж, если кто-то может украсть ваши куки, теоретически они могут украсть и вашу сессию.Если вы можете поддерживать состояние на сервере для значения cookie, тогда продолжайте.Но если нет, придерживайся печенья.Spring Security позаботится о деталях.
Каков наилучший способ защиты CSRF с помощью AngularJS в качестве внешнего интерфейса и Springboot в качестве резервного?
Один из подходов заключается в отправкеCRSF-токен как файл cookie, и приложение ANgularJS отправляет токен обратно в заголовок «X-XSRF-TOKEN» или в качестве параметра запроса с именем «_csrf».
Если вы хотите сохранитьЗначение CSRF в сеансе, вы должны иметь способ, чтобы ваше приложение AngularJS знало об этом.Традиционно, в одностраничной настройке вы записываете ее в форму как скрытый параметр.Но поскольку это не ваш случай, вы можете использовать cookie.