심화 Spring

정예진·4일 전

Spring

목록 보기
17/19

2026.05.06

🧠 오늘 배운 것

Spring Security란

스프링 기반 애플리케이션의 인증과 인가를 담당하는 보안 프레임워크

주요 특징

  • Filter 기반 보안 처리
  • 인증/인가 로직을 개발자가 직접 구현하지 않아도 되는 구조 제공
  • 다양한 인증 방식을 플러그인 형태로 확장 가능

Spring Security 적용

build.gradle에 spring security 추가

implementation 'org.springframework.boot:spring-boot-starter-security'

이걸 추가하면 Security FilterChain이 새로 추가됨.

Spring Security 기본 흐름

[사용자 요청]

[Security Filter Chain]

[AuthenticationManager]

[AuthenticationProvider]

[UserDetailsService]

[User 저장 및 인증 처리]

JWT 인증 방식 도입 시 변경 사항

Spring Security 는 세션 방식이 기본이지만, JWT 기반 인증을 사용하면 로그인 이후 모든 요청을 커스텀 필터에서 처리

[사용자 요청]

[JwtFilter (커스텀 필터)]

[Security Filter Chain]

[User 저장 및 인증 처리]

커스텀 필터를 활용하면 기본 흐름보다 간단하게 처리가 가능함!

SecurityContextHolder란

SecurityContextHolder 는 현재 쓰레드에서 인증된 사용자를 저장/조회하는 Spring Security의 핵심 저장소 (즉, 지금 로그인한 사용자가 누구인지를 저장하는 곳)

인증 정보 저장 위치

Authentication auth = SecuritycontextHelder.getcontext().getAuthentication();

커스텀 필터나 컨트롤러, 서비스 어디서든 SecurityContextHolder 를 통해 인증 정보에 접근 가능

수동 저장 예시 (JWT 사용 시)

SecuritycontextHolder.getContext().setAuthentication(authentication);

핵심 컴포넌트 정리 (JWT 인증 흐름 기준)

컴포넌트역할
JwtFilterJWT 토큰 존재/유효성 검사 → 사용자 인증 처리
JwtUtil토큰 발급, 파싱, 검증 유틸 클래스
SecurityContextHolder인증 결과 저장소 (스레드 단위)
Authentication인증 객체 (권한 포함)
UsernamePasswordAuthenticationTokenSpring Security에서 JWT 토큰 방식 사용하기 위함 객체
UserSpring Security에서 인증된 사용자 표현

인가 방법

1) URL 기반 설정 (권장 : 관리 편의성)

http.authorizeHttpRequests()
.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/user/**").hasAnyRole("USER", "ADMIN")
.anyRequest().permitAll();

공통 관심사란

인증 , 인가 , 로깅 , 트랜잭션 , 예외처리 같이 여러 레이어에 반복적으로 등장하는 처리 (핵심 로직과 분리해서 유지보수성을 높이기 위해 필요)

Filter, Interceptor, AOP가 필요한 이유

모든 요청에 대해서 로그를 남기고 싶거나, 로그인된 사용자만 특정 요청을 허용하고 싶거나, 요청이 들어올 때마다 요청 시간을 측정하고 싶다 와 같이 공통된 코드를 모든 컨트롤러와 서비스 로직에 작성을 하게 되면 코드가 중복되고 지저분해지고 가독성이 떨어지며, 유지보수면에서 어려움이 생김. (확장성도 떨어짐.)

Filter / Interceptor, AOP 비교

항목FilterInterceptorAOP
처리 위치DispatcherServlet 이전컨트롤러 실행 전후Spring Bean 메서드 전후
대상서블릿 요청 (Request/Response)핸들러(Controller)모든 Bean 메서드
사용 목적인증, 로깅, CORS 등세션 체크, 권한 검사로깅, 트랜잭션, 예외처리 등
선언 방법Filter 구현체HandlerInterceptor 구현체@Aspect 클래스

흐름을 보면 이렇게 됨.

[사용자 요청]

[Filter] ← 요청 시작 시 로그 출력

[Interceptor] ← Controller 실행 전/후 로그 출력

[AOP] ← Service 메서드 실행 전/후/예외 시점 로그 출력

Filter - 인증 토큰 처리 (ex. JWT)

Authorizetion 헤더에 담긴 JWT 토큰 유효성 검사

  • 모든 요청의 가장 앞에서 작동
  • Spring DispatcherServlet 이전에 실행되어야함.
  • 인증 실패 시 컨트롤러까지 가지 않도록 빠르게 차단 가능

Interceptor - 로그인 여부 체크

로그인이 필요한 페이지 요청 시 세션 또는 인증 여부 검증

  • 컨트롤러 실행 직전에 처리 가능
  • 사용자별 세션, 권한 확인 로직 작성에 용이
  • 요청 URL 기반으로 유연하게 경로별 적용 가능

AOP - 실행 시간 측정 / 로깅

Service 계층에서 비즈니스 로직 실행 시간 측정

  • 특정 메서드 호출 전후에만 부가 기능을 넣고 싶을 때 유리
  • 핵심 로직은 건드리지 않고 공통 처리만 분리 가능
  • 다양한 메서드에 어노테이션으로 간편하게 확장 가능

Interceptor란

Spring MVC에서 Controller 진입 직전/후에 동작

JWT 기반 인증이 끝난 후, 인증된 사용자 정보를 활용해서 부가 검증을 수행

요청흐름을 보면,

[사용자 요청]

[JwtFilter]

[SecurityContextHolder에 인증 저장]

[Interceptor]

[인증 사용자 검증]

[Controller]

Filter 처럼 이미 구현이 다 되었는 HandlerInterceptor 를 활용함.

HandlerInterceptor 메서드

메서드설명
preHandle컨트롤러 실행 전에 동작 (false 반환 시 흐름 중단 가능)
postHandle 사용 X컨트롤러 실행 후, 뷰 렌더링 전
afterCompletion응답 완료 후, 예외 처리 포함

AOP

용어 정리

용어설명
Aspect⭐️공통 관심사를 담는 모듈 (ex. 로깅, 트랜잭션, 권한 체크)
JoinPoint메서드 실행 지점
Advice⭐️실행 시점에 따라 작동하는 AOP 로직 (@Before, @After, @Around)
Pointcut⭐️어떤 JoinPoint에 Advice를 적용할지 정의 (표현식 기반)

| Weaving
개발자가 다루지 않음
| Advice를 적용하는 과정 (직접 Weaving을 다룰 일은 없다. 스프링이 해줌) |

AOP 팁
어떤 것을 : PointCut 을 통해서 대상을 지정
언제 : Advice 를 통해서 실행되는 시점을 지정
어떻게 : Aspect 에 정의한 메서드를 통해서 어떻게 할 것인지 지정

주요 AOP 어노테이션

어노테이션설명
@AspectAspect 클래스임을 선언
@Around메서드 실행 전후 제어 (가장 유연)
@Before메서드 실행 전에 수행
@AfterReturning정상 반환 후 수행
@AfterThrowing예외 발생 시 수행
@After정상/예외 관계없이 실행 후 수행

0개의 댓글