Spring Security : 계정 생성 + 권한 설정 + 인증/인가 설정

    이 글은 인프런 정수원님의 강의를 복습하며 작성한 글입니다.

    Spring Security  : 계정 생성 + 권한 설정 + 인증/인가 설정

    Spring Security는 기본적으로 인증 / 인가를 바탕으로 동작한다. 인증/인가를 위해서 필요한 것은 바로 계정이고, 그 계정에 어떤 권한이 설정되는지가 중요하다. 그리고 어떤 자원으로 접근할 때 인증이 필요한지, 그리고 어떤 권한이 필요한지를 설정하는 것이 Spring Security의 시작이다. 이번 포스팅에서는 계정 생성 + 권한 설정 / 인증 + 인가 설정에 대해 간략히 살펴본다.

     

    Spring Security Config 정보 설정

    @EnableWebSecurity
    @Configuration
    public class SecurityConfig extends WebSecurityConfigurerAdapter {}

    Spring Security Config 정보는 WebSecurityConfigurerAdatper 클래스를 상속받은 클래스를 만들어주고, 필요한 메서드를 오버라이딩 해준다. 그리고 @EnableWebSecurity를 붙여주면 된다. 이 때, 필요하면 @Configuration을 등록해서 필요한 스프링 빈을 등록해주기도 한다. 

     

    Spring Security 계정 생성 + 권한 설정

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    
        String password = passwordEncoder().encode("1111");
    
        auth.inMemoryAuthentication().withUser("user").password(password).roles("USER");
        auth.inMemoryAuthentication().withUser("manager").password(password).roles("MANAGER", "USER");
        auth.inMemoryAuthentication().withUser("admin").password(password).roles("ADMIN","MANAGER","USER");
    }

    Spring Security 계정 설정은 WebSecurityConfigurerAdatper 클래스의 Configurer(Auth) 메서드를 오버라이딩하면서 설정할 수 있다.  이 때 비밀번호는 반드시 passwordEncoder()를 이용해서 복호화해줘야한다. 

    • auth.inMemoryAuthentication()
      • 메모리 상에 존재하는 계정을 만들 수 있다. 서버를 껏다 키면, 이 계정은 새로 만들어지거나 없어진다
    • withUser()
      •  사용할 계정명을 설정한다.
    • password()
      • 사용할 비밀번호를 설정한다. 이 때 반드시 passwordEncoder를 이용해서 비밀번호를 복호화해야한다. 그렇지 않으면 Exception이 발생한다.
    • roles()
      • 계정의 권한을 설정한다. 
    @Bean
    public PasswordEncoder passwordEncoder() {
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }

    다음은 PasswordEncoder()를 제공해주는 방법이다. PasswordEncoderFactories에서 PasswordEncoder를 만들 수 있다. 그리고 그 결과를 스프링 빈으로 등록해준다. 실제로 현재 상태에서는 딱히 스프링 빈으로 등록할 필요는 없다. @Bean + @Configuration이 없다고 하더라도, 해당 설정 클래스에 메서드가 존재하는 상황이기 때문에 문제 없다. 

     

     

    Spring Security 인증/인가 URL 설정  + 인증 방식 설정

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/mypage").hasRole("USER")
                .antMatchers("/messages").hasRole("MANAGER")
                .antMatchers("/config").hasRole("ADMIN")
                .anyRequest().authenticated();
    
        http
                .formLogin();
    }

    인증 / 인가 정보는 WebSecurityConfigurerAdapter의 configurer(HttpSecurity) 메서드를 오버라이딩하면서 설정할 수 있다. 

    • authorizeRequests() : URL 인가에 대한 설정을 한다. 
    • antMatchers() : 접근할 자원의 URL을 설정한다.
    • permitAll() : 해당 자원은 어떤 권한이 없어도 접근이 가능하다. 익명 사용자도 접근이 가능하다.
    • hasRole() : 특정 권한을 가진 사람만 접근하도록 설정한다.
    • anyRequest().authenticated() : 위의 URL을 제외한 모든 자원 접근은 모두 인증처리가 필요하다. 인증된 사용자만 접근 가능하다.

    위의 코드로 설정해주면 USER 권한을 가진 사람은 /mypage로 접근이 가능하고, MANAGER 권한을 가진 사람은 /messages로 접근이 가능하다. ADMIN 권한을 가진 사람은 /config로 접근이 가능하다. 

     

     

    테스트코드

    https://github.com/chickenchickenlove/spring-security/tree/main/lectureproject/1-1

     

    GitHub - chickenchickenlove/spring-security

    Contribute to chickenchickenlove/spring-security development by creating an account on GitHub.

    github.com

    댓글

    Designed by JB FACTORY