Back-end/Spring

[Spring] Security 6 버전 인메모리 사용자 설정 간단한 예제

shoney9254 2024. 1. 30. 12:41
반응형

권한 설정과 표현식

Spring Security 5에서는 **AuthenticationManagerBuilder**를 사용하여 메모리 인증을 설정할 수 있었지만, Spring Security 6에서는 몇 가지 변경이 있을 수 있습니다.

 

1. PassworEncoder 사용 필수

먼저, Spring Security 6에서는 비밀번호 암호화에 대한 설정이 강화되었으므로 **{noop}**을 사용하는 것이 더 이상 권장되지 않습니다. 대신에 비밀번호 인코더를 명시적으로 지정해야 합니다. 그래서 아래와 같이 PasswordEncoder를 빈으로 등록하는 소스코드를 먼저 작성합니다.

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

 

2. inMemoryAuthentication 사용해서 메모리 인증 설정

아래는 Spring Security 6에 대한 예제입니다. 여기서는 **PasswordEncoder**를 사용하여 비밀번호를 인코딩하고 **inMemoryAuthentication**을 통해 사용자를 설정합니다.

@Primary
@Bean
public AuthenticationManagerBuilder configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication().withUser("user1").password(passwordEncoder().encode("1111")).roles("USER")
            .and().withUser("sys").password(passwordEncoder().encode("1111")).roles("SYS", "USER")
            .and().withUser("admin").password(passwordEncoder().encode("1111")).roles("ADMIN", "SYS", "USER");
    return auth;
}
  • AuthenticationManagerBuilder를 사용하여 세 가지 유형의 사용자 - 일반 사용자(USER), 시스템 관리자(SYS), 그리고 최고 관리자(ADMIN) - 를 설정합니다.
  • 패스워드는 인코드 사용해야합니다. (시큐리티6 이상부터 필수)
  • user에 roles를 통해 역할을 부여합니다.

 

3. url과 권한 Matcher

다음으로, HTTP 요청에 대한 보안을 설정합니다. HttpSecurity 객체를 사용하여 다양한 HTTP 경로에 대한 접근 제어를 설정할 수 있습니다.

스프링 시큐리티 5에서는 antMatchers를 사용해서 권한설정을 했다면, 6버전 이상부터는 requestMatchers 를 사용해서 url의 권한을 매칭할 수 있습니다.

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    return http
            .authorizeHttpRequests(ar -> ar
                    .requestMatchers("/user").hasRole("USER")
                    .requestMatchers("/admin/pay").hasRole("ADMIN")  // 더 구체적인 범위가 위에 나와야합니다.
                    .requestMatchers("/admin/**").hasAnyRole("ADMIN", "SYS") // 6.0 이하 버전에서는 antMatchers("/admin/**").access("hasRole('ADMIN') or hasRole('SYS')")
                    .anyRequest()
                    .authenticated()
            )
            .formLogin(withDefaults())
            .build();
}
  • 더 구체적인 범위가 위에 나와야지 세부 권한을 적용 할 수 있습니다.
  • 이 설정에서는 /user 경로는 USER 역할을 가진 사용자만, **/admin/pay**는 ADMIN 역할을 가진 사용자만 접근할 수 있습니다. /admin/** 경로는 ADMIN 또는 SYS 역할을 가진 사용자가 접근할 수 있습니다. 그리고 모든 요청은 인증을 필요로 합니다.

 

Spring Security를 이용하면 몇 가지 간단한 설정만으로도 강력한 인증 및 권한 관리 시스템을 구현할 수 있습니다. 이 글이 Spring Security의 기본적인 사용 방법을 이해하는 데 도움이 되길 바랍니다.

반응형