ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Tnote] 스프링 시큐리티 - @AuthenticationPrincipal 로그인 정보 받기
    T-note 2023. 12. 30. 19:56
    728x90

    이전에 로그인 정보 받아오는 방법

    1. @LoginUser 커스텀 애노테이션을 통해서 로그인 세션 정보를 받기

    2. 헬스지니 프로젝트 에서는 Security Util folder안에 class를 하나 만들어서 불러오는 식으로 사용했다

     

    [ 2번 예시 참고 깃헙 주소 ]

    https://github.com/j9972/health-genie/blob/41ec38415d254a438c07abd1d2e22185104a4ec0/src/main/java/com/example/healthgenie/base/utils/SecurityUtils.java

     

    하지만 매번 현재 로그인 정보를 가져오기 위해서 파라미터로 값을 넣어줘서 받아오거나 currentUser 인증에 대한 추가 코드를 작성하는데 번거로움이 있었고 비로그인 사용자의 경우 null로 넘어오는 정보를 처리하는게 까다로웠습니다.

     

    로그인 사용자의 정보를 매번 서버 요청을 통해 Db로부터 데이터를 가져오는것이 비효율적이였어서 세션에 로그인 유저의 정보를 담아두고 세션이 유지되는 동안 사용할 수 있도록 하려고 합니다.

     

    아래와 같이 Spring Security에서는 해당 정보를 SecurityContextHolder 내부의 SecurityContext에 Authentication 객체로 저장해두고 있는데,

    이를 참조하는 방법은 크게 3가지가 있다.

     

    1. 컨트롤러에서 Principal 객체를 주입받아 사용하는 방법 [ 가장 간단 ]

    2. 컨트롤러에서 @AuthenticationPrincipal 선언해서 엔티티 객체 받아오기 [ 엔티티 모든 필드 참조 가능 ]

    3. 컨트롤러에서 @AuthenticationPrincipal 선언해서 엔티티의 어댑터 객체 받아오기 [ 가장 권장 ]

     

    그러나 1번같은 경우 principal 객체는 받을 수 있는 정보는 name 뿐이다. [ getName() 메소드밖에 Principal 객체를 바인딩해주는게 없다 ]

    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    User user = (User)authentication.getPrincipal();

    그래서 다양한 정보를 받기 위해서 @AuthenticationPrincipal 애노테이션과 어댑터 패턴은 적용해 사용자 세션 정보를 사용할 수 있다.

     

    @AuthenticationPrincipal

    해당 애노테이션은 세션 정보 UserDetails에 접근할 수 있는 애노테이션이다.

    // 예시
    @PostMapping("/trainer")
    public ResponseEntity<Result> addPtProcess(PtProcessRequestDto dto,
                                                   @AuthenticationPrincipal User user)  throws IOException {}

     

    @AuthenticationPrincipal  UserDetails 타입을 가지고 있음 -> UserDetails 타입을 구현한 PrincipalDetails 클래스를 받아 User object를 얻는다

    • userDetails(PrincipalDetails 타입).getUser()

     

    따라서 로그인 세션 정보가 필요한 컨트롤러에서 매번 @AuthenticationPrincipal로 세션 정보를 받아서 사용한다.

    • @AuthenticationPrincipal UserAdapter 타입

     

    이를 통한 장점

    • 로그인 세션 정보를 애노테이션으로 간편하게 받을 수 있다
    • UserDetailsService에서 Return한 객체를 파라미터로 직접 받아 사용할 수 있다.
    • name 뿐만 아니라 다양한 정보를 받을 수 있다
    • 중복 코드를 효율적으로 줄일 수 있다

    [ 참고 ]

    https://velog.io/@jyleedev/AuthenticationPrincipal-로그인-정보-받아오기

Designed by Tistory.