Выключите загрузку HttpOnly Spring

Я хотел бы отключить сеансы HttpOnly, которые, я считаю, по умолчанию для Spring Boot. Как отключить HttpOnly при весенней загрузке?

В настоящее время у меня следующий код:

@RequestMapping(value = "/stuff", method = GET)
public @ResponseBody
myObject doStuff(HttpSession session)
{
        session.setAttribute("foo", "bar");
        return  new MyObject();
}

Это возвращает заголовок ответа на вызов HTTP:

Set-Cookie: JSESSIONID=D14846D9767B6404F1FB4B013AB66FB3; Path=/; HttpOnly 

обратите внимание на флаг HttpOnly. Я бы хотел это выключить. Как мне это сделать?

Примечание: Да, я знаю, что httpOnly является функцией безопасности, и, отключив его, позволяет javascript получить доступ к моему cookie, т. е. XSS.

кроме того, у меня нет никакой конфигурации, кроме default.

@ComponentScan
@EnableAutoConfiguration
public class WebApplication {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(WebApplication.class);
        app.run(args);
    }
}

3 ответов


у Tomcat есть атрибут контекста с именем useHttpOnly, который проверяет:

должен ли флаг HttpOnly быть установлен на сеансе cookies для предотвращения клиента боковой скрипт от доступа к идентификатору сеанса? По умолчанию true.

поэтому вам нужно установить его в false. Связанная конфигурация применяется к не встроенным серверам Tomcat. Нам нужно найти способ сделать это со встроенным Tomcat.

вот как вы это делаете. Объявить @Bean метод добавление EmbeddedServletContainerFactory в контексте. Настройки вернул TomcatEmbeddedServletContainerFactory указать TomcatContextCustomizer, который настраивает на соответствующее имущество.

@Bean
public EmbeddedServletContainerFactory servletContainer() {
    TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
    factory.setTomcatContextCustomizers(Arrays.asList(new CustomCustomizer()));
    return factory;
}

static class CustomCustomizer implements TomcatContextCustomizer {
    @Override
    public void customize(Context context) {
        context.setUseHttpOnly(false);
    }
}

это решение работает, потому что вы используете Tomcat. С различными контейнерами сервлетов решение будет другим.


Другой альтернативой принятому ответу, который вписывается в spring boot, является переопределение метода customize вашего EmbeddedServletContainerCustomizer.

во-первых, реализовать интерфейс:

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application implements EmbeddedServletContainerCustomizer

затем добавьте переопределение для метода customize:

@Override
public void customize(final ConfigurableEmbeddedServletContainer container)
{
    ((TomcatEmbeddedServletContainerFactory) container).addContextCustomizers(new TomcatContextCustomizer()
    {
        @Override
        public void customize(Context context)
        {
            context.setUseHttpOnly(false);
        }
    });
}

кстати, я обнаружил, что httpOnly не был установлен вообще для меня .. поэтому мне пришлось использовать этот метод, чтобы включить httpOnly (очевидно, моя настройка выше "true").

вы также можете использовать этот метод для настройте другие вещи в tomcat, такие как включение gzip для json и расширение максимального размера HTTP-заголовка (в случае аутентификации kerberos мне нужно было это сделать):

((TomcatEmbeddedServletContainerFactory) container).addConnectorCustomizers(new TomcatConnectorCustomizer()
{
    @Override
    public void customize(final Connector connector)
    {
        AbstractHttp11Protocol httpProtocol = (AbstractHttp11Protocol) connector.getProtocolHandler();
        httpProtocol.setMaxHttpHeaderSize(65536);
        httpProtocol.setCompression("on");
        httpProtocol.setCompressionMinSize(256);
        String mimeTypes = httpProtocol.getCompressableMimeTypes();
        String mimeTypesWithJson = mimeTypes + "," + MediaType.APPLICATION_JSON_VALUE;
        httpProtocol.setCompressableMimeTypes(mimeTypesWithJson);
    }
});

по крайней мере, на Spring Boot >= 1.4, это еще проще, просто используйте следующее свойство:

server.session.cookie.http-only= # "HttpOnly" flag for the session cookie. configuration property.

как описано в официальная документация.