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 : 무조건 한 번만 실행되게 해주는 베이스 클래스
- 요청 헤더 및 쿠키에서 JWT 토큰 추출(Authorization: Bearer <token> 형식에서 Bearer 를 제거한 부분)
- JWT 유효성 검증(만료됐거나, 서명이 잘못되었거나, 포맷이 틀렸다면 → 바로 리턴 (다음 필터로 안 넘어감))
- JWT 토큰을 파싱해서 안에 들어 있는 사용자 정보(주로 username)를 꺼낸 후 setAuthentication으로 전달
- setAuthentication()
- createAuthentication()을 호출해 DB에서 유저 정보를 조회하고, 가져옴
- UsernamePasswordAuthenticationToken을 만들어 SecurityContext에 인증 객체를 수동으로 설정
- 이후 요청은 Spring Security가 인증된 사용자임을 인식
- @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 도착
'Springboot' 카테고리의 다른 글
[Spring] Spring AOP(Aspect-Oriented Programming) (1) | 2025.04.16 |
---|---|
[Spring] Filter, Interceptor, AOP의 차이점 (0) | 2025.04.16 |
[Springboot] Client-Server 구조 정리 (0) | 2025.03.26 |
[Springboot] JWT 0.15.2 (0) | 2024.06.22 |
[Springboot] QueryDSL을 활용한 물물교환 경매 시스템 개발기 (0) | 2023.08.08 |