@Configuration
@EnableWebSecurity // Spring Security 지원을 가능하게 함
public class WebSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
// CSRF 설정(disable 처리했기에 사용하지 않는다는 것)
http.csrf((csrf) -> csrf.disable());
http.authorizeHttpRequests((authorizeHttpRequests) ->
authorizeHttpRequests
.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() // resources 접근 허용 설정(static에는 접근 허용)
// .requestMatchers("/api/user/**").hasRole("ADMIN") // 해당 URL은 ADMIN 권한을 가진 사람만 접근 가능
.anyRequest().authenticated() // 그 외 모든 요청 인증처리
);
// 로그인 사용
http.formLogin(Customizer.withDefaults());
return http.build();
}
}
CSRF(사이트 간 요청 위조,Cross-site request forgery)란?
공격자가 인증된 브라우저에 저장된 쿠키의 세션 정보를 활용하여 웹 서버에 사용자가 의도하지 않은 요청을 전달하는 것
CSRF 설정이 되어 있는 경우 html에서 CSRF 토큰 값을 넘겨주어야 요청을 수신 가능
쿠키 기반의 취약점을 이용한 공격이기에 REST방식의 API는 disable(비활성)이 가능함
Spring Security의 default 로그인 기능
Spring Security에서 기본적으로 제공하는 로그인이 있다.
이를 인증해야지 어떤 url이던 접근이 가능해진다. 다만 @Configuration에서 예외처리한 url은 접근 가능하다.
기본 값
username : user
Password : Spring log 확인(서버 시작시마다 변경됨)
Spring Security 동작 흐름
Spring에서 모든 호출은 DispatcherServlet을 통과하게 되고 이후에 각 요청을 담당하는 Controller로 분배된다.
이 때 각 요청에 대해서 DispatcherServlet 이전에 단계가 필요하고 이때 사용되는 것이 Filter이다.
UsernamePasswordAuthenticationFilter
UsernamePasswordAuthenticationFilter는 Spring Security의 필터인 AbstractAuthenticationProcessingFilter를 상속한 Filter이다.
인증 과정
사용자가 username과 password를 제출하면 UsernamePasswordAuthenticationFilter는 인증된 사용자의 정보가 담기는 인증 객체인 Authentication의 종류 중 하나인 UsernamePasswordAuthenticationToken을 만들어 AuthenticationManager에게 넘겨 인증을 시도