[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