2026.05.06
스프링 기반 애플리케이션의 인증과 인가를 담당하는 보안 프레임워크
주요 특징
build.gradle에 spring security 추가
implementation 'org.springframework.boot:spring-boot-starter-security'
이걸 추가하면 Security FilterChain이 새로 추가됨.

[사용자 요청]
↓
[Security Filter Chain]
↓
[AuthenticationManager]
↓
[AuthenticationProvider]
↓
[UserDetailsService]
↓
[User 저장 및 인증 처리]
Spring Security 는 세션 방식이 기본이지만, JWT 기반 인증을 사용하면 로그인 이후 모든 요청을 커스텀 필터에서 처리
[사용자 요청]
↓
[JwtFilter (커스텀 필터)]
↓
[Security Filter Chain]
↓
[User 저장 및 인증 처리]
커스텀 필터를 활용하면 기본 흐름보다 간단하게 처리가 가능함!
SecurityContextHolder 는 현재 쓰레드에서 인증된 사용자를 저장/조회하는 Spring Security의 핵심 저장소 (즉, 지금 로그인한 사용자가 누구인지를 저장하는 곳)
Authentication auth = SecuritycontextHelder.getcontext().getAuthentication();
커스텀 필터나 컨트롤러, 서비스 어디서든 SecurityContextHolder 를 통해 인증 정보에 접근 가능
SecuritycontextHolder.getContext().setAuthentication(authentication);
| 컴포넌트 | 역할 |
|---|---|
JwtFilter | JWT 토큰 존재/유효성 검사 → 사용자 인증 처리 |
JwtUtil | 토큰 발급, 파싱, 검증 유틸 클래스 |
SecurityContextHolder | 인증 결과 저장소 (스레드 단위) |
Authentication | 인증 객체 (권한 포함) |
UsernamePasswordAuthenticationToken | Spring Security에서 JWT 토큰 방식 사용하기 위함 객체 |
User | Spring Security에서 인증된 사용자 표현 |
http.authorizeHttpRequests()
.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/user/**").hasAnyRole("USER", "ADMIN")
.anyRequest().permitAll();
인증 , 인가 , 로깅 , 트랜잭션 , 예외처리 같이 여러 레이어에 반복적으로 등장하는 처리 (핵심 로직과 분리해서 유지보수성을 높이기 위해 필요)
모든 요청에 대해서 로그를 남기고 싶거나, 로그인된 사용자만 특정 요청을 허용하고 싶거나, 요청이 들어올 때마다 요청 시간을 측정하고 싶다 와 같이 공통된 코드를 모든 컨트롤러와 서비스 로직에 작성을 하게 되면 코드가 중복되고 지저분해지고 가독성이 떨어지며, 유지보수면에서 어려움이 생김. (확장성도 떨어짐.)
| 항목 | Filter | Interceptor | AOP |
|---|---|---|---|
| 처리 위치 | DispatcherServlet 이전 | 컨트롤러 실행 전후 | Spring Bean 메서드 전후 |
| 대상 | 서블릿 요청 (Request/Response) | 핸들러(Controller) | 모든 Bean 메서드 |
| 사용 목적 | 인증, 로깅, CORS 등 | 세션 체크, 권한 검사 | 로깅, 트랜잭션, 예외처리 등 |
| 선언 방법 | Filter 구현체 | HandlerInterceptor 구현체 | @Aspect 클래스 |
흐름을 보면 이렇게 됨.
[사용자 요청]
↓
[Filter] ← 요청 시작 시 로그 출력
↓
[Interceptor] ← Controller 실행 전/후 로그 출력
↓
[AOP] ← Service 메서드 실행 전/후/예외 시점 로그 출력
Authorizetion 헤더에 담긴 JWT 토큰 유효성 검사
로그인이 필요한 페이지 요청 시 세션 또는 인증 여부 검증
Service 계층에서 비즈니스 로직 실행 시간 측정
Spring MVC에서 Controller 진입 직전/후에 동작
JWT 기반 인증이 끝난 후, 인증된 사용자 정보를 활용해서 부가 검증을 수행
요청흐름을 보면,
[사용자 요청]
↓
[JwtFilter]
↓
[SecurityContextHolder에 인증 저장]
↓
[Interceptor]
↓
[인증 사용자 검증]
↓
[Controller]
Filter 처럼 이미 구현이 다 되었는 HandlerInterceptor 를 활용함.
| 메서드 | 설명 |
|---|---|
preHandle | 컨트롤러 실행 전에 동작 (false 반환 시 흐름 중단 가능) |
postHandle 사용 X | 컨트롤러 실행 후, 뷰 렌더링 전 |
afterCompletion | 응답 완료 후, 예외 처리 포함 |
용어 정리
| 용어 | 설명 |
|---|---|
| Aspect⭐️ | 공통 관심사를 담는 모듈 (ex. 로깅, 트랜잭션, 권한 체크) |
| JoinPoint | 메서드 실행 지점 |
| Advice⭐️ | 실행 시점에 따라 작동하는 AOP 로직 (@Before, @After, @Around) |
| Pointcut⭐️ | 어떤 JoinPoint에 Advice를 적용할지 정의 (표현식 기반) |
| Weaving
개발자가 다루지 않음 | Advice를 적용하는 과정 (직접 Weaving을 다룰 일은 없다. 스프링이 해줌) |
AOP 팁
어떤 것을 :PointCut을 통해서 대상을 지정
언제 :Advice를 통해서 실행되는 시점을 지정
어떻게 :Aspect에 정의한 메서드를 통해서 어떻게 할 것인지 지정
| 어노테이션 | 설명 |
|---|---|
@Aspect | Aspect 클래스임을 선언 |
@Around | 메서드 실행 전후 제어 (가장 유연) |
@Before | 메서드 실행 전에 수행 |
@AfterReturning | 정상 반환 후 수행 |
@AfterThrowing | 예외 발생 시 수행 |
@After | 정상/예외 관계없이 실행 후 수행 |