인프런 커뮤니티 질문&답변
스프링 시큐리티 최신버전 코드 있을까요?
작성
·
2.4K
0
제일 최근에 질문한 글 참고해도 적용이 안되네요...
혹시 현재 버전에서 적용 가능한 코드가 있을까요?
아니면 참고할 수 있는 자료라도 있을까요?
https://start.spring.io/ 에서 gradle로 생성해서 사용중입니다. 스프링 3.2버전 사용하고있어요.
답변 7
2
지금은 github 소스를 참고해도 안되네요.
springboot 3.3.0, security-core 6.3.0
제가 설정한 방법 공유합니다.
혹시나 도움이 될까 싶어 올려요.
(2024-07-21) AuthenticationFilter 추가 시 userService 관련하여 순환참조 오류를 해결한 소스입니다.
@Slf4j
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class WebSecurity {
    private final Environment env;
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http,
                                           AuthenticationManager authenticationManager,
                                           UserService userService) throws Exception {
        http.csrf(AbstractHttpConfigurer::disable)
                .authorizeHttpRequests(authorize ->
                        authorize.requestMatchers("/users/**").permitAll()
                                .requestMatchers("/actuator/**").permitAll()
                                .requestMatchers("/health-check/**").permitAll()
                                .requestMatchers("/error/**").permitAll()
                                .requestMatchers("/**").access((authentication, request) -> {
                                    String clientIp = request.getRequest().getRemoteAddr();
                                    log.debug("client ip is = {}", clientIp);
                                    // 허용된 IP 리스트
                                    String[] allowedIps = {"192.168.35.194", "192.168.35.195", "192.168.35.196"};
                                    // IP가 허용된 리스트에 포함되어 있는지 확인
                                    boolean isAllowed = Arrays.asList(allowedIps).contains(clientIp);
                                    return new AuthorizationDecision(isAllowed);
                                })
                )
                .authenticationManager(authenticationManager)
                // 사용자 세션 저장하지 않음
                .sessionManagement(configurer -> configurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                // 응답 헤더에 X-Frame-Options 추가 - 클릭재킹 공격 방어 - 동일 출처만 <iframe> 로드 가능.
                .headers(headers -> headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin))
                .addFilter(customAuthenticationFilter(authenticationManager, userService));
        return http.build();
    }
    /**
     * authenticationManager bean 생성
     * @param http HttpSecurity
     * @return authenticationManager bean
     */
    @Bean
    public AuthenticationManager authenticationManager(HttpSecurity http,
                                                       UserService userService,
                                                       BCryptPasswordEncoder passwordEncoder) throws Exception {
        AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class);
        authenticationManagerBuilder.userDetailsService(userService).passwordEncoder(passwordEncoder);
        return authenticationManagerBuilder.build();
    }
    /**
     * customAuthenticationFilter bean 생성
     * @return customAuthenticationFilter bean
     */
    @Bean
    public CustomAuthenticationFilter customAuthenticationFilter(AuthenticationManager authenticationManager,
                                                                 UserService userService) {
        return new CustomAuthenticationFilter(authenticationManager, userService, env);
    }
    /**
     * 비밀번호 암호화 모듈
     * @return 암호화 bean
     */
    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}1
