Spring Security에서 @AuthenticationPrincipal vs. @RequestHeader 직접 파싱, 무엇이 더 나을까?

Hyeok·2025년 3월 26일

Spring Boot에서 JWT 인증을 사용할 때, 컨트롤러에서 사용자 정보를 가져오는 방법에는 크게 두 가지가 있다.

  1. @AuthenticationPrincipal을 사용해 Spring Security의 SecurityContextHolder에서 가져오기

  2. @RequestHeader에서 직접 토큰을 파싱하여 사용자 정보 추출

둘 다 결국 토큰 검증을 수행하지만, 어떤 방식이 더 효율적일까? 하는 고민이 들었다

@AuthenticationPrincipal 방식

  • 토큰 검증 여부: ✅ Security 필터(JwtAuthenticationFilter)에서 이미 검증됨

  • 코드 가독성: ✅ SecurityContextHolder에서 바로 가져오므로 간결함

  • 보안 유지: ✅ 필터에서 인증 정보를 한 번만 검증 후 재사용

  • 성능: ✅ 캐싱된 인증 정보 사용 가능

Authorization 헤더 직접 파싱 방식

  • 토큰 검증 여부: 🟡 컨트롤러에서 직접 검증해야 함

  • 코드 가독성: ❌ 매 API마다 토큰 파싱 및 검증 로직 필요

  • 보안 유지: ❌ 인증 로직이 분산되어 유지보수가 어려움

  • 성능: ❌ 매번 토큰 파싱 & 검증 수행

어떤 방식이 더 나을까?

👉 대부분의 경우 @AuthenticationPrincipal을 사용하는 것이 더 낫다.

  • Spring Security 필터에서 한 번만 검증하고, 이후 요청에서는 SecurityContextHolder에서 바로 가져와 사용 가능

  • 인증 로직이 컨트롤러에서 분리되어 코드가 깔끔하고 유지보수 쉬움

예외적으로 Authorization 헤더 직접 파싱이 필요한 경우

  1. Spring Security 필터를 거치지 않는 API (예: permitAll 설정된 API)

  2. 단순한 토큰 유효성 검사 API (인증 없이 토큰만 검증할 경우)

결론

  • Spring Security를 사용하고 있다면 @AuthenticationPrincipal을 사용해 통일하는 것이 최선

  • Security 필터를 타지 않는 API에서만 Authorization 헤더를 직접 파싱하도록 한다. (ex. WebSecurityConfigurer에서 특정 API를 permitAll 해버린 경우, JwtAuthenticationFilter를 안 타게 됨)

profile
공부하면서 정리한 블로그입니다. 혹시 잘못된 내용이 있다면 댓글로 알려주시면 큰 도움이 됩니다. 감사합니다!

0개의 댓글