개발공부/spring security & JWT 강의

[8강] Authentication 객체가 가질 수 있는 2가지 타입

기억지기 개발자 2023. 9. 24. 10:35

로그인 방식은 2가지가 있다.

  1. 일반 로그인
  2. aouth 로그인

 

<< 왼쪽은 oauth 로그인에 접근하기 위한 코드 >>

일반로그인으로 접근하려면 controller에서

@AuthenticationPrincipal PrincipalDetails userDetails

 

<< 오른쪽은 일반 로그인에 접근하기 위한 코드 >>

구글로그인으로 접근하려면 controller에서

@AuthenticationPrincipal OAuth2User oauth

 

=> 일반 로그인은 PrincipalDetails 에서 유저 정보를 가지고 오는 것이고, oauth 로그인에서는 OAuth2User에서 유저의 정보를 가지고 오는 것이다.

 

이처럼 서로 다른 두 로그인 방식에 접근하기 위해서 서로 다른 방식을 사용해야한다,

 

 


🗝️해결

기존 PrincipalDetails 클래스는 1) 아래처럼 UserDetails만 구현하는 상태였지만 2) 추가로 OAuth2User 인터페이스도 함께 구현하여 하나의 클래스에서 2개의 로그인 방식을 모두 처리할 수 있도록 하는 것이다.

// 1) 원래 PrincipalDetails 클래스의 코드

@Data
public class PrincipalDetails implements UserDetails {
    private User user;  

    public PrincipalDetails(User user){
        this.user=user;
    }
// 2) PrincipalDetails 클래스에 OAuth2User 인터페이스를 추가로 구현하도록 한다.

@Data
public class PrincipalDetails implements UserDetails, OAuth2User {
    private User user;  //해당 user의 권한을 리턴하는 곳!!

    public PrincipalDetails(User user){
        this.user=user;
    }

 

 


⭐@AuthenticationPrincipal이란 ?

@AuthenticationPrincipal은 Spring Security에서 제공하는 어노테이션 중 하나로, 현재 사용자(principal)에 대한 정보를 쉽게 가져오고 주입하기 위해 사용됩니다. 이 어노테이션을 컨트롤러 메서드의 매개변수로 사용하면, Spring Security가 제공하는 인증된 사용자(principal) 정보를 간단하게 가져올 수 있습니다.

 

principal은 현재 인증된 사용자를 나타내며, 보통 사용자의 식별자나 사용자 정보를 가리킨다.