SpringBoot 를 배워보자/7. 보안

사용자 인증 및 권한 부여

_Blue_Sky_ 2024. 9. 29. 16:06
728x90
728x90
 

스프링 부트 사용자 인증 및 권한 부여 상세 가이드

소개

스프링 부트는 개발 생산성을 높여주는 강력한 프레임워크입니다. 특히, Spring Security를 기반으로 구축된 사용자 인증 및 권한 부여 기능은 애플리케이션의 보안을 강화하는 데 필수적인 요소입니다. 이 글에서는 스프링 부트에서 사용자 인증 및 권한 부여를 구현하는 방법을 상세하게 설명하고, 다양한 시나리오에 대한 예시를 제공합니다.

사용자 인증

사용자 인증은 사용자가 자신이 주장하는 사람인지 확인하는 과정입니다. 일반적으로 사용자는 아이디와 비밀번호를 입력하여 인증을 시도하고, 시스템은 입력된 정보를 데이터베이스에 저장된 정보와 비교하여 일치 여부를 판단합니다.

1. UserDetailsService 인터페이스

  • 역할: 사용자 정보를 데이터베이스에서 조회하는 역할을 합니다.
  • 구현: loadUserByUsername 메소드를 구현하여 사용자 이름을 기반으로 UserDetails 객체를 반환합니다.
  • UserDetails: 사용자 정보를 담는 인터페이스로, getUsername, getPassword, getAuthorities 등의 메소드를 제공합니다.
728x90

2. PasswordEncoder

  • 역할: 사용자가 입력한 비밀번호를 암호화하여 저장하고, 인증 시 입력된 비밀번호와 암호화된 비밀번호를 비교합니다.
  • 구현: Spring Security는 다양한 PasswordEncoder를 제공하며, BCryptPasswordEncoder가 일반적으로 많이 사용됩니다.

3. AuthenticationManager

  • 역할: 인증 과정을 관리하는 인터페이스입니다.
  • 구현: Spring Security는 AuthenticationManagerBuilder를 통해 AuthenticationManager를 생성하고, UserDetailsService와 PasswordEncoder를 설정합니다.

권한 부여

권한 부여는 인증된 사용자에게 특정 리소스나 기능에 대한 접근 권한을 부여하는 과정입니다. Spring Security는 역할 기반의 접근 제어(Role-Based Access Control, RBAC)를 지원하여, 사용자에게 다양한 역할을 부여하고, 각 역할별로 접근 가능한 리소스를 설정할 수 있습니다.

1. @PreAuthorize, @PostAuthorize 어노테이션

  • 역할: 메소드 단위로 권한을 설정할 수 있습니다.
  • @PreAuthorize: 메소드 실행 전에 권한을 검사합니다.
  • @PostAuthorize: 메소드 실행 후에 권한을 검사합니다.

2. HttpSecurity

  • 역할: HTTP 요청에 대한 보안 설정을 구성합니다.
  • authorizeRequests: HTTP 요청에 대한 권한을 설정합니다.
  • antMatchers: 특정 URL 패턴에 대한 권한을 설정합니다.
  • hasRole, hasAnyRole: 사용자의 역할을 기반으로 권한을 설정합니다.

실제 예시

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

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

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/user/**").hasAnyRole("USER", "ADMIN")
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/")
                .permitAll()
                .and()
            .logout()
                .logoutSuccessUrl("/")
                .permitAll();
    }
}
  • 위 예시는 /admin/** URL에 접근하려면 ADMIN 역할을 가져야 하고, /user/** URL에 접근하려면 USER 또는 ADMIN 역할을 가져야 함을 의미합니다.
  • formLogin 메소드는 로그인 페이지 설정을 담당하며, logout 메소드는 로그아웃 설정을 담당합니다.

추가 기능

  • 커스텀 AuthenticationProvider: Spring Security의 기본 인증 방식 외에 커스텀 인증 로직을 구현할 수 있습니다.
  • OAuth2: 외부 인증 서비스(Google, Facebook 등)를 이용한 인증을 지원합니다.
  • Remember-Me: 사용자 정보를 쿠키에 저장하여 자동 로그인 기능을 제공합니다.
  • Session Management: 세션 관리 기능을 통해 사용자 상태를 유지합니다.

결론

스프링 부트는 Spring Security를 통해 강력한 사용자 인증 및 권한 부여 기능을 제공합니다. 이 글에서 설명한 내용을 바탕으로 다양한 보안 요구사항을 충족하는 애플리케이션을 개발할 수 있습니다.

 

728x90
728x90

'SpringBoot 를 배워보자 > 7. 보안' 카테고리의 다른 글

XSS 방지  (0) 2024.09.29
CSRF 보호  (0) 2024.09.29
스프링 시큐리티 기본 설정  (0) 2024.09.29