SecurityContextHolder와 @Authenticationprincipal 차이

박양원·2024년 1월 5일

Security

목록 보기
1/3

Topic

Handler Methods에서 사용자 인증 정보를 가져오고 싶은 경우 사용하는
SecurityContextHolder@Authenticationprincipal 차이

Controller마다 사용자 인증 정보 가져오는 방식이 다름

레거시 코드 리팩토링을 진행하던 도중 프로젝트에서 Controller의 Handler Methods마다 사용자 인증 정보를 가져오는 방식이 다르다는 것을 알게 되었다.

참고 링크 - 레거시 코드 리팩토링을 통한 조회 API 성능 개선

현재 프로젝트에서 사용하고 있는 방식은 총 2가지다.

  • SecurityContextHolder에 접근하여 Authentication을 가져옴
  • @Authenticationprincipal을 활용하여 가져옴

단순히 Controller에서 회원 번호를 가져오는 것 이외에는 별다른 기능적 차이가 없었기에 이를 하나로 통일하여 전반적인 코드 컨벤션을 갖추고 싶었졌다.
하지만 단순히 @Authenticationprincipal로 통일을 하려고 하니 두 방식의 장단점 및 차이점을 잘 알지 못하였기에 공부를 하고 적용하고자 마음을 먹게 되었으며 최종적으로 이 포스팅을 작성하게 되었다.

SecurityContextHolder

  • 현재 실행중인 스레드에 대한 보안 컨텍스트(SecurityContext)를 저장/관리하는 Spring Security의 핵심 컴포넌트로 기본적으로 ThreadLocal 기반으로 동작
  • SecurityContext가 포함하고 있는 Authentication 객체에 인증된 사용자의 세부 정보를 담음
  • Application 어느 곳에서든 현재 인증된 사용자 정보에 접근할 수 있음

@Authenticationprincipal

  • Spring Security가 제공하는 Annotation으로 Handler Methods의 파라미터에 사용됨
  • SecurityContextHolder와 달리 Authentication 객체가 아닌 UserDetails 인터페이스를 구현한 구현체에 직접 접근할 수 있게 해줌
  • UserDetails를 구현한 구현체 또한 Spring Security를 통해 관리되며 접근 가능함

핵심 차이 및 결론

SecurityContextHolder는 Application 어느 곳에서나 사용자 인증 정보를 가져오고 싶을 때 사용하고 @AuthenticationPrincipal Annotation은 특정적이게 Handler Methods에서 사용자 인증 정보를 직접적으로 주입받기 위해 사용되는 방법이다.
내가 개선하고자 한 부분은 Handler Methods에서의 공통된 사용자 인증 정보 접근 방식이었으므로 둘 중 보다 간결하게 사용자 인증 정보를 가져올 수 있는 @Authentication Annotation 방식을 채택하는 것이 더욱 효과적이라고 느꼈다.
따라서 최종적으로 해당 방식을 채택하였고 Handler Methods 마다의 공통화된 사용자 인증 정보 접근 로직을 얻을 수 있었다.

0개의 댓글