상세 컨텐츠

본문 제목

[Spring] 스프링 시큐리티란 ? / 시큐리티 기본 설정 / 예시

Backend/Spring

by hyeminyy 2023. 12. 11. 22:01

본문

728x90

시큐리티란 ?

 - 사용자의 로그인과 세션 트래킹은 웹 애플리케이션에서 필수적인 기능

 

스프링 시큐리티의 기본 설정

프로젝트 내 pom.xml 파일에 관련 의존성 라이브러리를 추가한다.

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>
		
		<dependency>
			<groupId>org.thymeleaf.extras</groupId>
			<artifactId>thymeleaf-extras-springsecurity6</artifactId>
		</dependency>

 

기존의 config 패키지에 SecurityConfig.java 클래스를 추가하여

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;

@Configuration
@EnableWebSecurity
public class SecurityConfig { 


}

 

@Configuration : Bean을 수동으로 등록하기 위해서 설정 class위에 @Configuration 어노테이션을 추가하고, @Bean을 사용해 수동으로 빈을 등록할 수 있다.

 

시큐리티 예시 )

 

@Configuration
@EnableWebSecurity
public class SecurityConfig {
   
   @Bean
   public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
         http.csrf().disable();
//          http.formLogin()
          http.formLogin((formLogin) -> formLogin
                  .loginPage("/member/login")
                  .usernameParameter("userid")
                  .defaultSuccessUrl("/"))
//               .and()
//               .logout()
//                  .logoutUrl("/member/logout")
//                  .logoutSuccessUrl("/member/login")
//                  .invalidateHttpSession(true);
               .logout(logout -> logout
                     .logoutUrl("/member/logout")
                     .logoutSuccessUrl("/member/login")
                     .invalidateHttpSession(true));
         
         http.authorizeHttpRequests()
            .requestMatchers("/file/**").hasRole("ADMIN")
            .requestMatchers("/board/**").hasAnyRole("USER", "ADMIN")
            .requestMatchers("/**").permitAll()
            .requestMatchers("/css/**").permitAll()
            .requestMatchers("/js/**").permitAll()
            .requestMatchers("/images/**").permitAll()
            .requestMatchers("/member/insert").permitAll()
            .requestMatchers("/member/login").permitAll();
      
         return http.build();
   }
   
   @Bean
   @ConditionalOnMissingBean(UserDetailsService.class)
   public InMemoryUserDetailsManager userDetailsService() {
      List<UserDetails> userDetailsList = new ArrayList<>();
      userDetailsList.add(User.withUsername("foo")
            .password("{noop}demo")
            .roles("ADMIN").build());   
      userDetailsList.add(User.withUsername("bar")
            .password("{noop}demo")
            .roles("USER").build());
      userDetailsList.add(User.withUsername("ted")
            .password("{noop}demo")
            .roles("ADMIN", "USER").build());
      InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(userDetailsList);
      return manager;
   }
}

 

  1. filterChain 메서드를 사용해 SecurityFilterChain Bean을 정의한다. 이 Bean은 HttpSecurity객체를 사용하여 다양한 보안 설정을 구성한다.
  2. http.csrf().disable(); => CSRF 보호를 비활성화하는 것이 안전하다.
  3. http.formLogin(...); => 사용자 이름 매개변수를 사용해 성공 URL을 지정한다.
  4. http.logout(...); => 로그아웃 성공 URL 및 HTTP 세션 무효화 여부를 지정한다.
  5. http.authorizeHttpRequests() => 인가 규칙을 정의한다. (
    • /file/**로 시작하는 요청은 "ADMIN" 역할이 필요
    • /board/**로 시작하는 요청은 "USER" 또는 "ADMIN" 역할이 필요
    • 기타 모든 요청(/**)은 모든 사용자에게 허용
    • CSS, JS, 이미지와 같은 정적 리소스는 모든 사용자에게 허용
    • /member/insert/member/login도 모든 사용자에게 허용 )
    • userDetailsService 메서드를 사용하여 InMemoryUserDetailsManager 빈을 정의한다.
    • 간단한 인메모리 사용자 정보를 제공하여 인증에 사용된다.
    • "foo," "bar," 및 "ted"라는 세 가지 사용자가 각각 다른 역할("ADMIN" 및/또는 "USER")을 가지고 있다.

이 설정은 단순성을 위해 인메모리 인증을 사용한다. 실제 환경에서는 더 안전한 데이터베이스 기반 인증과 교체하는 것이 좋다.

 

 

728x90

관련글 더보기