Spring Security란 ?
Spring 기반 애플리케이션에서 인증 (Authentication)과 인가(Authorization)를 처리하는 보안 프레임워크이다. 필터를 기반으로 동작하며 수십 개의 필터들이 등록되어 순차적으로 실행된다.
- 인증 (Authentication) : 해당 사용자가 본인이 맞는지를 확인하는 절차
- 인가 (Authorization) : 인증된 사용자가 요청된 자원에 접근 가능한가를 결정하는 절차
Spring Security Architecture

- Http Request : 사용자가 로그인 요청을 보낸다.
- AuthenticationFilter : 요청을 제일 먼저 가로채는 보안 필터이다. 입력 받은 아이디와 비밀번호로 UsernamePasswordAuthenticationToken을 생성한다. 이 토큰 객체는 아직 인증되지 않은 상태이다.
- AuthenticationManager : AuthenticationFilter는 토큰을 AuthenticationManager에게 전달한다. AuthenticationManager는 실제로 인증할 수 있는 Provider에게 위임하는 역할만 한다. 구현체로는 보통 ProviderManager가 사용된다.
- AuthenticationProvider : 실질적인 인증 로직을 담당한다. 여러가지 Provider가 등록될 수 있으며, AuthenticationManager가 순차적으로 위임한다.
- UserDetailsService : AuthenticationProvider가 사용자 정보를 조회하기 위해 호출한다. 주로 DB에서 사용자 정보를 가져오도록 커스터마이징한다.
- UserDetails : UserDetailsService가 반환하는 사용자 정보 객체이다. Spring Security가 이해할 수 있는 형태로 감싼 User 엔티티이다. 내부에 username, password, role 같은 권한 정보가 포함되어 있다.
- UserDetails → AuthenticationProvider : 조회된 UserDetails를 바탕으로, 입력받은 비밀번호와 DB의 비밀번호를 비교한다. 비밀번호가 일치하고 계정이 활성화 상태라면 인증에 성공한 것이다.
- 인증 완료된 Authentication 객체 반환 : AuthenticationProvider 는 인증에 성공하면, '인증됨' 상태의 Authenticaiton 객체를 생성해서 AuthenticationManager에 반환한다.
- AuthenticationManager → AuthenticationFilter : AuthenticationManager는 이 인증 객체를 AuthenticationFilter에게 다시 돌려준다.
- SecurityContextHolder 저장 : AuthenticationFilter는 최종적으로 인증 객체를 SecurityContextHolder에 저장한다. SecurityContextHolder는 현재 스레드의 SecurityContext를 보관하는 곳으로, 애플리케이션 전역에서 `@AuthenticationPrincipal` 같은 방식으로 현재 로그인한 사용자를 가져올 수 있게 된다.
Spring Security와JWT
지금까지 정리한 것은 Spring Security의 기본 구조(세션 기반 인증)이었다. Spring Security 자체는 원래 세션(Session)을 사용하는 구조라서 로그인 성공 시 SecurityContextHolder 안에 인증 정보를 저장하고 세션 ID로 인증을 유지한다. 그러나 이번에는 JWT(토큰 기반 인증)을 붙여서 Stateless하게 운영하는 방식에 대해서 알아보자.

- 사용자가 아이디와 비밀번호를 서버로 전송한다.
- AuthenticationManager 인증 : Spring Security의 기본 구조 처럼 `AuthenticationManager → AuthenticationProvider → UserDetailsService` 를 거쳐서 유효한 사용자임을 검증한다.
- 인증에 성공을 하면 세션을 만드는 대신, JWT Access Token과 Refresh Token을 생성해서 클라이언트에 반환한다.
- 클라이언트는 토큰을 로컬 스토리지나 쿠키에 저장한다.
- 이후 요청마다 클라이언트는 `Authorization: Bearer <AccessToken>` 헤더에 토큰을 담아서 보낸다.
- Spring Security의 기본 `UsernamePasswordAuthenticationFilter` 앞에 커스텀 JWT 필터를 추가한다. 이 필터가 헤더에서 토큰을 꺼내서 검증하고 유효하면 SecurityContextHolder에 Authentication 객체를 직접 넣는다.
'Spring' 카테고리의 다른 글
| [Spring] 레이어드 아키텍처(Layered Architecture)와 Spring MVC (0) | 2025.08.05 |
|---|---|
| [Spring] DispatcherServlet과 스프링부트 동작 구조 (3) | 2025.07.26 |
| [Spring] JWT 토큰 인증 & 쿠키, 세션, 토큰 (0) | 2025.07.16 |
| [Spring] 서블릿(Servlet)과 서블릿 컨테이너 (0) | 2025.07.16 |
| [Spring] 스프링 컨테이너와 빈 (0) | 2025.07.16 |
