블로그/Backend
Backend미드2026-06-13

Spring Security의 인증 흐름을 설명해주세요

한 줄 답변

인증 필터가 요청을 가로채 토큰화하고, AuthenticationManager가 적절한 Provider에게 검증을 위임하여 최종 인증 객체를 SecurityContext에 저장하는 전략적 흐름입니다.

핵심 개념 정리

Spring Security는 기본적으로 서블릿 필터 체인을 기반으로 보안을 처리하는 강력한 프레임워크입니다. 사용자가 아이디와 비밀번호를 입력하여 로그인을 요청하면, `UsernamePasswordAuthenticationFilter`가 이 요청을 가로채어 입력받은 정보를 바탕으로 `UsernamePasswordAuthenticationToken`을 생성합니다. 이 시점의 토큰은 '인증되지 않은' 상태이며, 보안상의 이유로 비밀번호 등 민감한 정보가 포함된 채로 실제 인증을 담당하는 핵심 엔진인 `AuthenticationManager`에게 전달됩니다.

`AuthenticationManager` 인터페이스의 실제 구현체인 `ProviderManager`는 자신이 관리하는 여러 `AuthenticationProvider`들을 순회하며 해당 토큰을 처리할 수 있는 적절한 구현체를 찾습니다. 실무에서 가장 흔히 쓰이는 `DaoAuthenticationProvider`는 `UserDetailsService`를 호출하여 데이터베이스나 메모리에서 사용자 정보를 `UserDetails` 형태로 가져옵니다. 이후 `PasswordEncoder`를 사용하여 사용자가 입력한 비밀번호와 저장된 암호화 비밀번호를 비교 검증하는 과정을 거치게 됩니다.

인증이 성공적으로 완료되면, 시스템은 사용자의 정보와 권한(Authorities)을 모두 포함한 '인증된' `Authentication` 객체를 새롭게 생성합니다. 이 객체는 다시 필터로 반환되어 전역적으로 접근 가능한 `SecurityContextHolder` 내부의 `SecurityContext`에 안전하게 저장됩니다. 이 과정 덕분에 이후의 비즈니스 로직이나 컨트롤러 계층에서는 `SecurityContextHolder.getContext().getAuthentication()`을 통해 현재 로그인한 사용자의 정보를 스레드 세이프하게 참조할 수 있게 됩니다.

비교 정리

항목AuthenticationProviderUserDetailsService
주요 역할전달된 토큰을 바탕으로 실제 인증 로직(비밀번호 비교 등)을 수행ID 등 고유 식별자를 통해 저장소에서 사용자 세부 정보를 조회
결과물권한 정보가 포함된 인증된 Authentication 객체 반환사용자 정보가 담긴 UserDetails 구현체 객체 반환
의존성비밀번호 검증을 위해 종종 UserDetailsService를 주입받아 사용주로 Repository나 외부 API 등 데이터 소스에 의존
커스터마이징LDAP, 소셜 로그인 등 특수한 인증 매커니즘이 필요할 때 구현DB 테이블 구조나 사용자 도메인 모델이 다를 때 주로 구현

면접에서 이렇게 답하세요

단순히 순서를 암기해서 나열하기보다, Spring Security가 '전략 패턴'을 통해 어떻게 유연성을 확보했는지 강조하세요. 예를 들어, AuthenticationManager가 여러 Provider를 관리함으로써 폼 로그인과 소셜 로그인을 동시에 처리할 수 있는 구조임을 설명하는 것이 좋습니다. 또한 실무에서 JWT를 도입할 때 기본 필터를 대체하거나 OncePerRequestFilter를 상속받아 커스텀 인증 필터를 구현했던 구체적인 사례를 언급하면 훨씬 전문성 있는 답변이 됩니다.

자주 묻는 추가 질문

Q. AuthenticationManager와 ProviderManager의 관계는 무엇인가요?

AuthenticationManager는 인증을 정의하는 인터페이스이며, ProviderManager는 이의 대표적인 구현체로 여러 Provider를 리스트로 관리하며 인증을 위임합니다.

Q. 인증 성공 후 사용자 정보는 어디에 저장되며 어떻게 참조하나요?

SecurityContextHolder 내의 SecurityContext에 저장됩니다. ThreadLocal을 사용하여 요청 처리 스레드 어디서든 인증 객체에 접근할 수 있습니다.

Q. 비밀번호 암호화 없이 로그인을 구현할 수 있나요?

NoOpPasswordEncoder를 사용하면 가능하지만, 보안상 절대 권장되지 않습니다. 실무에서는 BCryptPasswordEncoder 등을 사용하는 것이 표준입니다.

커뮤니티 하이라이트

필터 체인 내부에서 어느 시점에 인증이 일어나는지 이해하는 게 중요하더라고요. SecurityConfig에서 커스텀 필터 위치 잡을 때 고생했던 경험이 도움 됐습니다.

@dev_junior_pro34

AuthenticationProvider를 직접 구현해본 경험을 이야기하면 설계 능력을 어필하기 좋습니다. 소셜 로그인 연동 시 이 구조가 어떻게 확장되는지 설명해 보세요.

@backend_architect21

42명의 개발자가 이 질문에 참여했습니다

관련 면접 질문

앱에서 직접 답변해보세요

매일 3개의 면접 질문에 답변하고,
다른 개발자들의 답변을 비교해보세요.

무료로 시작하기