web-dev-qa-db-ja.com

HttpOnlySpringブートをオフにします

SpringBootのデフォルトであると私が信じているHttpOnlyセッションをオフにしたいと思います。 SpringBootで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)にアクセスできることを知っています。

また、デフォルト以外の設定はありません。

@ComponentScan
@EnableAutoConfiguration
public class WebApplication {

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

Tomcatには useHttpOnly という名前のコンテキスト属性があります。

クライアント側のスクリプトがセッションIDにアクセスできないようにするには、セッションCookieにHttpOnlyフラグを設定する必要がありますか?デフォルトはtrueです。

したがって、falseに設定する必要があります。リンクされた構成は、埋め込まれていないTomcatサーバーに適用されます。組み込みTomcatでそれを行う方法を見つける必要があります。

これがあなたのやり方です。コンテキストにEmbeddedServletContainerFactoryを追加するための@Beanメソッドを宣言します。適切なプロパティを構成する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に適合する受け入れられた答えの別の代替手段は、EmbeddedServletContainerCustomizerのc​​ustomizeメソッドをオーバーライドすることです。

まず、インターフェースを実装します。

@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」です)。

このメソッドを使用して、jsonのgzipをオンにしたり、最大httpヘッダーサイズを拡張したりするなど、Tomcatの他のことを調整することもできます(これを行うために必要な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);
    }
});
12
JimB

少なくともSpringBoot> = 1.4では、さらに簡単です。次のプロパティを使用するだけです。

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

公式ドキュメント に記載されているとおり。

server.servlet.session.cookie.http-only=false 

(プロパティ更新)

参照 https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

2
user2082512