programing

HttpOnly Spring 부팅 끄기

instargram 2023. 7. 11. 21:28
반응형

HttpOnly Spring 부팅 끄기

Spring Boot의 기본값인 HttpOnly 세션을 해제하려고 합니다.스프링 부트에서 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가 제 쿠키, 즉 XSS에 액세스할 수 있다는 것을 알고 있습니다.

또한 저는 기본값 이외의 구성은 가지고 있지 않습니다.

@ComponentScan
@EnableAutoConfiguration
public class WebApplication {

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

봄 부츠에 맞는 허용된 답변의 또 다른 대안은 사용자 정의 방법을 재정의하는 것입니다.EmbeddedServletContainerCustomizer.

먼저 인터페이스를 구현합니다.

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application implements EmbeddedServletContainerCustomizer

그런 다음 사용자 정의 방법에 대한 재정의를 추가합니다.

@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);
    }
});
server.servlet.session.cookie.http-only=false 

(속성 업데이트)

참조 https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

적어도 Spring Boot >= 1.4에서는 다음 속성을 사용하는 것이 훨씬 쉽습니다.

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

공문서에 기록된 바와 같이

Tomcat에는 다음을 확인하는 이름의 컨텍스트 특성이 있습니다.

클라이언트 사이드 스크립트가 세션 ID에 액세스하지 못하도록 세션 쿠키에 HttpOnly 플래그를 설정해야 합니까?기본값은 true입니다.

따라서 거짓으로 설정해야 합니다.연결된 구성은 내장되지 않은 Tomcat 서버에 적용됩니다.우리는 내장된 Tomcat으로 그것을 할 수 있는 방법을 찾아야 합니다.

방법은 다음과 같습니다.다음을 선언합니다.@Bean추가 방법EmbeddedServletContainerFactory문맥에 맞게반환된 항목을 구성합니다.TomcatEmbeddedServletContainerFactorya를 지정하여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을 사용하고 있기 때문에 이 솔루션이 작동합니다.서블릿 컨테이너가 다르면 솔루션도 달라집니다.

언급URL : https://stackoverflow.com/questions/22428233/turn-off-httponly-spring-boot

반응형