안녕하세요, 이도원입니다.
강좌에서 사용된 샘플 코드를 최신 버전으로 업데이트 하였습니다.
아래 github 에서 확인해 보실 수 있습니다.
https://github.com/joneconsulting/toy-msa
감사합니다.
1
이게 답변이 될 수 있을지 모르겠는데요.. 저도 공부하면서 뭔가 틀려서 여러 삽질을 통해서 코드 변경해가면서 하고 있어서
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class WebSecurity {
    private final UserService userService;
    private final BCryptPasswordEncoder bCryptPasswordEncoder;
    private final Environment env;
    private final AuthenticationConfiguration authenticationConfiguration;
    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring().requestMatchers(PathRequest.toStaticResources().atCommonLocations());
    }
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                .antMatchers("/actuator/**").permitAll();
        http.csrf().disable()
                .authorizeRequests().antMatchers("/**")
                .hasIpAddress("192.168.0.7")
                .and()
                .addFilter(getAuthenticationFilter(authenticationConfiguration))
                .headers().frameOptions().disable();
        return http.build();
    }
    private AuthenticationFilter getAuthenticationFilter(AuthenticationConfiguration authenticationConfiguration) throws Exception {
        AuthenticationFilter authenticationFilter = new AuthenticationFilter(authenticationManager(authenticationConfiguration), userService, env);
        return authenticationFilter;
    }
    @Bean
    AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
        return authenticationConfiguration.getAuthenticationManager();
    }
}
0
안녕하세요, 이도원입니다.
현재 Spring Boot 3.2 + Spring Cloud 2023.0.0 버전으로 된 실습 코드를 공유해 드리고 있습니다. 관련 실습 코드에 대한 강의 콘텐츠도 업로드 되었습니다. 혹시 아래 코드로 실행하실 때에도 오류가 발생하는 건지 확인해 주실 수 있을끼요? 오류가 발생 되셨다면 관련 부분은 한번 더 공유해 주시면 감사드리겠습니다.
새로운 소스 코드는 아래 Github에 공유 되어 있고, Branch는 main이 아니라 springboot3.2 Branch를 사용하시기 바랍니다.
https://github.com/joneconsulting/toy-msa/tree/springboot3.2
감사합니다.
0

섹션 4. Users Microservice ➀ Spring Security 코드 입니다.
@Configuration
@EnableWebSecurity
public class WebSecurity {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf(csrf->csrf.disable());
        http.authorizeHttpRequests(request->{
            request.requestMatchers(antMatcher("/users/**")).permitAll();
            request.requestMatchers(antMatcher("/h2-console/**")).permitAll();
        });
        http.headers(headers->headers.frameOptions(frameOptions->frameOptions.disable()));
        return http.build();
    }
}0

여기 코드 참고해서 작성했습니다.
섹션6 기준으로 나머지 코드는 변수명 정도만 수정했고, WebSecurity코드는 이렇게 바꿔서 사용했어요.
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class WebSecurity {
    private final UserService userService;
    private final Environment environment;
    private final AuthenticationConfiguration authenticationConfiguration;
    private final AuthenticationManager authenticationManager;
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf(AbstractHttpConfigurer::disable)
                .authorizeHttpRequests(request ->{
                    request.requestMatchers(antMatcher("/**")).permitAll();
                })
                .addFilter(getAuthenticationFilter(authenticationConfiguration));
        http.headers().frameOptions().disable(); //H2 Console 설정
        return http.build();
    }
    private AuthenticationFilter getAuthenticationFilter(AuthenticationConfiguration authenticationConfiguration) throws Exception {
        AuthenticationFilter authenticationFilter = new AuthenticationFilter(authenticationManager, userService, environment);
        return authenticationFilter;
    }
}0
안녕하세요, 인프런 AI 인턴입니다.
스프링 시큐리티를 사용하는 데 문제가 있으시군요.
스프링 부트 참조 문서의 “18. “How-to” Guides > 18.14. Security” 섹션을 참고하시면 현재 버전의 스프링 부트에 적용 가능한 스프링 시큐리티 관련 정보를 얻으실 수 있습니다.
자세한 내용과 가이드는 스프링 시큐리티 프로젝트 페이지에서 확인하실 수 있습니다.
또한, 스프링 부트에 관련된 다양한 상황의 질문과 답변이 필요하다면 Stack Overflow의 spring-boot 태그가 붙은 글을 참조하시거나, 새 질문을 하실 수도 있습니다.
현재 문서는 스프링 부트 3.1.5 버전을 기준으로 하고 있지만, 스프링 부트 3.2 버전에서도 동일하게 적용될 수 있는 내용이 많으니 참고하시면 도움이 될 것입니다.
참고 문서 URL: Spring Boot Reference Documentation - Security
오류가 지속되거나 구체적인 코드를 찾기 어려우시면, 추가적으로 문의 주시면 답변 드리도록 하겠습니다. 흑후추님, 문제 해결을 위한 참고 자료가 도움이 되길 바랍니다.







혹시 스프링이랑 시큐리티 버전이 어떻게되나요?