스프링 시큐리티를 사용하며 단순히 코드를 가져오거나 정확히 어떤식으로 동작하는지 잘 모르고 사용하는 경우가 있었다. 시큐리티에 대해 하나씩 정리하는 용도로 작성하게 되었다.
먼저 스프링 어플리케이션을 만들고 실행한다면 구조는 아래 사진과 같다.
클라이언트가 요청을 보내면 해당 요청이 SpringBoot 어플리케이션에 도달하기 전에 먼저 Servlet Container라는 Tomcat 컨테이너를 지나서 요청이 SpringBoot에 전달된다.
여기서 Servlet Container는 여러개의 필터를 가지는데 요청은 이 필터들을 통과하며 들어온다.
이때 Spring Security 의존성을 추가하면 시큐리티 필터가 생기고 사용자의 요청을 가로채 아래와 같은 검증을 수행한다.
위와 같은 작업을 "인가" 작업이라고 한다.
인가 작업을 설정하는 Class
Spring Configuration 클래스를 통해서 특정 경로 요청에 대해 동작을 할지말지 설정할 수 있다.
위 사진과 같이 SecurityConfig.class 파일을 생성한다.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
http.authorizeHttpRequests((auth) -> auth
// 특정 경로에 대해 모든 사람 접근 허용(permitAll)
.requestMatchers("/", "/join", "/login").permitAll()
// 특정 경로에 대해 ADMIN 역할을 가진 사람 접근 허용(hasRole)
.requestMatchers("/admin").hasRole("ADMIN")
// 와일드 카드(**)를 사용하여 여러 id 값의 대한 경로들에 대해 여러 역할 허용(hasAnyRole)
.requestMatchers("/mypage/**").hasAnyRole("ADMIN", "USER")
//위에서 처리하지 못한 모든 다른 요청에 대해 설정
.anyRequest().authenticated()
);
return http.build(); //최종값은 http의 빌더 타입
}
}
해당 설정은 상단부터 동작이 되기 때문세 순서에 유의하자. (상단에서 먼저 모든 경로를 열면 아래 설정은 적용이 되지 않는다)