Spring Security (1) 인가 작업

castle·2023년 12월 14일
0

들어가며

스프링 시큐리티를 사용하며 단순히 코드를 가져오거나 정확히 어떤식으로 동작하는지 잘 모르고 사용하는 경우가 있었다. 시큐리티에 대해 하나씩 정리하는 용도로 작성하게 되었다.

  • 본 코드는 스프링부트 3.1.X~ 이상 버전으로 작성되었다.

먼저 스프링 어플리케이션을 만들고 실행한다면 구조는 아래 사진과 같다.

클라이언트가 요청을 보내면 해당 요청이 SpringBoot 어플리케이션에 도달하기 전에 먼저 Servlet Container라는 Tomcat 컨테이너를 지나서 요청이 SpringBoot에 전달된다.

여기서 Servlet Container는 여러개의 필터를 가지는데 요청은 이 필터들을 통과하며 들어온다.

인가 작업

이때 Spring Security 의존성을 추가하면 시큐리티 필터가 생기고 사용자의 요청을 가로채 아래와 같은 검증을 수행한다.

  1. 요청 경로의 접근은 누구에게 열려있는지
  2. 로그인이 완료된 사용자인지
  3. 해당하는 역할을 가지고 있는지

위와 같은 작업을 "인가" 작업이라고 한다.

Spring Configuration

인가 작업을 설정하는 Class

Spring Configuration 클래스를 통해서 특정 경로 요청에 대해 동작을 할지말지 설정할 수 있다.

  • 기본적인 인가 작업은 모든 경로에 대해서 로그인을 하도록 되어있다. (처음 스프링 시큐리티 의존성을 추가하면 모든 경로에 대해 권한이 없어 로그인 화면이 나온다.)

클래스 파일 생성


위 사진과 같이 SecurityConfig.class 파일을 생성한다.

  • @Configuration : 스프링 부트에게 설정파일임을 지정 해준다.
  • @EnableWebSecurity : 웹 보안 설정을 활성화 한다.(스프링 시큐리티 필터 체인이 동작하여 요청을 인가하고 인증한다)
@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의 빌더 타입
    }
}

해당 설정은 상단부터 동작이 되기 때문세 순서에 유의하자. (상단에서 먼저 모든 경로를 열면 아래 설정은 적용이 되지 않는다)

0개의 댓글

관련 채용 정보