@@ -0,0 +1,86 @@
+package nextstep.app;
+
+import nextstep.app.domain.CustomUserDetailsService;
+import nextstep.app.domain.MemberRepository;
+import nextstep.security.role.Role;
+import nextstep.security.core.context.HttpSessionSecurityContextRepository;
+import nextstep.security.core.context.SecurityContextRepository;
+import nextstep.security.filter.AuthorizationFilter;
+import nextstep.security.filter.GlobalExceptionFilter;
+import nextstep.security.filter.SecurityContextHolderFilter;
+import nextstep.security.filter.config.DefaultSecurityFilterChain;
+import nextstep.security.filter.config.DelegatingFilterProxy;
+import nextstep.security.filter.config.FilterChainProxy;
+import nextstep.security.filter.config.SecurityFilterChain;
+import nextstep.security.core.uesrdetails.UserDetailsService;
+import nextstep.security.authentication.AuthenticationManager;
+import nextstep.security.authentication.AuthenticationProvider;
+import nextstep.security.authentication.DaoAuthenticationProvider;
+import nextstep.security.authentication.ProviderManager;
+import nextstep.security.filter.BasicAuthFilter;
+import nextstep.security.filter.FormAuthFilter;
+import nextstep.security.util.PasswordMatcher;
+import nextstep.security.util.PlainTextPasswordMatcher;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.List;
+import java.util.Map;
+
+@Configuration
+public class SecurityConfig {
+    private final MemberRepository memberRepository;
+
+    public SecurityConfig(final MemberRepository memberRepository) {
+        this.memberRepository = memberRepository;
+    }
+
+    @Bean
+    public DelegatingFilterProxy delegatingFilterProxy() {
+        return new DelegatingFilterProxy(filterChainProxy(List.of(securityFilterChain())));
+    }
+
+    @Bean
+    public FilterChainProxy filterChainProxy(List<SecurityFilterChain> securityFilterChains) {
+        return new FilterChainProxy(securityFilterChains);
+    }
+
+    @Bean
+    public SecurityFilterChain securityFilterChain() {
+        return new DefaultSecurityFilterChain(
+                new GlobalExceptionFilter(),
+                new SecurityContextHolderFilter(securityContextRepository()),
+                new FormAuthFilter(authenticationManager()),
+                new BasicAuthFilter(authenticationManager()),
+                new AuthorizationFilter(Map.of("/members", List.of(new Role("NORMAL")))
+            )
+        );
+    }
+
+    @Bean
+    public SecurityContextRepository securityContextRepository() {
+        return new HttpSessionSecurityContextRepository();
+    }
+
+    @Bean
+    public AuthenticationManager authenticationManager() {
+        List<AuthenticationProvider> providers = List.of(daoAuthenticationProvider());
+        return new ProviderManager(providers);
+    }
+
+    @Bean
+    public DaoAuthenticationProvider daoAuthenticationProvider() {
+        DaoAuthenticationProvider provider = new DaoAuthenticationProvider(passwordMatcher(), userDetailsService());
+        return provider;
+    }
+
+    @Bean
+    public PasswordMatcher passwordMatcher() {
+        return new PlainTextPasswordMatcher();
+    }
+
+    @Bean
+    public UserDetailsService userDetailsService() {
+        return new CustomUserDetailsService(memberRepository);
+    }
+}

리뷰: 넵:) 가변인자로 설정하는게 사용하는 입장에서 훨씬 편리할 것 같습니다 감사합니다 👍 

---
재연님 말씀이랑 시큐리티 코드 보면서 뜯어보니 
실제 시큐리티를 사용할때 사용하던 securityMatcher(), authorizeHttpRequests() 등으로 filterChain이 선택되고 인가를 발생시키는군요! 
어떤 말씀하시는건지 약간 감이 잡히는거 같습니다! 👍 (아닐수도)