Spring Security
2025.11.19
1. Spring Security의 필요성
표준화된 단일 인증/인가 체계 제공
- ID/Password, OAuth, JWT 등 다양한 인증 방식을 통합적으로 지원
세션 및 토큰 관리 기능 제공
- 세션 기반 인증 / JWT 기반 인증 모두 지원
암호화와 비밀번호 보안 강화
- BCrypt 같은 강력한 해시 알고리즘으로 비밀번호를 안전하게 저장
권한 제어 기능 제공
- URL 단위, Method 단위(
@PreAuthorize)에서 Role 기반 접근 제어
웹 보안 취약점 방어
- CSRF 토큰 자동 생성
- 로그인 성공 시 세션ID 자동 재발급 → CSRF, 세션 고정 공격 방어
2. 인증(Authentication) / 인가(Authorization)
- 인증(Authentication): 사용자가 누구인지 식별하는 과정
- 인가(Authorization): 인증된 사용자가 특정 자원에 접근 가능한지 확인하는 과정
3. 세션 기반 인증 vs 토큰 기반 인증(JWT)
| 구분 | 세션 기반 인증 | 토큰 기반 인증(JWT) |
|---|
| 저장 위치 | 서버 세션 저장소 | 클라이언트(브라우저, 앱) |
| 클라이언트 보관 | 세션ID(쿠키) | JWT(Access Token) |
| 상태 | Stateful | Stateless |
| 서버 확장성 | 세션 공유 문제 존재 | 무상태 → 확장성 우수 |
| 보안 고려사항 | 세션 탈취 방지 | 토큰 탈취·만료·재발급 관리 필요 |
| 적합 환경 | 단일 서버, 소규모 서비스 | 분산 서버, MSA, 대규모 서비스 |
4. 인증 → 인가 → 응답 처리 흐름
- 클라이언트에서 요청이 들어오면 Spring Security FilterChain을 통과
UsernamePasswordAuthenticationFilter가 ID/PW 추출
AuthenticationManager가 UserDetailsService로 사용자 정보 검증
- 성공 → Authentication 객체 생성 후
SecurityContext에 저장
- 실패 →
ExceptionTranslationFilter가 401 처리
FilterSecurityInterceptor가 권한 확인
- 권한 없음 → 403 반환
- 권한 있음 → Controller로 전달
- Controller에서 정상 응답 반환
5. Spring Security 구조

Security Filter Chain
- 요청 URL에 매칭되는 필터 체인이 선택되어
여러 보안 필터가 순서대로 인증/인가 처리
DelegatingFilterProxy
- 서블릿 컨테이너 필터
- 실제 보안 처리는
FilterChainProxy로 위임하는 브릿지 역할
FilterChainProxy
- 요청과 매칭되는 SecurityFilterChain 선택 및 실행
6. 주요 동작 필터
UsernamePasswordAuthenticationFilter
- 로그인 요청에서 사용자명/비밀번호 추출
- 인증 성공 시 Authentication 생성 → SecurityContext 저장
ExceptionTranslationFilter
- 인증 실패(401), 접근 거부(403) 예외 처리
FilterSecurityInterceptor
7. 주요 컴포넌트
AuthenticationManager
- 로그인 요청 검증
- Authentication 객체 반환
UserDetailsService
SecurityContext
- 인증된 사용자 정보를 저장
- 요청마다
SecurityContextHolder로 관리
8. 요청 흐름 (Spring Boot)
- 클라이언트가
/login으로 인증 요청 (ID/PW)
DelegatingFilterProxy가 요청을 Security Filter Chain으로 전달
UsernamePasswordAuthenticationFilter가 ID/PW 추출 후
AuthenticationManager에게 인증 위임
- 내부적으로
AuthenticationProvider →
UserDetailsService + PasswordEncoder 사용
- 인증 성공 → Authentication 생성 → SecurityContext 저장
인증 실패 → ExceptionTranslationFilter가 401 응답 처리
FilterSecurityInterceptor가 URL/메서드 권한 체크
- 권한 통과 후 Controller → Response 반환