ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Security - Authentication 객체가 가질 수 있는 2가지 타입
    Framework & Library/Spring Security 2021. 10. 3. 15:51

    Authentication 객체가 가질 수 있는 2가지 타입

    로그인 진행이 완료되면 기존의 Sesson 공간에 Security Session 공간이 만들어진다.

    Security Session에 들어갈 수 있는 정보는 Authentication 객체여야 한다.

    또한 Authentication 객체가 가질 수 있는 타입은 UserDetails와 OAuth2User 2가지 타입이다.

    UserDetails와 OAuth2User 2가지 타입을 통해서 로그인을 한 사용자의 정보를 얻을 수 있다.


    일반 로그인 사용자 정보 받기

    IndexController 클래스 수정
    @GetMapping("/test/login")
    @ResponseBody
    /* 일반 로그인 사용자에 대한 정보 받기 */
    public String testLogin(Authentication authentication, @AuthenticationPrincipal PrincipalDetails userDetails) {
        System.out.println("====================/test/login====================");
    
        /* 방법1 : Authentication을 DI해서 다운캐스팅 과정을 거쳐서 유저 정보를 받음 */
        PrincipalDetails principalDetails = (PrincipalDetails) authentication.getPrincipal();
        System.out.println(principalDetails.getUser());
    
        /* 방법2 : "@AuthenticationPrincipal" 애너테이션을 통해서 유저 정보를 받음 */
        System.out.println(userDetails.getUser());
    
        return "세션 정보 확인";
    }

    ㆍ IndexController 클래스에 위 메서드를 추가한다.

    ㆍ testLogin() 메서드는 일반 로그인을 수행했을 때 사용자의 정보를 받기 위한 메서드이다.

    ㆍ 일반 로그인 사용자의 정보를 받기 위한 2가지 방법이 존재한다.

    ㆍ 첫 번째는 Authentication 객체를 DI 해서 PrincipalDetails 객체로 다운 캐스팅 과정을 거쳐서 받는 방법이 있다.

    ㆍ 두 번째는 애너테이션을 활용한 방법인데, @AuthenticationPrincipal 애너테이션을 선언하고 PrincipalDetails 객체를 통해 사용자 정보를 받는 방법이다.

     

    일반 로그인 사용자 정보 확인

     

    ㆍ 서버를 실행시키고 일반 로그인을 수행한 후 /test/login 주소에 접속한다.

    콘솔 창을 확인해보면 두 가지 방법 모두 똑같은 사용자의 정보를 출력하고 있다는 것을 확인할 수 있다.


    OAuth 로그인 사용자 정보 받기

    IndexController 클래스 수정
    @GetMapping("/test/oauth/login")
    @ResponseBody
    /* OAuth 로그인 사용자에 대한 정보 받기 */
    public String testOauthLogin(Authentication authentication, @AuthenticationPrincipal OAuth2User oAuth) {
        System.out.println("====================/test/oauth/login====================");
    
        /* 방법1 : Authentication을 DI해서 다운캐스팅 과정을 거쳐서 유저 정보를 받음 */
        OAuth2User oAuth2User = (OAuth2User) authentication.getPrincipal();
        System.out.println(oAuth2User.getAttributes());
    
        /* 방법2 : "@AuthenticationPrincipal" 애너테이션을 통해서 유저 정보를 받음 */
        System.out.println(oAuth.getAttributes());
    
        return "OAuth 세션 정보 확인";
    }

    ㆍ IndexController 클래스에 위 메서드를 추가한다.

    ㆍ testOauthLogin() 메서드는 OAuth 로그인을 수행했을 때 사용자의 정보를 받기 위한 메서드이다.

    OAuth 로그인 사용자의 정보를 받기 위해서는 마찬가지로  2가지 방법이 존재한다.

    ㆍ 첫 번째는 Authentication 객체를 DI 해서 OAuth2User 객체로 다운 캐스팅 과정을 거쳐서 받는 방법이다.

    ㆍ 두 번째는 애너테이션을 활용한 방법인데, @AuthenticationPrincipal 애너테이션을 선언하고 OAuth2User 객체를 통해 사용자 정보를 받는 방법이다.

     

    OAuth로그인 사용자 정보 확인

     

    ㆍ 서버를 실행시키고 일반 로그인을 수행한 후 /test/oauth/login 주소에 접속한다.

     콘솔 창을 확인해보면 두 가지 방법 모두 똑같은 사용자의 정보를 출력하고 있다는 것을 확인할 수 있다.


    문제점

    일반 로그인 사용자의 정보와 OAuth 로그인 사용자의 정보를 받기 위한 타입이 서로 다르기 때문에 사용자의 정보를 받기 위해서는 위 사진과 같이 두 개의 타입에 대하여 분리된 메서드를 구현해야 한다는 단점이 있다.

    위와 같은 불편함을 해소하기 위해 두 개의 타입을 통합하는 클래스가 필요하다.


     

    GitHub - qlsdud0604/spring-security-basic: 스프링 시큐리티의 기초를 학습하는 공간

    스프링 시큐리티의 기초를 학습하는 공간. Contribute to qlsdud0604/spring-security-basic development by creating an account on GitHub.

    github.com

     

    728x90

    댓글

Designed by Tistory.