Spring Security Architecture

✒️ 2025-07-01 08:11 내용 수정


참고 자료 : Spring Security Servlet Applications Architecture, Introduction to Spring Security Architecture

Spring Security의 특성


Architecture

1. DelegatingFilterProxy

2. FilterChainProxy

3. SecurityFilterChain

4. SecurityFilter

@Configuration
@EnableWebSecurity // Security 자동 설정
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
	        // CsrfFilter
            .csrf(Customizer.withDefaults())
            // AuthorizationFilter
            .authorizeHttpRequests(authorize -> authorize
                .anyRequest().authenticated()
            )
            // BasicAuthenticationFilter
            .httpBasic(Customizer.withDefaults())
            // UsernamePasswordAuthenticationFilter
            .formLogin(Customizer.withDefaults());
        return http.build();
    }

}
클래스 설명
ChannelProcessingFilter HTTP나 HTTPS와 같은 프로토콜을 확인
SecurityContextPersistenceFilter 사용자의 세션 기간동안 지속되는 인증 정보를 확인
UsernamePasswordAuthenticationFilter 제공된 credentials를 확인하고, 유효한 경우 AuthenticationObject를 생성
인증이 필요한 URL 요청이 들어왔을 때 인증되지 않은 상태라면 로그인 페이지를 반환
ConcurrentSessionFilter 사용자가 이용할 수 있는 session의 개수를 조절하며, session 제한 초과 시의 경우도 처리
LogoutFilter 로그아웃 요청에 개입하여 사용자의 session을 종료
RememberMeAuthenticationFilter 로그아웃을 한 이후에도 session들이 사용자를 기억하도록 설정
AnonymousAuthenticationFilter 인증되진 않았지만 애플리케이션의 몇몇 부분에 제한된 접근을 가질 수 있는 익명 사용자를 생성
SessionManagementFilter 유효하지 않은 session, Session fixation 방지, 그리고 session과 연관된 다른 일들을 처리
ExceptionTranslationFilter 예외를 인증되지 않은 응답(unauthenticated response)로 변환
FilterSecurityInterceptor 사용자가 중요한 역할을 가졌는지 확인하고, 특정 리소스에 접근을 허가 설정
CsrfFilter CSRF 공격 방지를 위한 Filter

Authentication Architecture and Components

참고 자료 : Spring Servlet Authentication Architecture

1. AuthenticationManager

2. AuthenticationProvider

클래스 설명
DaoAuthenticationProvider UserDetailsService를 사용하여 사용자의 정보를 DB에서 가져와 credential(자격증명)과 비교
LdapAuthenticationProvider LDAP 서버를 통한 인증에 사용
JwtAuthenticationProvider 사용자의 JWT token을 검증할 때 사용

3. UserDetailsService

4. PasswordEncoder

클래스 설명
BCryptPasswordEncoder Spring Security에서 비밀번호 해시화에 일반적으로 추천하는 설정.
각 패스워드에 랜덤 솔트를 생성을 담당
NoOpPasswordEncoder 어떤 해싱이나 암호화를 수행하지 않음.
비밀번호를 플레인 텍스트로 저장하기 때문에 매우 취약
StandardPasswordEncoder 단방향 해시 알고리즘을 사용하기에 보안에 취약하여 추천하지 않음
MessageDigestPasswordEncoder 비밀번호 해시화에 SHA-256과 같은 특정 메시지 다이제스트 알고리즘을 사용.
플레인 텍스트보단 안전하지만 BCrypt보단 강력하지 않아 현대 애플리케이션에선 권장하지 않음.
SCryptPasswordEncoder BCrypt와 비슷한 해시 알고리즘
메모리를 많이 사용하도록 설계되어 특정 타입의 공격에 저항이 있음.

5. SecurityContextHolder

6. SecurityContext

// Spring 공식 예시

// SecurityContext
SecurityContext context = SecurityContextHolder.createEmptyContext();

// Authentication
Authentication authentication =
    new TestingAuthenticationToken("username", "password", "ROLE_USER");
context.setAuthentication(authentication);

SecurityContextHolder.setContext(context);

7. Authentication


인증 흐름

  1. 클라이언트가 웹 사이트에 로그인을 시도한다.
  2. SecurityFilterChain에서 요청에 개입한다.
  3. 만약 인증이 안되었다면(로그인을 안 했다면) AuthenticationManager에 요청을 전송하고, credential(자격 증명)이 일치한다면 AuthenticationManager는 자격 증명이 성공했음을 표시하는 Authentication 객체를 생성한다.
  4. AuthenticationManager는 생성된 Authentication 객체를 사용하여 사용자의 credential(자격 증명)을 검증한다.
  5. AuthenticationProviderPasswordEncoder를 사용하여 비밀번호를 저장하고 비교한다.
  6. AuthenticationProvider는 사용자 정보를 가져오기 위해 UserDetailsService를 사용하여 DB에 정보를 요청한다.
  7. UserDetailsService가 DB에서 읽어온 정보를 UserDetails로 구현한 객체를 반환한다.
  8. AuthenticationProvider가 사용자의 credential(자격 증명)을 저장되거나 DB로부터 가져온 데이터와 비교하고, 사용자에게 인증 과정의 결과를 성공/미인증 응답으로 전송한다.
  9. 인메모리 세션 저장소인 SecurityContextHolderAuthentication 객체를 저장한다.

spring_security_architecture.png