[Spring Security] Spring Security란? SecurityFilterChain과 인증 흐름
by 우와한개발자
1. Spring Security란
- 스프링 기반의 어플리케이션 인증과 권한 등 보안을 담당하는 프레임워크
| 기능 | 설명 |
| 인증(Authentication) | 사용자가 누구인지 확인 (ex. 로그인) |
| 인가(Authorization) | 특정 리소스에 접근 가능한지 검사 (ex. 관리자만 가능 등) |
| CSRF 보호 | Cross Site Request Forgery 공격 방지 |
| 세션 관리 | 세션 고정 공격 방지, 동시 로그인 제한 등 |
| 패스워드 인코딩 | BCrypt 등 안전한 해시 알고리즘 사용 |
| 커스터마이징 용이 | OAuth2, JWT, 커스텀 필터 등 유연한 확장성 |
2. Spring Security 동작 흐름
1) Spring Filter Chain
- HTTP 요청은 DispatcherServlet(컨트롤러)에 도달하기 전에 여러 개의 필터를 거침
- Spring Security는 이 필터 체인에 DelegatingFilterProxy를 통해 자신의 보안 필터들을 삽입
HTTP 요청
→ DelegatingFilterProxy
→ FilterChainProxy (Spring Security의 필터 체인 관리자)
→ SecurityFilterChain (등록된 필터들 순차 실행)
→ DispatcherServlet
→ Controller

2) Spring Security Authenticatioin Architecture

- 사용자가 로그인 정보와 함께 인증을 요청함.(Http Request)
- AuthenticationFilter(UsernamePasswordAuthenticationFilter)가 요청을 가로채고 인증용 객체(UsernamePasswordAuthenticationToken)를 생성함.
- ProviderManager에게 UsernamePasswordAuthenticationToken 객체를 전달함. (ProviderManager는 AuthenticationManager의 구현체)
- AuthenticationProvider가 UsernamePasswordAuthenticationToken 객체를 받아 인증 로직을 처리함.
- UserDetailsService가 데이터베이스에서 사용자정보(username,password,role등)를 로드함. UserDetailsService를 구현한 클래스를 직접 구현해야함.
- 로드된 사용자 정보를 기반으로 UserDetails 객체를 생성해서 반환. 이때 실제 객체 생성에는 User 클래스가 사용됨.
- AuthenticationProvider가 입력 정보와 UserDetails를 비교하여 인증을 수행함.
- 인증이 성공 시 권한 정보가 포함된 Authentication 객체를 반환함.
- Authentication 객체가 UsernamePasswordAuthenticationFilter로 반환됨.
- Authentication 객체가 SecurityContext에 저장됨
3) Authentication 객체 구성 요소
| 구성 요소 | 설명 |
| principal | 현재 인증된 사용자 정보 |
| credentials | 비밀번호 등 인증 정보 |
| authorities | 권한 목록 |
| authenticated | 인증 여부 |
| 상황 | 구현 클래스 | principal | 설명 |
| 인증시도 전 | UsernamePasswordAuthenticationToken | username 문자열 | 사용자 입력 값(ID, PW)을 담고 인증되지 않은 상태 |
| 인증성공 후 | UsernamePasswordAuthenticationToken (authenticated=true) | UserDetails 객체 | 사용자 정보, 권한, 인증 여부 등이 채워진 상태 |
3. Spring Security 인증 방법
| 인증 방식 | 설명 | 주요 사용 사례 |
| 사용자 이름 및 비밀번호 인증 | 가장 기본적이고 널리 사용되는 인증 방식으로, 로그인 폼이나 REST API에서 자주 활용됨 | 웹 애플리케이션 로그인 기능 |
| JWT (JSON Web Token) 인증 | RESTful API와 분산 시스템에서 사용하는 토큰 기반 인증으로, 서버 상태를 유지하지 않고 인증 처리 가능 | 모바일 앱과 백엔드 간 통신 |
| OAuth 2.0 로그인 | Google, Facebook, GitHub 등 외부 소셜 로그인 제공자를 통해 인증 처리 | 소셜 로그인을 지원하는 웹 애플리케이션 |
| OAuth 2.0 Resource Server | OAuth 2.0 액세스 토큰을 검증하여 API 리소스를 보호하는 방식 | 인증된 사용자만 API 접근 허용 |
| LDAP 인증 | Active Directory나 OpenLDAP 같은 디렉터리 서비스를 활용한 인증 방식 | 사내 시스템 중앙 집중식 인증 |
'프레임워크 > Spring' 카테고리의 다른 글
블로그의 정보
우와한개발자 님의 블로그
우와한개발자