[Spring] Spring Security의 구조와 흐름

2025. 7. 17. 19:24·Spring

Spring Security란 ? 

Spring 기반 애플리케이션에서 인증 (Authentication)과 인가(Authorization)를 처리하는 보안 프레임워크이다. 필터를 기반으로 동작하며 수십 개의 필터들이 등록되어 순차적으로 실행된다. 

  • 인증 (Authentication) :  해당 사용자가 본인이 맞는지를 확인하는 절차 
  • 인가 (Authorization) : 인증된 사용자가 요청된 자원에 접근 가능한가를 결정하는 절차 

Spring Security Architecture 

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

Spring Security와JWT

지금까지 정리한 것은 Spring Security의 기본 구조(세션 기반 인증)이었다. Spring Security 자체는 원래 세션(Session)을 사용하는 구조라서 로그인 성공 시 SecurityContextHolder 안에 인증 정보를 저장하고 세션 ID로 인증을 유지한다. 그러나 이번에는 JWT(토큰 기반 인증)을 붙여서 Stateless하게 운영하는 방식에 대해서 알아보자.

  1. 사용자가 아이디와 비밀번호를 서버로 전송한다. 
  2. AuthenticationManager 인증 : Spring Security의 기본 구조 처럼 `AuthenticationManager → AuthenticationProvider → UserDetailsService` 를 거쳐서 유효한 사용자임을 검증한다. 
  3. 인증에 성공을 하면 세션을 만드는 대신, JWT Access Token과 Refresh Token을 생성해서 클라이언트에 반환한다. 
  4. 클라이언트는 토큰을 로컬 스토리지나 쿠키에 저장한다. 
  5. 이후 요청마다 클라이언트는 `Authorization: Bearer <AccessToken>` 헤더에 토큰을 담아서 보낸다. 
  6. 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
'Spring' 카테고리의 다른 글
  • [Spring] 레이어드 아키텍처(Layered Architecture)와 Spring MVC
  • [Spring] DispatcherServlet과 스프링부트 동작 구조
  • [Spring] JWT 토큰 인증 & 쿠키, 세션, 토큰
  • [Spring] 서블릿(Servlet)과 서블릿 컨테이너
erika0915
erika0915
백엔드 개발자가 되고 싶어요 .
  • erika0915
    erikoding
    erika0915
  • 전체
    오늘
    어제
    • 분류 전체보기 (78)
      • 프로젝트 (13)
        • 끼니콩 (3)
        • 덕메랑 (3)
        • handDoc (7)
        • Haeil (0)
      • Java (9)
        • 클린코더스 (0)
      • Spring (30)
      • Redis (3)
      • CS (7)
        • 운영체제 (3)
        • 컴퓨터구조 (0)
        • 네트워크 (4)
      • DevOps (2)
      • 코딩테스트 (0)
      • Tech (14)
        • TDD (1)
        • 정리 (5)
        • 우테코 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    CoolSMS
    Network
    레디스
    도커
    자바
    MongoDB
    파인튜닝
    지라
    jira
    몽고디비
    OS
    TDD
    AI
    coderabbit
    STT
    Spring
    네트워크
    java
    redis
    promtail
    운영체제
    git
    springboot
    스프링부트
    깃허브
    github
    docker
    스프링
    깃
    코드레빗
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
erika0915
[Spring] Spring Security의 구조와 흐름

티스토리툴바