Доброе утро
Сегодня небольшая заметка по настройке Spring для корректного выставления cookie с нововведениями Chrome.
Проблема
Если сервис, запущенный внутри iframe, пытается выставить cookie без установленного SameSite и Security, то он получит отказ.
Попытки решения
- Выставить значение SameSite для cookie в значение none.
- Выставить значение Security для cookie в значение true.
Подробное описание
Был написан небольшой сервис, который отображался в iframe. В сервисе использовалась HttpSession. Передаваемый JSESSIONID игнорировался. При просмотре заголовков response было найдено предупреждение от Chrome.
This Set-Cookie didn't specify a "SameSite" attribute and was defaulted to "SameSite=Lax", and was blocked because it came from cross-site response which was not the response to a top-level navigation.
The Set-Cookie had to have been set with "SomeSite=None" to enable cross-site usage.
Было решено выставлять для всех cookie значение samesite=none и security=true. Значение security в Spring можно легко настроить в файле application.properties.
server.servlet.session.cookie.secure=true
А вот выставить у cookie значение samesite в none оказалось тяжелее. Было решено вставить небольшую пост обработку запроса. В конфигурационном классе Spring были написаны следующие строки.
@Bean
public ServletWebServerFactory servletContainer() {
return new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
Rfc6265CookieProcessor rfc6265Processor = new Rfc6265CookieProcessor();
rfc6265Processor.setSameSiteCookies("None");
context.setCookieProcessor(rfc6265Processor);
}
};
}
На этом всё. Спасибо.