본문 바로가기

Dev/Spring Boot

Spring Security - configure, WebSecurityConfigurerAdapter를 사용하여 권한 체크

728x90

 Spring boot 에서 configure란 "스프링이 돌아가는 설정을 관리하는 객체" 라고한다. 

다시 말하면 스프링이 기본으로 돌아가는 기본 설정을 configure 어노테이션을 붙혀 우리가 관리할 수 있다는 말이다.

 

이는 Bean과는 조금 다른 의미인데, Bean은 Ioc (제어의 역전)에 개발자가 직접 클래스를 삽입하여 사용할 수 있는 것이라면 configure는 아에 규칙을 바꿔버릴 수 있다.

 

스프링부트에서 로그인 기능을 위해

WebSecurityConfigurerAdapter
@EnableWebSecurity

두가지를 사용할 수 있다. 먼저 아래 어노테이션은 시큐리티 필터가 스프링 필터 체인에 등록이된다. 이를 통해 기본적인 스프링 시큐리티 설정이 실행되고 위의 클래스를 상속받으면 여러가지 스프링 시큐리티의 기능을 사용할 수 있다. 

예를들어 , 기본 페이지는 모두가 볼 수 있지만 게시글을 보려면 로그인해야하는 경우를 간단히 표현할 수 있다.

 

먼저 위의 방식없이 스프링시큐리티만 gradle에 추가해두었다면 

 

메인 페이지에 이렇게 바로 로그인 창이 나타난다. 

 

@Configuration
@EnableWebSecurity // 시큐리티 필터가 스프링 필터 체인에 등록이 됨.
public class SecurityConfig extends WebSecurityConfigurerAdapter { // 이것이 필터. 이것이 기본 필터 체인에 등록이 됨.
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.authorizeRequests()
                .antMatchers("/user/**").authenticated()
                .antMatchers("/CoreMember/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')")
                .antMatchers("/CoreMember/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')")
                .anyRequest().permitAll()
                .and()
                .formLogin()
                .loginPage("/login");
    }
}

 

이렇게 configure를 활성화하고 코드를 적는다. 위 코드는 /user/~ 라는 주소는 로그인 되어있으면 접근을 허락하는 것이고 코/coremember/~ 라고 들어오면 hasRole 즉 권한 까지 체크하는 것이다. 일반 유저인지, 아닌지 그리고 만약 접근을 거부당했다면 로그인 페이지로 이동된다. 다시 서버를 실행하면 다음과 같이 작동한다.

메인 페이지에 TEST를 출력하게 해놓았는데 이번에는 로그인을 요구하지 않는다. 여기서 만약 /user/ 라고 적어보면 자동으로 로그인 페이지로 이동한다.

 

여기서 주의해야할 것이 있다. /login 은 스프링시큐리티에서 자체적으로 사용하던 페이지이다. 즉 원래는 맨 위 로그인 창으로 이동해야한다. 그러나 우리가 스프링 필터체인에 등록했기 때문에 개발자가 등록한 설정으로 돌아가게 된 것이다.