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);
}
}
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
のcustomizeメソッドをオーバーライドすることです。
まず、インターフェースを実装します。
@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);
}
});
少なくとも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