Spring Security가 어떤 방식으로 인증을 하며Session
에 어떻게 저장하는지 설명
SFC(Spring Security Filter Chain)는 어떻게 인증하는가?
- 사용자가 요청을 보낼 때, Spring Security는 수십 개의 필터 체인(SFC) 을 순차적으로 실행함
- 이 필터들은 인증(Authentication), 권한 검사(Authorization), 세션 유지 등 보안 관련 로직을 담당함
- 이 모든 필터를 통과해야만 실제 컨트롤러(DispatcherServlet)에 도달할 수 있음
Session
이 있다고 해서 인증된 게 아님
- 흔히 “
Session
이 있으니까 로그인된 거 아냐?”라고 생각하지만
→ Spring Security는 세션 자체를 보지 않음
- Spring Security가 인증 여부를 판단하는 기준은:
Session
안에SecurityContext
라는 "보안 전용 박스"가 존재하는가?
보안 전용 박스의 이름은 SecurityContext
- Spring Security는
SecurityContext
를SecurityContextHolder
에 저장함
SecurityContextHolder
는 ThreadLocal 기반 전역 저장소로,
요청마다 사용자 인증 정보를 유지시켜줌
SecurityContextHolder
란?
- 보안 전용 박스를 모아두는 공간이라고 보면 된다.
SecurityContextHolder
는 Spring Security에서 인증 정보를 저장하는 핵심 클래스다.
- 내부적으로 현재 스레드에 바인딩된 인증(SecurityContext) 정보를 보관하고 있음.
- 쉽게 말하면,
"이 요청을 보낸 사용자는 누구인지?"를 기억하는 저장소
인증된 사용자 정보는 Authentication
에 담긴다
SecurityContext
안에는 Authentication
객체가 존재함.이게 바로 Spring Security가 사용하는 "로그인 인증 정보" 다.
Authentication {
Object principal; // 로그인한 사용자 정보 (예: UserDetails 구현체)
Object credentials; // 비밀번호 (성공 후엔 null 처리됨)
Collection<? extends GrantedAuthority> authorities; // 권한 목록
boolean authenticated; // 인증 완료 여부 (true면 인증됨)
}
우리가 직접 Authentication
을 만들어 저장할 수도 있다
Spring Security는 기본적으로 로그인 성공 시 Authentication을 만들어 저장하지만,우리가 직접 만들어서 넣을 수도 있음
Authentication auth = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(auth);
- 이 방식은 소셜 로그인(OAuth) 또는 자동 로그인 처리 시 자주 사용됨
- 이 코드가 실행되면 Spring Security는 “이미 인증된 사용자”로 인식함
Share article