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;
}
}
- filterChain 메서드를 사용해 SecurityFilterChain Bean을 정의한다. 이 Bean은 HttpSecurity객체를 사용하여 다양한 보안 설정을 구성한다.
- http.csrf().disable(); => CSRF 보호를 비활성화하는 것이 안전하다.
- http.formLogin(...); => 사용자 이름 매개변수를 사용해 성공 URL을 지정한다.
- http.logout(...); => 로그아웃 성공 URL 및 HTTP 세션 무효화 여부를 지정한다.
- http.authorizeHttpRequests() => 인가 규칙을 정의한다. (
- /file/**로 시작하는 요청은 "ADMIN" 역할이 필요
- /board/**로 시작하는 요청은 "USER" 또는 "ADMIN" 역할이 필요
- 기타 모든 요청(/**)은 모든 사용자에게 허용
- CSS, JS, 이미지와 같은 정적 리소스는 모든 사용자에게 허용
- /member/insert 및 /member/login도 모든 사용자에게 허용 )
-
- userDetailsService 메서드를 사용하여 InMemoryUserDetailsManager 빈을 정의한다.
- 간단한 인메모리 사용자 정보를 제공하여 인증에 사용된다.
- "foo," "bar," 및 "ted"라는 세 가지 사용자가 각각 다른 역할("ADMIN" 및/또는 "USER")을 가지고 있다.
이 설정은 단순성을 위해 인메모리 인증을 사용한다. 실제 환경에서는 더 안전한 데이터베이스 기반 인증과 교체하는 것이 좋다.
728x90
'Backend > Spring' 카테고리의 다른 글
[Spring] JWT (JSON Web Token) (1) | 2023.12.19 |
---|---|
[Spring] Security 동작 확인 / 사용 방법 (0) | 2023.12.18 |
[Spring] HttpServletRequest , HttpServletResponse란? / 주요 기능과 자주 사용하는 메서드 (0) | 2023.12.11 |
[Spring] HttpServlet 란? / HttpServlet 과정 (0) | 2023.12.11 |
[Spring] PRG 패턴 / 와이어프레임 (0) | 2023.12.11 |