이유's Programming/Spring

Spring security 동작 과정에 대해서 공부

살아가는 이유_EU 2024. 11. 20. 09:05
728x90
반응형

Spring Security 과정에 대해 공부 

Spring Security는 Spring과는 별개로 작동하는 보안담당 프레임워크입니다. 보안은 모든 웹 애플리케이션의 가장 중요한 측면 중 하나이다. 사용자 데이터를 안전하게 유지하고 무단 접근을 방지하기 위해 개발자는 강력한 보안 조치를 구현해야 한다. 

 

 

기본용어

  • 접근 주체(Principal) : 보호된 리소스에 접근하는 대상
  • 인증(Authentication) : 보호된 리소스에 접근한 대상에 대해 누구인지, 애플리케이션의 작업을 수행해도 되는 주체인지 확인하는 과정(ex. Form 기반 로그인) => 즉, 누구인지?
  • 인가(Authorize) : 해당 리소스에 대해 접근 가능한 권한을 가지고 있는지 확인하는 과정(After Authentication, 인증 이후) => 즉, 어떤 것을 할 수 있는지?
  • 권한 : 어떠한 리소스에 대한 접근 제한, 모든 리소스는 접근 제어 권한이 걸려있음. 인가 과정에서 해당 리소스에 대한 제한된 최소한의 권한을 가졌는지 확인

 

크게 봤을 때 이제 [인증] 과정과 [인가] 과정으로 이루어져 있다. 확인을 해서 진짜 

 

 

1. Authentication (인증)

인증은 사용자의 신원을 확인하는 과정입니다.

1.1 사용자의 요청 처리

  • 사용자가 애플리케이션에 로그인 요청을 보냅니다.
  • 로그인 요청은 Spring Security의 필터 체인(Filter Chain)을 통과합니다. 기본적으로 요청은 UsernamePasswordAuthenticationFilter에서 처리됩니다.

1.2 AuthenticationManager 동작

  • AuthenticationManager는 사용자의 자격 증명을 확인하는 중심 컴포넌트입니다.
  • AuthenticationManager는 실제 인증을 수행하는 AuthenticationProvider에 작업을 위임합니다.
  • 기본적으로 Spring Security는 DaoAuthenticationProvider를 사용하여 데이터베이스와 사용자 인증을 처리합니다.

1.3 UserDetailsService와 UserDetails

  • DaoAuthenticationProvider는 UserDetailsService를 사용하여 사용자의 세부 정보를 로드합니다.
  • UserDetailsService는 사용자 정보를 제공하는 인터페이스입니다. 애플리케이션 개발자는 이를 구현하여 사용자 정보를 DB에서 로드할 수 있습니다.
  • UserDetails는 사용자 이름, 비밀번호, 권한 등 사용자의 세부 정보를 포함하는 객체입니다.

1.4 인증 결과 처리

  • 인증이 성공하면 Spring Security는 인증된 사용자 정보를 SecurityContextHolder에 저장합니다.
  • 인증 실패 시, Spring Security는 예외를 던지거나 적절한 응답을 반환합니다.

2. Authorization (권한 부여)

권한 부여는 인증된 사용자가 특정 리소스에 접근할 수 있는 권한이 있는지 확인하는 과정입니다.

인사시스템에서는 이제 

2.1 필터를 통한 요청 검증

  • 사용자가 리소스에 접근하면 요청은 Spring Security의 필터 체인을 다시 통과합니다.
  • AccessDecisionManager는 사용자의 권한과 요청된 리소스의 보안 설정을 비교하여 액세스를 허용할지 결정합니다.

2.2 @PreAuthorize 및 @Secured

  • Spring Security는 메서드 레벨에서 권한을 검사하기 위해 애너테이션 기반 권한 부여를 지원합니다.
    • @PreAuthorize: 메서드 실행 전에 권한을 검사합니다.
    • @Secured: 특정 권한이나 역할을 가진 사용자만 메서드를 호출할 수 있도록 제한합니다.

2.3 SecurityContextHolder 활용

  • 인증 정보는 SecurityContext를 통해 관리되며, SecurityContextHolder를 통해 접근할 수 있습니다.
  • 권한 부여 과정에서 인증된 사용자의 권한 정보가 사용됩니다.

 

3. Spring Security 기본 구성 요소

3.1 Security Filter Chain

  • 모든 HTTP 요청은 Spring Security의 필터 체인을 통과합니다.
  • 주요 필터:
    • UsernamePasswordAuthenticationFilter: 기본 로그인 처리
    • BasicAuthenticationFilter: Basic 인증 처리
    • ExceptionTranslationFilter: 예외 처리
    • FilterSecurityInterceptor: 최종 권한 확인

3.2 Security Config 클래스

Spring Security는 Java Config를 사용하여 설정합니다.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/public/**").permitAll()  // 공용 리소스 허용
                .antMatchers("/admin/**").hasRole("ADMIN")  // 관리자 전용
                .anyRequest().authenticated()  // 그 외 인증 필요
            .and()
            .formLogin()  // 기본 로그인 폼 사용
                .loginPage("/login")
                .permitAll()
            .and()
            .logout()
                .permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user").password("{noop}password").roles("USER")
            .and()
            .withUser("admin").password("{noop}password").roles("ADMIN");
    }
}

 


4. Spring Security 과정 요약

  1. 사용자가 요청을 보냄.
  2. 요청은 Security Filter Chain을 통과.
  3. 인증이 필요하면 AuthenticationManager에서 인증 수행.
  4. 인증이 성공하면 SecurityContextHolder에 저장.
  5. 리소스 접근 시, 사용자의 권한을 확인하여 요청을 허용하거나 거부.
728x90
반응형