[SpringBoot] 스프링 시큐리티 연동및 설정, 인메모리 방식 유저 추가 방법

    스프링 시큐리티(Spring Security)를 사용하는 이유는 웹 애플리케이션 사용시 사용자 아이디와 비밀번호를 인증을 할 수 있게 하여 URL마다 특정 권한이 있는 사용자만 접속이 가능하게 할수도 있게 하고 사용자 비밀번호를 편하게 암호화 할 수 있다.

    스프링 시큐리티 연동

    스프링 시큐리티 사용하려면 아래 스프링 시큐리티 dependency 추가(test는 의존성은 추가 안해도됨)

    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    
    <dependency>
       <groupId>org.springframework.security</groupId>
       <artifactId>spring-security-test</artifactId>
       <scope>test</scope>
    </dependency>
    

    스프링 시큐리티 의존성을 추가하고 나면 모든 요청은 인증을 필요로 하고, 기본 유저가 생성된다.

    • Username : user
    • Password : 콘솔에 출력된 문자열

     

    요청 인증 form과 콘솔에 출력된 password

     

    하지만 이대로 웹 애플리케이션을 사용할수 없다 왜냐하면 모든 요청에서 인증을 하기 때문에 인증 없이 접근 가능한 URL도 있어야 하고, 유저 계정이 하나뿐인것 또 비밀번호가 로그에 남기 때문이다. 그래서 스프링 시큐리티 설정이 필요하다

    스프링 시큐리티 설정

    @Configurable
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                    .mvcMatchers("/", "info", "/account/**").permitAll()
                    .mvcMatchers("admin").hasRole("ADMIN")
                    .anyRequest().authenticated(); //다른 url들은 인증만하면 접근가능하다.
    
            http.formLogin();
            http.httpBasic(); //http 기본인증 사용 
        }
    }
    
    • 스프링 웹 시큐리티를 설정 클래스를 만들려면 @Configuration, @EnableWebSecurity 애노테이션과 WebSecurityConfigurerAdapter 클래스를 상속 받아야 한다.
    • http.authorizeRequests() 메서드로 특정한 경로에 특정한 권한을 가진 사용자만 접근할 수 있도록 설정할 수 있다.
    • mvcMatchers() : 특정 경로를 지정해서 권한 설정 가능
    • formLogin() : 인증이 필요한 요청은 스프링시큐리티에서 사용하는 기본 Form Login Page 사용
    • httpBasic() : http 기본인증 사용

    antMatchers, mvcMatchers 차이

    특정경로 지정해서 권한을 설정할때 antMatchers, mvcMatchers가 있는데 antMatchers는 URL 매핑 할때 개미패턴, mvcMatchers는 mvc패턴이다. antMatchers(”/info”) 하면 /info URL과 매핑 되지만 mvcMatchers(”/info”)는 /info/, /info.html 이 매핑이 가능하다.

     

     

    인메모리 유저 추가

    유저를 만드는 클래스는 UserDetailsServiceAutoConfiguration 클래스 에서 왔다.

    이 클래스를 보면 아래처럼 SecurityProperties 로 계정을 생성하는 방법이 있지만 소스에 사용자 정보가 있으므로 사용하지 않는다.

    spring.security.user.name=admin
    spring.security.user.password=123
    spring.security.user.roles=ADMIN
    

    인메모리에서 유저 설정

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("kang").password("{noop}123").roles("USER").and()
                .withUser("admin").password("{noop}!@#").roles("ADMIN");
    }
    
    • AuthenticationManagerBuilder를 제공하는 configure메서드 오버라이딩을 한다. 이 메서드로 원하는 유저를 임의대로 설정할 수 있다.
    • 인메모리 유저 설정은 inMemoryAuthentication() 메서드를 사용한다.
    • noop은 스프링 시큐리티에서 제공하는 기본 패스워드 인코더방식인데 암호화를 하지 않았다는 것이다.
    • {}안에 다른 인코딩 방식을 사용한다면 웹 화면에서 입력한 password가 {}인코딩방식으로 인코딩된 값하고 비교가 된다. ex) {bcrypt}#oijowefijwoj0192310j


    백기선 스프링 시큐리티 강의 참고

    https://www.inflearn.com/course/%EB%B0%B1%EA%B8%B0%EC%84%A0-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0

    댓글

    Designed by JB FACTORY