[JAVA] 65. Spring Security의 인증 방식

윤설안's avatar
Jul 25, 2025
[JAVA] 65. Spring Security의 인증 방식
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는 SecurityContextSecurityContextHolder에 저장함
  • SecurityContextHolderThreadLocal 기반 전역 저장소로,
    • 요청마다 사용자 인증 정보를 유지시켜줌

SecurityContextHolder란?

  • 보안 전용 박스를 모아두는 공간이라고 보면 된다.
  • SecurityContextHolderSpring 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

An's Blog