Springboot

[Security] Spring Security의 흐름

KJihun 2025. 4. 2. 12:21
728x90

앱 실행 시 Spring Boot가 @Configuration, @EnableWebSecurity에 의해 WebSecurityConfig자동 실행

1. corsConfigurationSource()

CORS(Cross-Origin Resource Sharing) 설정 

도메인, 포트, 프로토콜 을 기준으로 HTTP 요청을 보내는 것을 허용할지 제어하는 보안 메커니즘

CSRF, XSS 같은 공격을 막기 위해 반드시 구현하여야 한다

 

2-1. authenticationManager()

인증을 처리하는 매니저

  • 내부적으로 UserDetailsService를 통해 사용자 정보를 불러옴
  • 로그인 시 JwtAuthenticationFilter에서 authenticationManager를 사용해서 인증 처리함

JwtAuthorizationFilter

  • 모든 요청을 가로채서 JWT 토큰이 있는지 확인
  • 유효한 토큰이면 인증 객체(SecurityContext) 를 만들어서 Spring Security에게 알려주는 역할
  • OncePerRequestFilter : 무조건 한 번만 실행되게 해주는 베이스 클래스

 

 

    1. 요청 헤더 및 쿠키에서 JWT 토큰 추출(Authorization: Bearer <token> 형식에서 Bearer 를 제거한 부분)
    2. JWT 유효성 검증(만료됐거나, 서명이 잘못되었거나, 포맷이 틀렸다면 → 바로 리턴 (다음 필터로 안 넘어감))
    3. JWT 토큰을 파싱해서 안에 들어 있는 사용자 정보(주로 username)를 꺼낸 후 setAuthentication으로 전달
    4. setAuthentication()
      1. createAuthentication()을 호출해 DB에서 유저 정보를 조회하고, 가져옴
      2. UsernamePasswordAuthenticationToken을 만들어 SecurityContext에 인증 객체를 수동으로 설정
      3. 이후 요청은 Spring Security가 인증된 사용자임을 인식
      4. @AuthenticationPrincipal 등으로 컨트롤러에서 사용자 정보에 접근  가능

 

2-2. jwtAuthenticationFilter()

로그인 요청을 처리해서 JWT 토큰을 생성해주는 필터

  • UsernamePasswordAuthenticationFilter를 상속한 커스텀 필터

주요 기능

  • 로그인 요청 처리
  • 인증 성공 시 JwtUtil로 AccessToken + RefreshToken 생성
  • Redis에 refresh token 저장 등

4. securityFilterChain(HttpSecurity http)

Spring Security의 핵심 보안 정책 설정(CSRF 비활성화, 세션 비활성화 (stateless) CORS 설정 적용 등)

 

5. Filter

http.addFilterBefore : 수행될 필터 등록. 필터는 앞에서부터 순차적으로 실행

http.addFilterBefore(
	new JwtAuthorizationFilter(jwtUtil, userDetailsService), UsernamePasswordAuthenticationFilter.class); 
http.addFilterBefore(new AuthExceptionFilter(), JwtAuthorizationFilter.class);

🔸 AuthExceptionFilter

예외 처리 필터 (토큰 만료, 인증 실패 시 커스텀 에러 반환)

  • 모든 필터보다 가장 먼저 실행
  • 예외를 잡아 커스텀 응답 (401, 403 등) 제공

🔸 JwtAuthorizationFilter

요청에 포함된 JWT를 검증하고, 사용자 인증을 설정 (SecurityContext에 등록)

  • 모든 요청마다 실행됨 (로그인이 아닌 일반 요청)
  • JWT 파싱 → 유효성 검증 → DB에서 사용자 정보 조회 → 인증 처리

 

 

🔄 전체 흐름 정리

🔐 로그인 요청 시 (POST /login)

[JwtAuthenticationFilter]
    ↓
 인증 성공 → JwtUtil로 토큰 생성
    ↓
 토큰 응답 반환 + Redis 저장 (선택)
 
 

🛡️ 인증된 API 요청 시

[AuthExceptionFilter]
    ↓
[JwtAuthorizationFilter]
    ↓
 Jwt 검증 + username 추출 → DB 조회 (UserDetailsServiceImpl)
    ↓
 SecurityContextHolder에 인증 저장
    ↓
 Controller 도착