티스토리 뷰

Bean등록을 통해서 SecurityConfig에서 JwtAuthenticationFilter를 사용하려고 했으나, 순환참조가 발생함

그래서 검색해보니 다른 config파일로 Bean을 빼는 방법이 있고, AbstractHttpConfigurer를 만들어서 보안 설정을 별개의 클래스를 통해서 하는 방식이 있음(같은말일수도 있음 시도해 본건 두번째 방법)

AbstractHttpConfigurer와 SecurityChainFilter가 둘다 사용되길래, 둘의 차이를 ChatGPT에 물어보았더니,

아래와 같은 답변이 나옴

AbstractHttpConfigurer와 SecurityFilterChain은 모두 Spring Security의 구성 요소이지만 서로 다른 용도로 사용됩니다.

AbstractHttpConfigurer는 Spring 애플리케이션에서 HTTP 요청의 보안 구성을 담당하는 HttpSecurity 개체를 구성하는 데 사용됩니다. AbstractHttpConfigurer는 개발자가 인증, 권한 부여, 세션 관리, CSRF 보호 등과 같은 HTTP 요청의 특정 부분을 구성할 수 있는 편리한 메서드 세트를 제공합니다.

한편, SecurityFilterChain은 다음을 담당합니다. 들어오는 요청을 필터링하고 HttpSecurity에 정의된 보안 구성을 적용합니다. SecurityFilterChain은 들어오는 요청에 특정 순서로 적용되는 필터 체인이며 각 필터는 인증, 권한 부여 또는 CSRF 보호와 같은 특정 보안 관련 작업을 수행합니다.

In 즉, AbstractHttpConfigurer는 애플리케이션의 보안 설정을 구성하는 데 사용되고 SecurityFilterChain은 이러한 보안 설정을 들어오는 요청에 적용하는 데 사용됩니다.

요약하면 AbstractHttpConfigurer는 보안 설정을 정의하는 HttpSecurity를 구성하는 데 사용됩니다. SecurityFilterChain은 들어오는 요청을 필터링하고 HttpSecurity에 정의된 보안 설정을 적용하는 데 사용됩니다.

즉, 보안 설정을 적용하는곳 설정하는 것이 SecurityFilterChain이고, 그 설정이 되어있는 곳이 HttpSecurity라는 객체인데, 그걸 만드는 방법이 AbstractHttpConfigurer를 구현하는 것이다.

나는 아래와 같이 구성했다.

package com.cvcvcx.jwt.config;

import com.cvcvcx.jwt.config.auth.PrincipalDetailsService;
import com.cvcvcx.jwt.config.jwt.JwtAuthenticationFilter;
import com.cvcvcx.jwt.filter.MyFilter1;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.context.SecurityContextHolderFilter;
import org.springframework.web.filter.CorsFilter;

@Configuration
@EnableWebSecurity//-> 시큐리티 활성화 => 기본 스프링 필터체인에 등록
@RequiredArgsConstructor
public class SecurityConfig {

    private final CorsFilter corsFilter;
    private final PrincipalDetailsService principalDetailsService;

    @Bean
    public BCryptPasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
    @Bean
    SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

        return http
//                .addFilterBefore(new MyFilter1(), SecurityContextHolderFilter.class)
                .csrf()
                .disable()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .formLogin()
                .disable()
                .httpBasic()//
                .disable()
                .apply(new MyCustomDsl())
                .and()
                .authorizeRequests(authorize ->
                        authorize.antMatchers("/api/v1/user/**")
                                 .access("hasRole(ROLE_USER) or hasRole(ROLE_MANAGER) or hasRole(ROLE_ADMIN)")
                                 .antMatchers("/api/v1/manager/**")
                                 .access("hasRole(ROLE_MANAGER) or hasRole(ROLE_ADMIN)")
                                 .antMatchers("/api/v1/admin/**")
                                 .access("hasRole(ROLE_ADMIN)")
                                 .anyRequest()
                                 .permitAll())
                .build();
    }
//실제로 AbstractHttpConfigurer를 구현한 클래스 
//위에서 apply를 통해 적용했다.
//아마 위에있는 csrf나 sessionManagement와 같은 설정도 아래로 가져오는 것이 맞을듯? 추후수정
    public class MyCustomDsl extends AbstractHttpConfigurer<MyCustomDsl,HttpSecurity>{
        @Override
        public void configure(HttpSecurity http) throws Exception {
            AuthenticationManager authenticationManaer = http.getSharedObject(AuthenticationManager.class);
            http.addFilter(corsFilter)
                    .addFilter(new JwtAuthenticationFilter(authenticationManager));
        }
    }

}


Uploaded by N2T

'JPA 게시판 > Spring Security' 카테고리의 다른 글

스프링 시큐리티와 jwt, Oauth2  (0) 2023.04.02
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함