programing

스프링 보안 설정 - Http Security vs Web Security

batch 2023. 3. 27. 21:06
반응형

스프링 보안 설정 - Http Security vs Web Security

Spring Security Configuration의 내용을 이해해야 합니다.아래 예를 사용하여...

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .httpBasic()
            .and()
            .authorizeRequests().antMatchers("/secret/**").authenticated()
            .and()
            .authorizeRequests().antMatchers("/**").permitAll();
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/resources/**");
    }

}

의 목적은 무엇입니까?configure(WebSecurity web)방법?

그냥 추가하면 안 돼요?/resources/**에서configure(HttpSecurity http)이 행의 방법.authorizeRequests().antMatchers("/**", "/resources/**").permitAll();같은 방법으로 모든 요청을 허용해야 하지 않을까요?/resources/**어떤 인증도 없이요?

Web Security의 일반적인 사용ignoring()메서드는 Spring Security를 생략하고 Spring Security 기능을 사용할 수 없습니다.Web Security는 Http Security를 기반으로 합니다.

@Override
public void configure(WebSecurity web) throws Exception {
    web
        .ignoring()
        .antMatchers("/resources/**")
        .antMatchers("/publics/**");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .antMatchers("/publics/**").hasRole("USER") // no effect
        .anyRequest().authenticated();
}

위의 예에서 Web Security는 Spring이 무시하도록 합니다./resources/**그리고./publics/**따라서,.antMatchers("/publics/**").hasRole("USER")HttpSecurity는 무시됩니다.

이렇게 하면 보안 필터 체인에서 요청 패턴이 완전히 생략됩니다.이 경로와 일치하는 것은 인증 또는 인가 서비스가 적용되지 않으며 자유롭게 액세스할 수 있습니다.

configure(HttpSecurity)그럼 선택 일치에 따라 리소스 수준에서 웹 기반 보안을 설정할 수 있습니다.다음 예시는 로 시작하는 URL을 제한하고 있습니다./admin/다른 URL을 정상적으로 인증할 필요가 있음을 선언합니다.

configure(WebSecurity)글로벌 보안에 영향을 주는 설정(리소스 추가, 디버깅모드 설정, 커스텀방화벽 정의 구현에 의한 요구 거부)에 사용됩니다.예를 들어, 다음 방법은 다음과 같이 시작하는 모든 요청을 발생시킵니다./resources/무시됩니다.


다음 코드를 생각해 봅시다.두 가지 방법을 모두 사용하여 antMatchers 내에서 제공되는 엔드포인트 인증을 무시할 수 있습니다.

@Override
public void configure(WebSecurity web) throws Exception {
    web
        .ignoring()
        .antMatchers("/login", "/register", "/api/public/**");
}

@Override
public void configure(HttpSecurity http) throws Exception {

    http
        .csrf().disable()
        .authorizeRequests()
        .antMatchers("/login", "/register", "/api/public/**").permitAll()
        .anyRequest().authenticated();
}
  • configure(WebSecurity web)이 방법으로 사용되는 엔드포인트는 스프링보안 필터를 무시하고 보안 기능(시큐어 헤더, CSRF 보호 등)도 무시되며 보안 컨텍스트는 설정되지 않으며 크로스 사이트 스크립팅, XSS 공격, 콘텐츠스니핑용 엔드포인트를 보호할 수 없습니다.

  • configure(HttpSecurity http)이 방법으로 사용되는 엔드포인트는 antMatchers에서 사용되는 엔드포인트 인증을 무시하며 보안 헤더, CSRF 보호 등의 기타 보안 기능이 활성화됩니다.

사용할 때HttpSecurity그리고 하려고 한다.permitAll()요청한다.Spring Security Filter Chain에서 요청에 액세스할 수 있습니다.이 필터 체인에는 인증/허가에 따라 허용 또는 금지해야 하는 다른 요구도 있기 때문에 비용이 많이 듭니다.

HttpSecurity.authorizeRequests().antMatchers("/**", "/resources/**").permitAll();

을 할 때 ""에 대한 resources스프링 보안 필터 체인을 모두 통과합니다.이미지를 보거나 Javascript 파일을 읽기 위해 인증/허가가 필요 없기 때문에 안전합니다.

WebSecurity.ignoring().antMatchers("/resources/**");

코드를 포함시켜 훌륭한 답변에 기여하고 싶습니다.한 세 . 콩이 있습니다.DelegatingFilterProxy,FilterChainProxy ★★★★★★★★★★★★★★★★★」SecurityFilterChain.

DelegatingFilterProxy는, 「Bean」 하는 합니다.FilterChainProxy그 이름은springSecurityFilterChain , , , , 입니다.FilterChainProxy는 다음과 구성되어 있습니다.

@Bean(
    name = {"springSecurityFilterChain"}
)
public Filter springSecurityFilterChain() throws Exception {
    boolean hasConfigurers = this.webSecurityConfigurers != null && !this.webSecurityConfigurers.isEmpty();
    if (!hasConfigurers) {
        WebSecurityConfigurerAdapter adapter = (WebSecurityConfigurerAdapter)this.objectObjectPostProcessor.postProcess(new WebSecurityConfigurerAdapter() {
        });
        this.webSecurity.apply(adapter);
    }

    return (Filter)this.webSecurity.build();
}

springSecurityFilterChain (오류)FilterChainProxy) 자체에 리스트가 있습니다.SecurityFilterChainSecurityFilterChain of of of of of of 의 목록이 있다Filter실제 로직을 실행하는 인스턴스.

WebSecurityConfigurerAdapter 위에 덧씌우세요.configure(HttpSecurity httpSecurity) 실제로 요.SecurityFilterChainspringSecurityFilterChain

?springSecurityFilterChain 「」를 합니다.SecurityFilterChain리스트에서요?boolean matches(HttpServletRequest request) 되어 있는 SecurityFilterChain인터페이스입니다.

★★★★★★★★★★★★★★★★★.HttpSecurity 때 합니다.SecurityFilterChain.

, 이제 제, 제WebSecurity제로로 작동 ?? ??? WebSecurity 할 수 .springSecurityFilterChain (오류)FilterChainProxy를 참조해 .springSecurityFilterChain성됩니니다다

은 ★★★★★★★★★★★★★★★입니다.performBuild의 of의 WebSecurity'만들기, 만들기, 만들기, 만들기'를 만들라고 합니다.springSecurityFilterChainbean.bean.contract.

@Override
protected Filter performBuild() throws Exception {
    Assert.state(
            !securityFilterChainBuilders.isEmpty(),
            () -> "At least one SecurityBuilder<? extends SecurityFilterChain> needs to be specified. "
                    + "Typically this done by adding a @Configuration that extends WebSecurityConfigurerAdapter. "
                    + "More advanced users can invoke "
                    + WebSecurity.class.getSimpleName()
                    + ".addSecurityFilterChainBuilder directly");
    int chainSize = ignoredRequests.size() + securityFilterChainBuilders.size();
    List<SecurityFilterChain> securityFilterChains = new ArrayList<>(
            chainSize);
    for (RequestMatcher ignoredRequest : ignoredRequests) {
        securityFilterChains.add(new DefaultSecurityFilterChain(ignoredRequest));
    }
    for (SecurityBuilder<? extends SecurityFilterChain> securityFilterChainBuilder : securityFilterChainBuilders) {
        securityFilterChains.add(securityFilterChainBuilder.build());
    }
    FilterChainProxy filterChainProxy = new FilterChainProxy(securityFilterChains);
    if (httpFirewall != null) {
        filterChainProxy.setFirewall(httpFirewall);
    }
    filterChainProxy.afterPropertiesSet();

    Filter result = filterChainProxy;
    if (debugEnabled) {
        logger.warn("\n\n"
                + "********************************************************************\n"
                + "**********        Security debugging is enabled.       *************\n"
                + "**********    This may include sensitive information.  *************\n"
                + "**********      Do not use in a production system!     *************\n"
                + "********************************************************************\n\n");
        result = new DebugFilter(filterChainProxy);
    }
    postBuildAction.run();
    return result;
}

이 등록하고 때 알 수 SecurityFilterChainspringSecurityFilterChain 한 개당web.ignoring()....에는 봄기운이 .DefaultSecurityFilterChain으로 행해지는 입니다.SecurityFilterChain리스트의 선두에 배치됩니다.

가 때springSecurityFilterChain의 목록을 하겠습니다.SecurityFilterChain 을 그 에 SecurityFilterChainspringSecurityFilterChain를 호출합니다.match SecurityFilterChain. "/resources/**" 입니다Spring는 요구 을 "필터링"의에 위임합니다.DefaultSecurityFilterChain에 있는 의 커스텀 「」의 선두에 있는 것.SecurityFilterChain하다

for (SecurityBuilder<? extends SecurityFilterChain> securityFilterChainBuilder : securityFilterChainBuilders) {
    securityFilterChains.add(securityFilterChainBuilder.build());
}

완전히 무시당했어요

configure (Http Security) : 특정 HTTP 요구에 대해 웹 기반 보안을 설정할 수 있습니다.선택 일치에 따라 리소스 수준에서 웹 기반 보안을 구성하는 데 사용됩니다.

configure (Web Security) : 스프링보안에서 무시해야 하는 RequestMatcher 인스턴스를 추가할 수 있습니다.

언급URL : https://stackoverflow.com/questions/56388865/spring-security-configuration-httpsecurity-vs-websecurity

반응형