-
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 로그인 사용자의 정보를 받기 위한 타입이 서로 다르기 때문에 사용자의 정보를 받기 위해서는 위 사진과 같이 두 개의 타입에 대하여 분리된 메서드를 구현해야 한다는 단점이 있다.
ㆍ 위와 같은 불편함을 해소하기 위해 두 개의 타입을 통합하는 클래스가 필요하다.
728x90'Framework & Library > Spring Security' 카테고리의 다른 글
Spring Security - 페이스북 로그인 (0) 2021.10.04 Spring Security - 구글 로그인 및 자동 회원가입 (0) 2021.10.04 Spring Security - 구글 로그인 사용자 정보 받기 (0) 2021.10.02 Spring Security - 구글 로그인 준비 (0) 2021.10.02 Spring Security - 권한 처리 (0) 2021.10.01